多表查询
一、概述
从多张表中查询需要的数据。
语法:select 列名列表 from 表名列表 where 条件;
分类:内连接查询,外连接查询,子查询。
笛卡尔积:
有两个集合A,B,取这两个集合的所有组成情况。
要完成多表查询,需要消除无用的数据。
二、内连接查询(交集)
1.隐式内连接
select * form emp,dept where emp.dept_id = dept.id;
一般情况下,我们只需要查询部分字段,把*替换成相应的字段列名称即可。emp.name,dept.name,简便书写可以给表起别名:select t1.name,t2.name from emp t1,dept t2 where t1.dept_id=t2.id;
2.显式内连接
语法:select 字段列表 from 表名1 [inner] join 表名2 on 条件;(inner可以省略)
select * from emp inner jofin dept on emp.'dept_id'=dept.'id';
内连接查询
从哪些表中查
条件是什么
查询哪些字段
三、外连接查询
1.左外连接(左表以及两表交集)
语法:select 字段列表 from 表1 left [outer] join 表2 on 条件;
查询所有员工信息,如果员工有部门,则查询部门名称,没有部门,则不显示部门。
select t1.*,t2.name from emp t1 left join dept t2 on t1.dept_id=t2.id;
2.右外连接(右表以及两表交集)
语法:select 字段列表 from 表1 right [outer] join 表2 on 条件;
查询所有员工信息,如果员工有部门,则查询部门名称,没有部门,则不显示部门。
select t1.*,t2.name from emp t1 right join dept t2 on t1.dept_id=t2.id;
四、子查询
概念:查询中嵌套查询,称嵌套查询为子查询。
查询工资最高的员工信息。
select * from emp where emp.salry=(select max(salary) from emp);
子查询的不同种情况
-
子查询的结果是单行单列的
子查询可以作为条件,使用运算符去判断> < >= <= =。
查询小于平均工资的人:select * from emp where emp.salary<(select avg(salary) from emp); -
子查询的结果是多行单列的
子查询可以作为条件,使用运算符in判断(查询结果为集合)
查询财务部和市场部所有员工信息:select * from emp where dept_id in(select id from dept where name=“财务部” or name=“市场部”); -
子查询的结果是多行多列的
子查询可以作为一张虚拟表。可以进行表的查询。
查询员工入职日期是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”;
1964

被折叠的 条评论
为什么被折叠?



