子查询
- 子查询
- 基本概念(公式)
- 子查询分类
- 按照结果分类
- 标量 子查询
- 列 子查询
- 行 子查询
- 表 子查询
子查询
基本概念(公式)
SQL查询语句中嵌套Select语句,称为嵌套查询,亦称为子查询;
select * from t1 where column1=(select column1 from t2);
# (select column1 from t2) 内容称为子查询
子查询分类
根据子查询结果不同,可以分为:
- 标量子查询(子查询结果为单个值);
- 列子查询(子查询结果为一列);
- 行子查询(子查询结果为一行);
- 表子查询(子查询结果为多行多列);
根据子查询位置,可以分为:
- where 子查询
- from 子查询
- select 子查询
按照结果分类
标量 子查询
标量子查询:子查询结果为单个值;
# 子查询为:查询销售部的id值
# 子查询语句为:(select id from dept where name='销售部')
select * from emp where dept_id=(select id from dept where name='销售部');
# 子查询为:查询老徐的入职日期
# 子查询语句为:(select entrydate from emp where name='老徐')
select * from emp where entrydate > (select entrydate from emp where name='老徐');
列 子查询
列子查询:子查询返回的结果是一列;
in # 在指定集合范围内,多选一
not in # 不在指定集合范围内
any # 子查询返回列表的任意一个值满足
some # 子查询返回列表的任意一个值满足
all # 子查询返回列表的所有值都必须满足
# 子查询为:查询销售部和市场部的部门id
# 子查询语句为:(select id from dept where name='销售部' or name='市场部')
select * from emp where dept_id in (select id from dept where name='市场部' or name='销售部');
# 子查询为:查询财务部所有人工资
# 子查询语句为:select salary from emp where dept_id = (select id from dept where name = '财务部');
select * from emp where salary > all(select salary from emp where dept_id = (select id from dept where name = '财务部'));
# 子查询为:查询研发部所有人工资
# 子查询语句为: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 = '研发部'));
# any 换成 some 结果相同;
行 子查询
行子查询:子查询返回的结果是一行,多列;
# 子查询为:查询”老徐“的薪资以及直属领导
# 子查询语句为:(select salary,managerid from emp where name='老徐');
select * from emp where (salary,managerid) = (select salary,managerid from emp where name='老徐');
表 子查询
表子查询:子查询返回结果是多行多列;
# 子查询为:查询”老徐“,”老张“的职位和薪资
# 子查询语句为:(select job,salary from emp where name='老徐' or name='老张');
select * from emp where (job,salary) in (select job,salary from emp where name='老徐' or name='老张');
# 子查询为:查询入职日期在2006-01-01之后的员工信息
# 子查询语句为:(select * from emp where entrydate > '2006-01-01');
select e.*, d.* from (select * from emp where entrydate > '2006-01-01') e left join dept d on e.dept_id = d.id;