概念
SQL语句中嵌套select语句
子查询的外部语句可以是insert/update/delete/select的任何一个.
也即是说, DML和DQL都可以子查询
根据子查询的结果不同, 分为
标量子查询
常用的操作符是: > < >= <= <>
结果为单个值
例如:
查询销售部的所有员工的信息
select * from emp where dept_id =
(select id from dept where name = '销售部');
这就是标量子查询
列子查询
结果是一列(是一个字段的一些值, 换言之, 多个标量)
先看几个操作符
操作符 | 说明 |
---|---|
in | 在指定集合范围之内, 多选一 |
not in | 不在指定的范围内 |
any/some | 子查询返回列表中, 有任意一个满足即可 |
all | 子查询返回列表必须都满足 |
例如:
查询销售部和市场部的所有员工信息
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 > some
(select salary from emp where dept_id =
(select id from dept where name = '研发部') );
行子查询
结果是一行(多个字段, 换言之, 单个标量组)
常用的操作符:= <> in not in
例如:
查询和小白的工资和所属领导相同的员工信息
select * from emp where (salary , managerid) =
(select salary , managerid from emp where name = '小白');
表子查询
结果是多行多列(标量组不止一个)
常用的操作符: in
例如:
查询和小白, 小黑的职位和薪资相同的员工的信息
select * from emp where (job, salary) in
(select job , salary from emp where name = '小白' or name = '小黑');
再例如:
查询入职时间是’2001-01-06’之后的员工信息, 及其部门信息
select e.* , d.* from
(select * from emp where entrydate > '2001-01-06' ) e
left outer join
dept d
on e.dept_id = d.id ;