持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情
前言
上篇我们针对MySQL中的聚合函数做了一些练习。有兴趣的小伙伴可以阅读(# MySQL学习-函数(十七))。
下面继续学习MySQL中的子查询。
子查询
子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL4.1开始引入。
SQL中子查询的作用大大增强了SELECT查询的能力,因为很多时候查询需要从结果集中获取数据,或者需要从同一个表中先计算得出一个数据结果,然后与这个数据结构(可能是某个标量,也可能是某个集合)进行比较。
需求
谁的工资比xiaolan的高?
方式1
先查询出xiaolan的工资,再用查询出来的结果作为条件查询。
SELECT name, salary
FROM employees
WHERE name = 'xiaolan';
| name | salary |
|---|---|
| xiaolan | 3200.00 |
可以查询出xiaolan的工资是3200,再以此作为条件,查询大于3200的结果。
SELECT name, salary
FROM employees
WHERE salary > 3200;
| name | salary |
|---|---|
| xiaoming | 6800.00 |
这样就可以查询出结果。但是这样的话,使用两条语句查询的,效率会低。
方式2
使用自连接查询。
SELECT e2.name, e2.salary
FROM employees e1, employees e2
WHERE e2.'salary' > e1.'salary'
AND e1.name = 'xiaolan';
| name | salary |
|---|---|
| xiaoming | 6800.00 |
使用自连接也可以查出结果,并且是一条语句查询得出,效率会比2条语句高。
方式2
使用子查询。
SELECT name, salary
FROM employees
WHERE salary > (
SELECT name, salary
FROM employees
WHERE name = 'xiaolan'
);
| name | salary |
|---|---|
| xiaoming | 6800.00 |
使用子查询也可以查出结果。
称谓的规范
从子查询的方式三可以看出,语句包含外查询(或主查询),内查询(或子查询)。
- 子查询(内查询)在主查询之前一次执行完成。
- 子查询的结果被主查询(外查询)使用。
- 注意事项
- 子查询要包含在括号内。
- 将子查询放在比较条件的右侧。
- 单行操作符对应单行子查询,多行操作符对应多行子查询。
子查询的分类
角度1:从内查询返回的结果的条目数区分
单行子查询 VS 多行子查询
角度2:内查询是否被多次查询区分
相关子查询 VS 不相关子查询
举例: 相关子查询的需求:查询工资大于本部门平均工资的员工信息。
分析: 每次子查询查出的结果都不一样,是与外查询的条件有相关性的。
举例: 相关子查询的需求:查询工资大于本公司平均工资的员工信息。
分析: 每次子查询查出的结果是一样的,是与外查询的条件不相关的。