sql - 子查询

文章目录

sql 复制代码
 谁的工资比 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、根据,子查询返回的结果行数,可分为单行子查询多行子查询
    且两类子查询必须严格匹配对应类型的操作符,混用会直接触发语法报错。
sql 复制代码
"单行子查询"

	1、子查询执行后,仅返回 "1行1列" 的单个标量值(比如:一个数字、一个字符串),
	   本质是,得到一个可直接比较的具体值。
	
	2、对应操作符:只能使用,单行比较运算符:=、>、<、>=、<=、<>(不等于)。
	
	3、如果,子查询实际返回了多行数据,却使用了=这类单行操作符,数据库会直接报错。
 	   例如:MySQL会提示:Subquery returns more than 1 row。
 	   
sql 复制代码
多行子查询
	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
		);
底层逻辑:只有工资 > 子查询结果中的最大值,才满足条件。