# 子查询介绍
- 概念:SQL语句中嵌套SELECT语句,称谓嵌套查询,又称子查询。
例如:
SELECT * FROM t1 WHERE column1 = ( SELECT column1 FROM t2);
子查询外部的语句可以是 INSERT / UPDATE / DELETE / SELECT 的任何一个
- 根据子查询结果不同,分为:
- 标量子查询(子查询结果为单个值)
- 列子查询(子查询结果为一列)
- 行子查询(子查询结果为一行)
- 表子查询(子查询结果为多行多列)
- 根据子查询位置,分为
- WHERE 之后
- FROM 之后
- SELECT 之后
一、标量子查询
子查询返回的结果是单个值(数字、字符串、日期等)。
常用操作符:- < > > >= < <=
示例:
--查询销售部所有员工信息
--1.查询销售部部门id
select id from dept where name='销售部';
--2.根据得到的销售部部门id,查询员工信息:
select * from emp where dept_id=...;
--子查询写法:
select * from emp where dept_id=(select id from dept where name='销售部');
二、列子查询
返回的结果是一列(可以是多行)。
常用操作符:
操作符 | 描述 |
---|---|
IN | 在指定的集合范围内,多选一 |
NOT IN | 不在指定的集合范围内 |
ANY | 子查询返回列表内,有任意一个满足即可 |
SOME | 等同ANY |
ALL | 子查询列表的所有制都必须满足 |
- 例一:查询市场部和销售部所有员工信息:
select * from emp where dept_id in (select id from dept where name='销售部'||name ='市场部');
- 例二:– 查询比财务部所有人工资都高的员工信息
select * from emp where salary > all(select salary from emp where dept_id=(selcet id from dept where name ='财务部'));
三、行子查询
返回的结果是一行(可以是多列)。
常用操作符:=, <, >, IN, NOT IN
- 例:查询与xxx的薪资及所在部门相同的员工信息
select * from emp where(salary,dept_id)=(select salary,dept_id from emp where name ='XXX');
四、表子查询
返回的结果是多行多列
常用操作符:IN
- 例1:查询与AAA,BBB的部门和薪资相同的员工
select *
from emp
where(dept_id,salary) in (select dept_id,salary from emp where name ='AAA' or name='BBB');
- 例2: 查询入职日期是2006-01-01之后的员工,及其部门信息
select e.*,d.*
from(select * from emp where entrydate>'2006-01-01') as e
left join dept as d on e.dept_id=d.id;
上述语句不用子查询也可以写为
select emp.*,dept.*
from emp
left join dept
on emp.dept_id=dept.id
where entrydate>'2006-01-01';
欢迎补充与指正