sql - 多行子查询

多行子查询

sql 复制代码
多行子查询
	1、子查询执行后,返回 "多行1列" 的结果集(相当于一个值的集合/列表),
		 本质是,得到一组可做集合匹配的数值。

	2、对应操作符:"必须使用,多行集合操作符",核心常用的有 in、any、all。
			
			in:主查询的值,等于,子查询结果中的任意一个,即匹配成功
			
			
			any:主查询的值,和子查询结果中的任意一个做比较,满足一个即可
					 any 必须搭配比较符使用,例如 >ANY、<ANY
							=ANY 等价 IN
							>ANY:比,子查询里的最小值,大,即可
							<ANY:比,子查询里的最大值,小,即可
							
			
			all:主查询的值,和子查询结果中的所有值做比较,必须全部满足
				    all 必须搭配比较符使用,例如 >ALL、<ALL。
							>ALL:比,子查询里的最大值,大,即可
							<ALL:比,子查询里的最小值,小,即可
										
			
			补充: =any 和 in 效果完全等价;
			      <>ALL 和 NOT IN 效果完全等价。

例子-1

sql 复制代码
"返回其它job_id中比job_id为'IT_PROG'部门任意一个工资低的员工的员工号、姓名、job_id 以及salary"

SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE job_id <> 'IT_PROG'
AND salary < ANY(
					SELECT DISTINCT salary
					from employees
					WHERE job_id = 'IT_PROG'
				)

例子-2

sql 复制代码
"返回其它job_id中比job_id为'IT_PROG'部门所有工资都低的员工的员工号、姓名、job_id、salary"

SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE job_id <> 'IT_PROG'
AND salary < ALL (
					SELECT DISTINCT salary
					from employees
					WHERE job_id = 'IT_PROG'
				 )

查询平均工资最低的部门id

sql 复制代码
"查询平均工资最低的部门id"

# 报错,mysql中聚合函数不能嵌套使用
SELECT min(avg(salary))
FROM employees
GROUP BY department_id

# 首先,查询每个部门的平均工资
SELECT avg(salary) avg_sal
FROM employees
GROUP BY department_id

# 然后,查询所有部门平均工资里的最小值
SELECT min(avg_sal)
from (
		SELECT avg(salary) avg_sal
		FROM employees
		GROUP BY department_id
	 ) table_avg_sal

# 最后
SELECT department_id
from employees
GROUP BY department_id
HAVING avg(salary) = (
						SELECT min(avg_sal)
						from (
								SELECT avg(salary) avg_sal
								FROM employees
								GROUP BY department_id
							 ) table_avg_sal
					  )

查询平均工资最低的部门id - 方式2

sql 复制代码
SELECT department_id
FROM employees
GROUP BY department_id
HAVING avg(salary) <= ALL (
							SELECT avg(salary)
							FROM employees
							GROUP BY department_id
						)