MySQL-mysql的多表查询
笛卡尔积:
有两个集合a,b,取这两个集合的所有组成情况
要完成多表查询,需要消除笛卡尔积中无用的数据
如:下面两个表就是笛卡尔积的联结,但是有些是无用的数据,如孙悟空对应的dept_id为1,但是却将dept表中的id为2和3的也列出来了
多表查询的分类:
1.内连接查询
Ⅰ.隐式内连接:select 字段列表 from 表名1,表名2 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;
Ⅲ.内连接查询注意的问题:
①从哪些表中查数据
②条件是什么(多表之间如何对应)
③查询哪些字段
2.外连接查询
如果添加一个员工字段,小白龙,性别为男,工资为3000,但是没有写他的员工id
则使用内连接查询所有员工信息,如果员工有部门,则查询部门名称,没有部门则不显示部门信息的结果为:
与想要查询的结果不符,少了小白龙的字段,因此,需要用到外连接来保证即使联结的两个表中有字段没有相互对应也要显示该字段
Ⅰ.左外连接:select 字段列表 from 表名1 left join 表名2 on 条件
查询左表的所有数据以及其交集部分
如:查询所有员工信息,如果员工有部门,则查询部门名称,没有部门则不显示部门信息 select * from emp left join dept on emp.dept_id = dept.id;
虽然跟右表没有什么关联,但是要显示左表所有的字段所以小白龙的字段会显示
Ⅱ.右外连接:select 字段列表 from 表名1 rightjoin 表名2 on 条件
查询右表的所有数据以及其交集部分
如:查询所有员工信息,如果员工有部门,则查询部门名称,没有部门则不显示部门信息 select * from emp right join dept on emp.dept_id = dept.id;
右查询是查询右表所有数据以及其交集部分,小白龙不属于右表,也不是和右表交集的,所以不会显示小白龙字段
3.子查询
查询最高的员工工资信息为多少?
分两步:
1.最高的工资为多少? 9000
select Max(salary) from emp;
2.员工工资为9000的员工信息为多少? 唐僧的字段信息
select * from emp where emp.salary=9000;
可以把上面两步用子查询合成一步
select * from emp where emp.salary=(select Max(salary) from emp);
子查询是单行单列:
1.子查询是单行单列:子查询可以作为条件,使用运算符去判断 运算符:>、<、>=、<=、=
查询员工工资小于平均工资的人
select * from emp where emp.salary<(select AVG(salary) from emp);
2.子查询是多行单列:子查询可以作为条件,使用运算符去判断 运算符:in
查询财务部和市场部的所有员工信息
select * from emp where emp.dept_id in (select id from dept where name = '财务部' or name='市场部');
3.子查询是多行多列:子查询可以作为一张虚拟表参与查询
查询员工入职日期是在2011-11-11之后的的员工信息和部门信息
--子查询
select * from dept t1,(select * from emp where emp.join_date > '2011-11-11') t2 where t1.id = t2.dept_id;
--也可以用内联查询
select * from emp t1, dept t2 where t1.dept_id = t2.id and t1.'join_date'>'2011-11-11';