多表查询
内连接,外连接,自连接,隐式/显示内/外连接这些开发过程中经常使用就不说了。
一、联合查询union
SELECT 字段列表 FROM 表A ... UNION [ALL] SELECT 字段列表 FROM 表B ...
UNION ALL 会有重复结果,UNION 不会
联合查询比使用or效率高,不会使索引失效
二、子查询
标量子查询
子查询返回的结果是单个值(数字、字符串、日期等)。
常用操作符:- < > > >= < <=
#查询研发部的员工 SELECT * FROM emp WHERE dept_id = (SELECT id FROM dept WHERE name='研发部') #查询工资比李慕婉高的员工 SELECT * FROM emp WHERE salary >(SELECT salary FROM emp WHERE name='李慕婉')
列子查询
返回的结果是一列(可以是多行)。
常用操作符:
操作符 | 描述 |
---|---|
IN | 在指定的集合范围内,多选一 |
NOT IN | 不在指定的集合范围内 |
ANY | 子查询返回列表中,有任意一个满足即可 |
SOME | 与ANY等同,使用SOME的地方都可以使用ANY |
ALL | 子查询返回列表的所有值都必须满足 |
#查询研发部和市场部的员工 SELECT * FROM emp WHERE dept_id in (SELECT id FROM dept WHERE name in ('研发部','市场部')) #查询比财务部所有人工资都高的员工 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='研发部'))
行子查询
返回的结果是一行(可以是多列)。
常用操作符:=, <, >, IN, NOT IN
#查询与李慕婉的薪资和入职时间的员工信息 select * from emp where (salary, entrydate) = (select salary, entrydate from emp where name = '李慕婉') and name<>'李慕婉';
表子查询
返回的结果是多行多列
常用操作符:IN
#查询与李慕婉,司徒南的入职时间和薪资相同的员工 select * from emp where (entrydate, salary) in (select entrydate, salary from emp where name = '李慕婉' or name = '司徒南') and name not in ('李慕婉','司徒南'); #查询入职日期是2021-01-01之后的员工,及其部门信息 select e.*, d.* from (select * from emp where entrydate > '2021-01-01') as e left join dept as d on e.dept_id = d.id;