MySQL学习-子查询

100 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第10天,点击查看活动详情

前言

上篇我们针对MySQL中的聚合函数做了一些练习。有兴趣的小伙伴可以阅读(# MySQL学习-函数(十七))。
下面继续学习MySQL中的子查询。

子查询

子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL4.1开始引入。
SQL中子查询的作用大大增强了SELECT查询的能力,因为很多时候查询需要从结果集中获取数据,或者需要从同一个表中先计算得出一个数据结果,然后与这个数据结构(可能是某个标量,也可能是某个集合)进行比较。

需求

谁的工资比xiaolan的高?

方式1

先查询出xiaolan的工资,再用查询出来的结果作为条件查询。

SELECT name, salary
FROM employees
WHERE name = 'xiaolan';
namesalary
xiaolan3200.00

可以查询出xiaolan的工资是3200,再以此作为条件,查询大于3200的结果。

SELECT name, salary
FROM employees
WHERE salary > 3200;
namesalary
xiaoming6800.00

这样就可以查询出结果。但是这样的话,使用两条语句查询的,效率会低。

方式2

使用自连接查询。

SELECT e2.name, e2.salary
FROM employees e1, employees e2 
WHERE e2.'salary' > e1.'salary'
AND e1.name = 'xiaolan';
namesalary
xiaoming6800.00

使用自连接也可以查出结果,并且是一条语句查询得出,效率会比2条语句高。

方式2

使用子查询。

SELECT name, salary
FROM employees
WHERE salary > (
                SELECT name, salary
                FROM employees
                WHERE name = 'xiaolan'
                );
namesalary
xiaoming6800.00

使用子查询也可以查出结果。

称谓的规范

从子查询的方式三可以看出,语句包含外查询(或主查询),内查询(或子查询)。

  • 子查询(内查询)在主查询之前一次执行完成。
  • 子查询的结果被主查询(外查询)使用。
  • 注意事项
    • 子查询要包含在括号内。
    • 将子查询放在比较条件的右侧。
    • 单行操作符对应单行子查询,多行操作符对应多行子查询。

子查询的分类

角度1:从内查询返回的结果的条目数区分
        单行子查询 VS 多行子查询
角度2:内查询是否被多次查询区分
        相关子查询 VS 不相关子查询

举例: 相关子查询的需求:查询工资大于本部门平均工资的员工信息。
分析: 每次子查询查出的结果都不一样,是与外查询的条件有相关性的。

举例: 相关子查询的需求:查询工资大于本公司平均工资的员工信息。
分析: 每次子查询查出的结果是一样的,是与外查询的条件不相关的。