多表查询

内连接,外连接,自连接,隐式/显示内/外连接这些开发过程中经常使用就不说了。

一、联合查询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;

 

posted @ 2024-03-13 23:11  lucsa  阅读(4)  评论(0编辑  收藏  举报