子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL4.1开始引入。
SQL中子查询的使用大大增强了SELECT查询的能力,因为很多时候查询需要从结果集中获取数据,或者需要从同一个表中先计算得出一个数据结果,然后与这个数据结果(可能是某个标量,也可能是某个集合)进行比较。
1.需求分析与问题解决
1.1实际问题
解决方式:
#需求:i谁的工资比Abel的高?
#方式1:
SELECT salary
FROM employees
WHERE last_name = ‘Abel’;
SELECT last_name,salary
FROM employees
WHERE salary > 11000;
#方式二
SELECT e2.last_name, e2.salary
FROM employees e1, employees e2
WHERE e2.salary
> e1.salary
#多表的连接条件
AND e1.last_name =‘Abel’;
#方式三:子查询
SELECT last_name , salary
FROM employees
WHERE salary > (
SELECT salary
FROM employees
WHERE last_name = ‘Abel’
);
1.2子查询的基本使用
称谓的规范:外查询(或主查询)、内查询(或子查询)
1.3子查询的分类
2单行子查询
2.1单行比较操作符
2.2代码示例
-
题目:查询工资大于149号员工工资的员工的信息
-
题目:返回job_id与141号员工相同,salary比143号员工多的员工姓名,job_id和工资
-
题目:返回公司工资最少的员工的last_name,job_id和salary
-
题目:查询与141号员工的manager_id和department_id相同的其他员工的employee_id,manager_id,department_id
2.3 HAVING中的子查询
- 首先执行子查询。
- 向主查询中的HAVING子句返回结果。
2.4CASE中的子查询
2.5子查询中的空值问题
2.6非法使用子查询
3.多行子查询
- 也称为集合比较子查询
- 内查询返回多行
- 使用多行比较操作符
3.1多行比较操作符
3.2代码示例
3.3空值问题
出现原因:子查询结果中有NULL值
SQL避坑:当in,not in遇上null这种坑你避过吗?
修改:
4.相关子查询
4.1相关子查询执行流程
如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件关联,因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为关联子查询。
相关子查询按照一行接一行的顺序执行,主查询的每一行都执行一次子查询。
4.2代码示例
过滤条件中使用子查询
FROM中使用子查询
ORDER BY中使用子查询
4.3 EXISTS 与NOT EXISTS关键字
4.4相关更新
4.4相关删除
5.思考题