MySQL的多表查询

查询语法
select 列名列表 from 表名列表 where 查询条件;
基础准备:
创建表
   1.创建部门表
   CREATE TABLE dept(
		id INT PRIMARY KEY AUTO_INCREMENT,
		NAME VARCHAR(20)
	);
	INSERT INTO dept (NAME) VALUES ('开发部'),('市场部'),('财务部');
   2.创建员工表
   CREATE TABLE emp (
		id INT PRIMARY KEY AUTO_INCREMENT,
		NAME VARCHAR(10),
		gender CHAR(1), -- 性别
		salary DOUBLE, -- 工资
		join_date DATE, -- 入职日期
		dept_id INT,
		FOREIGN KEY (dept_id) REFERENCES dept(id) -- 外键,关联部门表(部门表的主键)
	);
	INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('孙悟空','男',7200,'2013-02-24',1);
	INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('猪八戒','男',3600,'2010-12-02',2);
	INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('唐僧','男',9000,'2008-08-08',2);
	INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('白骨精','女',5000,'2015-10-07',3);
	INSERT INTO emp(NAME,gender,salary,join_date,dept_id) VALUES('蜘蛛精','女',4500,'2011-03-14',1);
#笛卡尔集
 	*有两个A,B集合,取这两个集合的所有组成情况
#多表查询(要完成多表查询,就需要消除笛卡尔集中的无用数据)
	多表查询的分类:
	  	1.内连接查询
	  		*隐式内连接:使用where条件消除无用数据
	  		  *例:
	  		  --查询所有员工信息和对应的部门信息
	  		  select * from emp,dept where emp.dept_id=dept.id;
	  		*显式内连接
	  		   *语法:select 字段列表  from 表1 [inner] join 表2 on 查询条件
	  		   *例:
	  		   -- 查询所有员工信息和对应的部门信息
               select * from emp inner join dept on emp.dept_id=dept.id
               *内连接查询关注:
               	 1.从哪些表中获取数据
               	 2.条件是什么
               	 3.查询哪些字段
         2.外连接查询:
         		1.左外连接
         			*语法: select 字段列表  from 表1 left [outer] join 表2
         			on 查询条件;
         			*例:
         			--查询所有员工信息,以及对应部门信息,如果无部门信息,则不显示部门信息为null
         			select t1.* ,t2.* from emp t1 left join dept t2 on t1.dept_id=t2.id;
         		2.右外连接
         			*语法:select 字段列表 from 表1 right [outer] join 表2 on 查询条件:
         			*例
         			--查询所有部门信息,以及对应的员工信息,如果无员工信息,则显示null
         			select t2.*,t1.* from emp t1 right join dept t2 on t1.dept_id=t2.id;
         3.子查询
          	*概念:查询中的嵌套查询,称嵌套查询为子查询。
          	*子查询的不同情况
          			1.子查询的结果为单行单列。
          					*子查询可以作为条件,使用运算符进行判断。运算符:> >= < <= = 
          					*例
          					-- 查询员工工资小与平均工资的人
          					select * from emp where emp.salary<(select AVG(salary) from emp);
                    2.子查询的结果为多行单列。
                     		*子查询可以作为条件,使用运算符in来判断
                     		*例:
                     		-- 查询财务部和市场部所有的员工信息
                     		select id from dept where name='财务部' or name='市场部';
                     		select * from emp where dept_id=3 or dept_id=2;
                     		--利用子查询
                     		select * from emp where dept_id in (select id from dept where name='财务部' or name='市场部';);
                    3.子查询的结果为多行多列
            				*子查询的可以作为一张虚拟表参与查询
            				--查询员工入职日期是2011-11-11日之后的员工信息和部门信息
            				*子查询
            				select t1.*,t2.* form dept t1,(select * from emp where emp.joindate> '2011-11-11') t2 where t1.id=t2.dept_id;
            				*内连接查询
            				select * from emp t1 left join dept t2 on t1.dept_id=t2.id and t1.joindate >'2011-11-11';