内连接查询:
定义:只查询交集
隐式内连接:
语法:select 查询字段 from 表1,表2 where 查询条件;
-- 多表查询之隐式内连接
select emp.name,dept.name from emp,dept where emp.dept_id=dept.id;
显示内连接:
语法:select 查询字段 from 表1 inner join 表2 on 查询条件;
-- 多表查询之显式内连接
select e.name,d.name from emp e inner join dept d on e.dept_id = d.id;
外连接查询:
左外连接查询:查询左表全部以及交集部分;
语法:select 查询字段 from 表1 left outer join 表2 on 查询条件;
-- 多表查询之左外连接
select e.name,d.name from emp e left join dept d on d.id = e.dept_id;
右外连接查询:查询右表全部以及交集部分;
语法:select 查询字段 from 表1 right outer join 表2 on 查询条件;
-- 多表查询之右外连接
select e.name,d.name from emp e right outer join dept d on d.id = e.dept_id;
自连接查询:
定义:自连接查询其实就相当于把自身一个表通过起不同的别名当做不同的表,再进行内连接或外连接查询;
-- 自连接之内连接
select a.*,b.name as '领导' from emp a , emp b where a.managerid = b.id;
-- 自连接之右外连接
select a.*,b.name as '领导' from emp a right join emp b on a.managerid=b.id;
联合查询:
定义:把几次查询的结果合并到一起,要求几次查询的结果字段要一模一样,否则无法合并;
关键字:union all不去重直接合并,union去重后合并;
-- 联合查询
select * from emp where salary < 10000
union all
select * from emp where age > 50; #union all直接合并,不去重;
select * from emp where salary < 10000
union
select * from emp where age > 50; #union去重后合并;
子查询:
定义:把一次查询的结果作为其它查询的条件;
关键字:in,all,any
-- 子查询
-- 查询研发部的所有员工信息
select *
from emp
where dept_id = (select id from dept where name = '研发部');
-- 查询入职日期在韦一笑之后的所有员工信息
select *
from emp
where entrydate > (select emp.entrydate from emp where name = '韦一笑');
-- 查询研发部和总经办所有员工的信息
select *
from emp
where dept_id in (select id from dept where name = '研发部' or name = '总经办');
-- 查询比总经办所有人工资都高的员工信息
select *
from emp
where salary > all (select salary from emp where dept_id = (select id from dept where name = '总经办'));
-- 查询比总经办任意一人工资高的员工信息
select *
from emp
where salary > any (select salary from emp where dept_id = (select id from dept where name = '总经办'));
-- 查询与张无忌薪资和领导相同的员工信息
select *
from emp
where (salary, managerid) = (select salary, managerid from emp where name = '张无忌');
-- 查询与张无忌和韦一笑职位、薪资相同的员工的信息
select *
from emp
where (job, salary) in (select job, salary from emp where name = '张无忌' or name = '韦一笑');
-- 查询入职日期在2004-01-01之后的员工信息及其部门
select e.*, d.name
from (select * from emp where entrydate > '2004-01-01') e
left outer join dept d on e.dept_id = d.id;