子查询分类
按子查询出现位置:
- select后:
- 仅仅支持标量子查询
- from后
- 支持表子查询
- where或having后 (用最多!!!)
- 标量子查询
- 行子查询
- 列子查询
- exists后
- 表子查询
结果集行列数不同:
- 标量子查询 (结果一行一列)
- 列子查询 (结果一列多行)
- IN/NOT IN 等于列表中任意一个
- any/some 和子查询返回的某一个值比较 * all 和子查询返回所有值做比较
- 行子查询 (结果一行多列)
- 表子查询 (多行多列)
实践
数据表
employess
部门表
where或having后
案例1 谁的工资比abel高 (标量子查询)
- 查出abel工资
select salary from employees where last_name = 'abel';
这是标量, 一行一列
2. 查出结果>abel的人
select last_name from employees where salary > (select salary from employees where last_name = 'abel');
案例2 查询返回location_id是1400或1700的部门中所有员工姓名(列子查询) in
第一步: 返回1400, 1700的部门id
select department_id from departments where location_id in (1400, 1700)
第二步: 查询这些id的所有员工姓名, 用in
select last_name from employees where department_id in (select department_id from departments where location_id in (1400, 1700));
案例3 查询其他部门中比job_id为'IT_PROG'部门的任一工资低的员工的员工号,姓名,job_id以及salary (列子查询 + any)
- any代表任意一个, < any 意思是小于任何一个,也就是小于最大的.
- all代表所有, < all 代表小于最小值 分步
- 查询job_id为'IT_PROG'的工资(一列多行)
SELECT salary FROM employees WHERE job_id = 'IT_PROG'
2. 结果要比这些工资的任一工资低
SELECT employee_id, last_name, job_id, salary FROM employees WHERE salary < any (SELECT salary FROM employees WHERE job_id = 'IT_PROG')
案例4 exists后的子查询(相关子查询)
- exists表示是否存在, 存在1, 不存在0(不常用, 一般可以用in判断)
select exists(select employee_id from employees)