子查询介绍
- 概念:SQL语句中镶嵌
SELECT
语句,称为镶嵌查询,又称子查询。
1 | SELECT * FROM t1 WHERE Column1 = (SELECT column1 FROM t2) |
子查询外部的语句可以是 INSERT/UPDATE/DELETE/SELECT 的任何一个
根据子查询结果的不同,分为:
- 标量子查询(子查询结果为单个值)
- 列子查询(子查询的结果为一列)
- 行子查询(子查询结果为一行)
- 表子查询(子查询结果为多行多列)
标量子查询
子查询返回的结果是单个值(数字,字符串,日期等),最简单的形式,这种子查询成为标量子查询。
常用的操作符:= <> > >= < <=
示例:
题1:查询 “销售部” 的所有员工信息
1 | select * from emp where dept_id =(select id from dept where name = '销售部'); |
答:
分两步做
a.查询 “销售部” 部门ID
1 | select id from dept where name = '销售部'; |
查询结果是:4 (单个值)
b.根据销售部部门ID,查询员工信息
1 | select * from emp where dept_id = 4; |
1 | select * from emp where dept_id =(select id from dept where name = '销售部'); |
这两条查询的结果是一样的
列子查询
列子查询概念
子查询返回的结果是一列(可以是多行),这种子查询称为列子查询。
常用操作符
操作符 | 描述 |
---|---|
IN | 在指定的集合范围之内,多选一 |
NOT IN | 不在指定的集合范围之内 |
ANY | 子查询返回列表中,有任意一个满足即可 |
SOME | 与ANY等同,使用SOME的地方都可以使用ANY |
ALL | 子查询返回列表的所有值都必须满足 |
示例:
题1:查询 “销售部” 和 “市场部” 的所有员工信息
1 | select * from emp where dept_id in (select id from dept where name = '销售部' or name = '市场部'); |
答: 步骤
a. 查询 “销售部” 和 “市场部” 的部门ID
1 | select id from dept where name = '销售部' or name = '市场部'; |
结果是 2,4
b. 根据部门ID ,查询员工信息
1 | select * from emp where dept_id in (2,4); |
1 | select * from emp where dept_id in (select id from dept where name = '销售部' or name = '市场部'); |
这两条查询的结果是一样的
题2 :查询比 财务部 所有人工资都高的员工信息
答:步骤
a. 查询所有 财务部 人员工资
1 | select id from dept where name = '财务部'; |
1 | select salary from emp where dept_id = (select id from dept where name = '财务部'); |
b. 比 财务部 所有人工资都高的员工信息
换言之:必须大于财务部 人员中最高的工资才行
1 | select * from emp where salary > all (select salary from emp where dept_id = (select id from dept where name = '财务部')) |
题3:查询比研发部其中任意一个人工资高的员工信息
答:步骤
a. 查询研发部所有人工资
1 | select salary from emp where dept_id = (select id from dept where name = '研发部'); |
b. 比研发部其中任意一个人工资高的员工信息
换言之:比研发部人员中最低工资高就可以
1 | select * from emp where salary > some (select salary from emp where dept_id = (select id from dept where name = '研发部')); |
注意:ANY 和 SOME 是一样的