子查询
含义:
出现在其他语句中的 SELECT
语句,称为子查询或内查询;外部查询为外查询或主查询
分类:
按子查询出现的位置:
SELECT
后面:仅仅支持标量子查询FROM
后面:支持表子查询WHERE
或HAVING
后面:标量子查询,列子查询,行子查询EXISTS
后面(相关子查询)表子查询
按结果集的行列数不同:
- 标量子查询(结果集只有一行一列)
- 行子查询(结果集只有一行多列)
- 列子查询(结果集只有一列多行)
- 表子查询(结果集为多行多列)
一、WHERE
或 HAVING
后面
特点:
- 子查询放在小括号内
- 子查询一般放在条件的右侧
- 标量子查询,一般搭配着单行操作符使用
< > >= <= = <>
列子查询,一般搭配着多行操作符使用in, any / some, all
子查询的执行优先于主查询的执行,主查询的条件用到了子查询的结果
1.标量子查询
案例:查询每个部门最小工资比50号部门编号最小的员工工资大的部门编号
SELECT MIN(salary), department_id
FROM employees
GROUP BY department_id
HAVING MIN(salary) > (
SELECT MIN(salary)
FROM employees
WHERE department_id = 50);
2.列子查询(多行子查询)
案例:查询比50号部门编号任意员工工资小的员工姓名
SELECT name
FROM employees
WHERE salary < ANY(
SELECT salary
FROM employees
WHERE department_id = 50);
3.行子查询(一行多列或多行多列)
案例:查询最大编号最少工资的员工姓名
SELECT name
FROM employees
WHERE (employ_id, salary) = (SELECT MAX(employ_id), MIN(salaray)
FROM employees);
二、SELECT 后面
案例:查询每个部门的员工个数
SELECT d.*, (
SELECT COUNT(*)
FROM employees e
WHERE e.department_id = d.department_id)个数
FROM department d;
二、FROM 后面
案例:查询每个部门的平均工资的工资等级
员工表和工资等级表连接
SELECT ag_dep.*, g.grade_level
FROM (
SELECT AVG(salary) ag, department_id
FROM employees
GROUP BY department_id) ag_dep
INNER JOIN jobs_grades g
ON ag_dep.ag
BETWEEN g.lowest_sal AND g.highest_sal;
三、EXISTS 后面
语句:exists (完整查询语句)
结果:0或1
案例:查询有员工的部门名
SELECT department_name
FROM department d
WHERE EXISTS (
SELECT *
FROM employees e
WHERE e.department_id = d.department_id);
SELECT department_name
FROM department d
WHERE d.department_id IN (
SELECT department_id
FROM employees e
);