0 序言
本文将系统讲解SQL中子查询的概念
、分类
、执行逻辑
及实际用法
,包括单行子查询
、多行子查询
、相关子查询
的操作符与示例,以及子查询的注意事项。
通过学习,你将掌握如何使用子查询解决复杂查询问题,理解不同类型子查询的适用场景,提升SQL查询的灵活性与效率。
1 子查询概述
1.1 什么是子查询
什么是子查询呢?
子查询是嵌套在另一个查询语句内部的查询。
从MySQL 4.1开始引入,它能增强SELECT查询能力,支持从结果集获取数据,或用一个查询结果作为另一个查询的条件,
打个例子,如“谁的工资比TOM高”可通过子查询先获取Abel的工资,再筛选更高工资的员工。
这样子查询的效率就提高了。
1.2 基本语法
SELECT select_list
FROM table
WHERE expr operator (
SELECT select_list
FROM table
);
子查询需包含在括号内
,通常放在比较条件右侧。- 子查询
(内查询)先执行
,结果供主查询(外查询)使用。
1.3 分类
1.3.1 按结果行数分类
- 单行子查询:内查询返回一条记录,对应单行比较操作符(=、>、<等)。
- 多行子查询:内查询返回多条记录,对应多行比较操作符(IN、ANY、ALL等)。
1.3.2 按执行次数分类
- 不相关子查询:内查询仅执行一次,结果作为主查询条件。比方说先查A的工资,再用该值筛选其他员工)。
- 相关子查询:内查询执行次数依赖外部查询,每次外部查询行变化时,子查询需重新计算。比如查询员工工资高于本部门平均工资)。
2 单行子查询
2.1 单行比较操作符
操作符 | 含义 |
---|---|
= | 等于 |
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
<> | 不等于 |
2.2 代码示例
2.2.1 子查询基础
查询工资大于149号员工工资的员工姓名
SELECT last_name
FROM employees
WHERE salary > (
SELECT salary
FROM employees
WHERE employee_id = 149
);
说明:子查询先获取149号员工的工资,主查询用该值筛选工资更高的员工。
2.2.2 多条件子查询
返回job_id与141号员工相同、工资比142号员工高的员工信息
SELECT last_name, job_id, salary
FROM employees
WHERE job_id = (
SELECT job_id
FROM employees
WHERE employee_id = 14