文章目录
谁的工资比 Abel 高
select salary
FROM employees
WHERE last_name = "Abel"
SELECT last_name, salary
FROM employees
WHERE salary > (
select salary
FROM employees
WHERE last_name = "Abel"
)
- 子查询,
1、是嵌套在主查询内部的SELECT语句,
2、执行逻辑:先完整执行子查询,得到结果,再将该结果作为主查询的过滤条件 / 查询数据源。
3、根据,子查询返回的结果行数,可分为单行子查询 和 多行子查询,
且两类子查询必须严格匹配对应类型的操作符,混用会直接触发语法报错。
"单行子查询"
1、子查询执行后,仅返回 "1行1列" 的单个标量值(比如:一个数字、一个字符串),
本质是,得到一个可直接比较的具体值。
2、对应操作符:只能使用,单行比较运算符:=、>、<、>=、<=、<>(不等于)。
3、如果,子查询实际返回了多行数据,却使用了=这类单行操作符,数据库会直接报错。
例如:MySQL会提示:Subquery returns more than 1 row。
多行子查询
1、子查询执行后,返回 "多行1列" 的结果集(相当于一个值的集合/列表),
本质是,得到一组可做集合匹配的数值。
2、对应操作符:必须使用,多行集合操作符,核心常用的有 in、any、all。
in:主查询的值,等于,子查询结果中的任意一个,即匹配成功
any:主查询的值,和子查询结果中的任意一个做比较,满足一个即可
any 必须搭配比较符使用,例如 >ANY、<ANY
all:主查询的值,和子查询结果中的所有值做比较,必须全部满足
all 必须搭配比较符使用,例如 >ALL、<ALL。
补充: =any 和 in 效果完全等价;
<>ALL 和 NOT IN 效果完全等价。
in 操作符 - 例子
查询「所有部门经理」的员工信息(子查询返回所有经理的 ID,是多行集合)
SELECT emp_id, emp_name, dept_id
FROM emp
WHERE emp_id IN (
-- 多行子查询:返回所有部门的经理ID集合
SELECT manager_id FROM dept
);
逻辑等价于:emp_id = 经理1 OR emp_id = 经理2 OR ...。
any 操作符 - 例子
查询工资比任意一个部门的平均工资高的员工(只要比其中一个部门的平均高就算满足)
SELECT emp_name, salary
FROM emp
WHERE salary >ANY (
-- 子查询返回每个部门的平均工资(多行结果)
SELECT AVG(salary) FROM emp GROUP BY dept_id
)
底层逻辑:只要工资 > 子查询结果中的最小值,就满足条件。
all 操作符 - 例子
查询工资比所有部门的平均工资都高的员工(必须比全部部门的平均都高才算满足)
SELECT emp_name, salary
FROM emp
WHERE salary > ALL (
SELECT AVG(salary) FROM emp GROUP BY dept_id
);
底层逻辑:只有工资 > 子查询结果中的最大值,才满足条件。