多表查询
查询语法:
select 列名列表
from 表名列表
where ....
(一)笛卡尔积
select * from emp,dept;
(二)多表查询的分类
①内连接查询
1.隐式内连接查询
查询所有的员工信息以及对应的部门信息,使用where 消除无用数据的就是隐式内连接查询
select * from dept,emp WHERE dept.id=emp.dept_id;
查询emp表中的name 以及 dept表中的name
select emp.`NAME`, dept.`NAME` from dept,emp where dept.id=emp.dept_id;
2.显式内连接查询
select 字段列表 from 表1 inner join 表2 on 条件
- 从哪些表中查询数据
- 条件是什么
- 查询哪些字段
- 条件是什么
②外连接查询
1.左外链接查询
select * from 表1 left join 表2 on 条件;
查询的是左表所有数据以及其交集部分
左表指的是相对于left join 而言 左边的那个表
SELECT * FROM dept t2 left JOIN emp t1 ON t1.`dept_id` = t2.`id`;
2.右外连接查询
select * from 表1 right join 表2 on 条件;
查询的是右表所有数据以及其交集部分
右表指的是相对于right join而言右边的那张表
SELECT * FROM dept t2 RIGHT JOIN emp t1 ON t1.`dept_id` = t2.`id`;
③子查询
概念:查询中嵌套查询,称嵌套查询为子查询
SELECT * FROM `emp`
查询最高工资是多少
select max(salary) from emp;
查询员工信息,并且工资等于9000的
select * from emp where salary=9000;
其实这样一个查询一条语句就可以完成
select * from emp where salary=(select max(salary) from emp);
④子查询的不同情况
1.子查询结果是单行单列的
子查询可以作为条件,使用运算符去判断 运算符: > >= < <= =
查询员工工资小于平均工资的人
select * from emp where 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 emp where emp.join_date>'2011-11-11';
select * from dept d inner join (select * from emp where emp.join_date>'2011-11-11') e on e.dept_id=d.id;