1. 子查询概述
子查询指一个查询语句嵌套在另一个查询语句内部的查询。
2. 子查询的引入
2.1 实际问题需要实现的需求
2.2 问题需求的实现
2.2.1 逐步查询实现
# 先查询出Abel的工资 # 11000 SELECT last_name, salary FROM employees WHERE last_name = 'Abel'; # 查询比Abel工资高的员工 SELECT last_name, salary FROM employees WHERE salary > 11000;
2.2.2 自连接查询实现
SELECT e2.last_name, e2.salary FROM employees e1, employees e2 # 查询出表1中的员工Abel,同时找到表2中工资大于Abel的员工信息 WHERE e1.last_name = 'Abel' AND e2.salary > e1.salary;
2.2.3 子查询实现
SELECT last_name, salary FROM employees WHERE salary > 11000; # 11000是由另一个查询得到的结果, # 所以使用一个查询语句替换11000
SELECT last_name, salary FROM employees WHERE salary > ( SELECT salary FROM employees WHERE last_name = 'Abel' );
3. 子查询称谓的规范
- 子查询(内查询)在主查询之前一次执行完成。
- 子查询的结果被主查询(外查询)使用 。
- 注意事项
- 子查询要包含在括号内
- 将子查询放在比较条件的右侧(写在左侧可读性较差)
- 单行操作符对应单行子查询,多行操作符对应多行子查询
4. 子查询的分类
4.1 按内查询返回的结果进行划分
按内查询的结果返回一条还是多条记录,将子查询分为 单行子查询 、多行子查询 。
4.1.1 单行子查询
4.1.2 多行子查询
4.2 按内查询是否被执行多次进行划分
按内查询是否被执行多次,将子查询划分为 相关(或关联)子查询 和 不相关(或非关联)子查询 。
4.2.1 相关(或关联)子查询
如果子查询需要执行多次,即采用循环的方式,先从外部查询开始,每次都传入子查询进行查询,然后再将结果反馈给外部,这种嵌套的执行方式就称为相关子查询。
相关子查询,每次的查询中子查询内都会使用到外层查询的数据。
如:查询工资大于本部门平均工资的员工信息。
在查询每个员工时,子查询都会根据该员工所在的部门信息计算对应部门的平均工资,在这过程中子查询使用了外层查询中员工对应的部门id。
4.2.2 不相关(或非关联)子查询:
子查询从数据表中查询了数据结果,如果这个数据结果只执行一次,然后这个数据结果作为主查询的条件进行执行,那么这样的子查询叫做不相关子查询。
不相关子查询,每次的查询中子查询内不会使用到和外层有关的数据。
如:查询工资大于本公司平均工资的员工信息。
子查询和外层查询并没有很大的关联性。
5. 单行子查询
5.1 单行比较操作符
5.2 示例
5.2.1 题目1
查询工资大于149号员工工资的员工的信息
# 查询工资大于149号员工工资的员工的信息 SELECT employee_id, last_name, salary FROM employees WHERE salary > ( SELECT salary FROM employees WHERE employee_id = 149 );
5.2.2 题目2
返回job_id与141号员工相同,salary比143号员工多的员工姓名,job_id和工资
SELECT last_name, job_id, salary FROM employees WHERE job_id = ( SELECT job_id FROM employees WHERE employee_id = 141 ) AND salary > ( SELECT salary FROM employees WHERE employee_id = 143 );
5.2.3 题目3
返回公司工资最少的员工的last_name,job_id和salary
SELECT last_name, job_id, salary FROM employees WHERE salary = ( SELECT MIN(salary) FROM employees );