多行子查询
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
)