引言
1.概念:
- 出现在其他语句的内部的select语句,称为子查询或内查询
- 里面嵌套其他select语句的查询语句,称为主查询或外查询
子查询不一定必须出现在select语句内部,只是出现在select语句内部的时候较多!
2.注意事项:
-
1)原则上,子查询必须设定名称;
-
2)子查询执行顺序先于父查询:一般来讲,主查询会用到子查询的结果
-
3)子查询语句需要放在小括号内,提高代码的阅读性
-
4)如果子查询放在条件中,一般来讲,子查询需要放在条件的右侧
示例:where job_id>(子查询)
不能写成:where (子查询)<job_id -
5)单行子查询对应的使用单行操作符:> < >= <= = <>
-
6)多行子查询对应的使用多行操作符:IN 、ANY 、ALL
1.子查询分类
1.按查询结果分类:
- 单行子查询:子查询的结果集只有一行一列
- 多行子查询:子查询的结果集有多行一列
2.按出现在select语句的位置进行分类:
select子句中:
子查询的结果集只能是一列 (标量子查询)
from子句中
子查询的结果集可以为多行多列(表子查询)
where或having子句中 ★
子查询的结果集可以是:
单行子查询(标量子查询):一列一行
多行子查询:一列多行
exist子句
子查询的结果集可以为多行多列(相关子查询)
案例:select子句中:
SELECT (SELECT COUNT(*) FROM departments);
2.子查询特点
1、子查询最好放在小括号中,提高代码的阅读性
2、子查询的执行优先于主查询
3、子查询如果当条件,一般放在条件的右侧
3.标量子查询:
1.WHERE 子句中:
SELECT `last_name`,`employee_id`,`salary`
FROM `employees`
WHERE `salary` > (
SELECT AVG(salary)
FROM employees
);
2.FROM 子句中:
1)只返回一行一列的结果的子查询
2)常用方法: 用于WHERE子句中,因为WHERE子句不可以使用聚合函数;
3)使用位置:任意可以使用单一值的位置都可使用(所有地方)
4)执行顺序: 先执行标量子查询,后将唯一结果带入外层查询进行执行
5)注意事项:绝对不能返回多个结果
4.关联子查询
关联子查询:只会返回单一值,其结合条件写在子查询中。
案例:
1.筛选,每类产品中,大于该类产品均价的商品的相关信息
SELECT product_type,product_name,sale_price
FROM product AS P1
WHERE sale_price > (
SELECT avg(sale_price) /*关联子查询,只会返回单一值*/
FROM product AS P2
WHERE P2.product_type = P1.product_type /*结合条件一定要写在子查询中*/
);
2.如果使用标量子查询,不满足查询需求;
如:子查询使用分组,则语法错误:
SELECT product_type,product_name,sale_price
FROM product AS P1
WHERE sale_price > (
SELECT avg(sale_price) /*子查询,返回多个值,错误*/
FROM product AS P2
GROUP BY product_type
);
注意:关联子查询的结合条件一定要写在子查询中