MySQL学习 - 子查询
子查询
将一个查询语句嵌套在查询语句里的一个查询语句。被嵌套在内的叫子查询(内查询)、外面的叫主查询(外查询)。
规范
- 子查询必须写在括号内;
- 子查询为了可读性,一般写在操作符的右边;
- 子查询不支持
GROUP BY
子句和LIMIT
子句;
分类
可分为两类
-
单行子查询和多行子查询;
单行子查询的子查询(内查询)返回一条查询结果,多行子查询返回多条查询结果
-
相关子查询和非相关子查询;
非相关子查询的子查询(内查询)的数据是固定的,不会使用到主查询的数据,而相关子查询会使用到主的查询的数据。
单行子查询
子查询(内查询)返回一条查询结果。
使用 =
>
>=
<
<=
<>
操作符
查询比平均工资高的员工
SELECT last_name,salary
FROM employees
WHERE salary > (
SELECT AVG(salary)
FROM employees
);
多行子查询
子查询(内查询)返回多条查询结果。
使用 IN
ANY
SOME
ALL
操作符
操作符 | 含义 |
---|---|
IN |
等于列表中的任意一个 |
ANY |
需要和单行比较操作符一起使用,和子查询返回的某一个值比较 |
ALL |
需要和单行比较操作符一起使用,和子查询返回的所有值比较 |
SOME |
实际上是 ANY 的别名,作用相同,一般常使用 ANY |
查询所在部门大于平均工资的员工
SELECT last_name,department_id,salary
FROM employees
WHERE department_id IN (
SELECT department_id
FROM employees
GROUP BY department_id
HAVING AVG(salary) >(
SELECT AVG(salary)
FROM employees
)
);
不相关子查询
不依赖于外部查询的数据。
上面两个子查询的示例就是
相关子查询
查询工资大于本部门平均工资的员工
SELECT salary,last_name,department_id
FROM employees e
WHERE salary >(
SELECT AVG(d.salary)
FROM employees d
WHERE d.department_id=e.department_id
);
其他
派生表
当子查询位于 FROM
子句时,这个子查询称为派生表,并且派生表必须要有别名
查询在使用的部门的编号小于100的编号
SELECT t.department_id
FROM (
SELECT department_id
FROM employees
GROUP BY department_id
) t
WHERE t.department_id<100;
参考链接
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。