[MySQL]子查询(一)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: [MySQL]子查询

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
    );


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
SQL 关系型数据库 MySQL
mysql子查询、聚合函数
mysql子查询、聚合函数
|
1月前
|
关系型数据库 MySQL
Mysql基础第十七天,使用子查询
Mysql基础第十七天,使用子查询
21 0
|
1月前
|
SQL 关系型数据库 MySQL
MySQL子查询篇(精选20道子查询练习题)-2
MySQL子查询篇(精选20道子查询练习题)
46 0
|
1月前
|
SQL 关系型数据库 MySQL
MySQL子查询篇(精选20道子查询练习题)-1
MySQL子查询篇(精选20道子查询练习题)
54 0
|
10天前
|
SQL 关系型数据库 MySQL
MySQL数据库子查询练习——EXISTS(存在)
MySQL数据库子查询练习——EXISTS(存在)
13 1
|
10天前
|
SQL 关系型数据库 MySQL
MySQL数据库子查询——in多个数据查询的示例
MySQL数据库子查询——in多个数据查询的示例
9 1
|
10天前
|
SQL 关系型数据库 MySQL
MySQL数据库子查询练习——单个数据的子查询
MySQL数据库子查询练习——单个数据的子查询
12 1
|
10天前
|
SQL 关系型数据库 MySQL
MySQL数据库子查询练习——DDL与DML语句(包括引入视频)
MySQL数据库子查询练习——DDL与DML语句(包括引入视频)
14 1
|
18天前
|
SQL 关系型数据库 MySQL
MySQL数据库——多表查询(3)-自连接、联合查询、子查询
MySQL数据库——多表查询(3)-自连接、联合查询、子查询
17 1
|
1月前
|
关系型数据库 MySQL 数据库管理
【MySQL进阶之路 | 基础篇】子查询之二(不相关子查询与相关子查询)
【MySQL进阶之路 | 基础篇】子查询之二(不相关子查询与相关子查询)