子查询概念
子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从 MySQL 4.1 开始引入。现在使用的是 MySQL 8.0.28
在特定情况下,一个查询语句的条件需要另一个查询语句来获取,内层查询(inner query)语句的查询结果,可以为外层查询(outer query)语句提供查询条件。
内层查询即子查询,外层查询即主查询,只是叫法不同而已。
查询需求
-
查询公司之中工资最低的员工信息
-
工资最低是多少?
-
工资最低的员工是谁?
-
-- 查询公司中工资最低是多少?
SELECT MIN(sal) FROM emp;
-- 工资最低的员工是谁?
SELECT * FROM emp WHERE sal= 800;
-- 查询公司中工资最低的员工信息
SELECT * FROM emp WHERE sal=(SELECT MIN(sal) FROM emp);
子查询规范
-
子查询必须放在小括号()中
-
子查询一般放在比较操作符=的右边,以增强代码可读性
-
子查询可以出现在几乎所有的SELECT字句中(如:SELECT、FROM、WHERE、ORDER BY、HAVING子句)
子查询分类
根据子查询返回的数据分类
-
标量子查询(scalar subquery):返回 1 行 1 列一个标量(单行单列,返回的是一个值)
-
行子查询(row subquery):返回的结果是 1 行 N 列(单行多列)
-
列子查询(column subquery):返回的结果是 N 行 1 列(多行单列)
-
表子查询(table subquery):返回的结果是 N 行 N 列(多行多列,返回的是一个表)
子查询可以返回一个标量(就一个值)、一个行、一个列或一个表,这些子查询分别称之为标量、行、列和表子查询。
根据子查询和主查询之间是否有条件关联分类
-
相关子查询:两个查询之间有一定的条件关联(相互联系)
-
不相关子查询:两个查询之间没有条件关联(相互独立)
为了方便,对于在何处使用子查询给出几点建议
-
子查询出现在 WHERE 子句中:此时子查询返回的结果一般都是单行单列(标量查询)、单行多列(行子查询)、多行单列(列子查询)
-
子查询出现在 HAVING 子句中:此时子查询返回的都是单行单列(标量查询),同时为了使用统计函数操作
-
子查询出现在 FROM 子句中:此时子查询返回的结果一般都是多行多列(一张表),可以按照一张数据表(临时表)的形式操作