【MySQL基础】6—子查询
创始人
2025-05-28 03:25:52

⭐⭐⭐⭐⭐⭐
Github主页👉https://github.com/A-BigTree
笔记链接👉https://github.com/A-BigTree/Code_Learning
⭐⭐⭐⭐⭐⭐

如果可以,麻烦各位看官顺手点个star~😊

如果文章对你有所帮助,可以点赞👍收藏⭐支持一下博主~😆

文章目录

  • 9 子查询
    • 9.1 简述
      • 9.1.1 子查询的基本使用
      • 9.1.2 子查询分类
        • 分类方式1
        • 分类方式2
    • 9.2 单行子查询
      • 9.2.1 单行比较操作符
      • 9.2.2 代码示例
      • 9.2.3 `HAVING`中的子查询
      • 9.2.4 `CASE`中的子查询
      • 9.2.5 子查询的空值问题
    • 9.3 多行子查询
      • 多行比较操作符
    • 9.4 相关子查询
      • 9.4.1 相关子查询执行流程
      • 9.4.2 代码示例
      • 9.4.3 `EXISTS`与`NOT EXISTS`
      • 9.4.4 相关更新
      • 9.4.5 相关删除
    • 9.5 自连接vs子查询

9 子查询

9.1 简述

9.1.1 子查询的基本使用

SELECT	select_list
FROM	table
WHERE	expr operator(SELECT	select_listFROM	table);

9.1.2 子查询分类

分类方式1

按内查询的结果 返回一条还是多条 记录,将子查询分为 单行子查询多行子查询

分类方式2

我们按 内查询是否被执行多次,将子查询划分为相关(或关联)子查询不相关(或非关联)子查询

子查询从数据表中查询了数据结果,如果这个数据结果只执行一次,然后这个数据结果作为主查询的条件进行执行,那么这样的子查询叫做不相关子查询。

同样,如果子查询需要执行多次,即采用循环的方式,先从外部查询开始,每次都传入子查询进行查询,然后再将结果反馈给外部,这种嵌套的执行方式就称为相关子查询。

9.2 单行子查询

9.2.1 单行比较操作符

操作符含义
=equal to
>greater than
>=greater than or equal to
<less than
<=less than or equal to
<>not equal to

9.2.2 代码示例

SELECT last_name, job_id, salary
FROM employees
WHERE job_id =(SELECT job_idFROM employeesWHERE employee_id = 141)
AND salary >(SELECT salaryFROM employeesWHERE employee_id = 143);

9.2.3 HAVING中的子查询

  • 首先执行子查询;
  • 向主查询中的HAVING 子句返回结果;
SELECT department_id, MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary) >(SELECT MIN(salary)FROM employeesWHERE department_id = 50);

9.2.4 CASE中的子查询

SELECT employee_id, last_name,(CASE department_idWHEN(SELECT department_id FROM departmentsWHERE location_id = 1800)THEN 'Canada' ELSE 'USA' END) location
FROM employees;

9.2.5 子查询的空值问题

子查询不返回任何行

9.3 多行子查询

多行比较操作符

操作符含义
IN等于列表中的任意一个
ANY需要和单行比较操作符一起使用,和子查询返回的某一个值比较
ALL需要和单行比较操作符一起使用,和子查询返回的所有值比较
SOME实际上是ANY的别名,作用相同,一般常使用ANY

9.4 相关子查询

9.4.1 相关子查询执行流程

如果子查询的执行依赖于外部查询,通常情况下都是因为子查询中的表用到了外部的表,并进行了条件关联,因此每执行一次外部查询,子查询都要重新计算一次,这样的子查询就称之为关联子查询

相关子查询按照一行接一行的顺序执行,主查询的每一行都执行一次子查询

在这里插入图片描述

9.4.2 代码示例

FROM中使用子查询:

SELECT last_name,salary,e1.department_id
FROM employees e1, (SELECT department_id,AVG(salary)  dept_avg_sal FROM employees GROUP BY department_id) e2
WHERE e1.`department_id` = e2.department_id
AND e2.dept_avg_sal < e1.`salary`;

OEDER BY中使用子查询:

SELECT employee_id,salary
FROM employees e
ORDER BY (SELECT department_nameFROM departments dWHERE e.`department_id` = d.`department_id`);

9.4.3 EXISTSNOT EXISTS

关联子查询通常也会和EXISTS操作符一起来使用,用来检查在子查询中是否存在满足条件的行。

  • 如果在子查询中不存在满足条件的行:
    • 条件返回 FALSE
    • 继续在子查询中查找;
  • 如果在子查询中存在满足条件的行:
    • 不在子查询中继续查找;
    • 条件返回 TRUE

NOT EXISTS关键字表示如果不存在某种条件,则返回TRUE,否则返回FALSE

9.4.4 相关更新

UPDATE table1 alias1
SET column = (SELECT expressionFROM table2 alias2WHERE alias1.column = alias2.column);

9.4.5 相关删除

DELETE FROM table1 alias1
WHERE column operator (SELECT expressionFROM table2 alias2WHERE alias1.column = alias2.column);

9.5 自连接vs子查询

在可以使用子查询,也可以使用自连接的情况下,一般情况建议使用自连接,因为在许多 DBMS 的处理过程中,对于自连接的处理速度要比子查询快得多。

可以这样理解:子查询实际上是通过未知表进行查询后的条件判断,而自连接是通过已知的自身数据表进行条件判断,因此在大部分DBMS 中都对自连接处理进行了优化。

⭐⭐⭐⭐⭐⭐
Github主页👉https://github.com/A-BigTree
笔记链接👉https://github.com/A-BigTree/Code_Learning
⭐⭐⭐⭐⭐⭐

如果可以,麻烦各位看官顺手点个star~😊

如果文章对你有所帮助,可以点赞👍收藏⭐支持一下博主~😆

相关内容

热门资讯

MCU上调试CAN总线问题汇总... 目录 问题一:两个can设备无法相互间收发数据 原因: 问题二ÿ...
招标 | 近期隐私计算项目招标... 开放隐私计算 1招标1、江阴智慧港口公共服务平台项目名称:江阴智慧港口公共服务平台公告...
解决网页中Mixed Cont... 在Web开发中,作为开发者我们无可避免地需要引入资源文件,或者需要发起A...
redis cluster 集... master-slave -sentinel集群master 写单点,无法扩容。 ...
Java发起同步和异步HTTP... 同步与异步概念辨析 同步(synchronous)和异步(...
Kubernetes安装与集群... 一、环境准备 1、机器环境前置条件 当前演示准备3台虚拟机环境,或者是3台阿里云服务器...
simscape仿真总结2-机... 最近用simscape进行机器人的仿真,记录和总结一下学习心得和踩过的坑。 参照B站...
Redis(一):数据结构-底... 前言 从本文开始,我将分享一下近期自学 Redis 的学习笔记,其中大部...
flask教程5:abort函... 文章目录一、abort()函数的使用1.传递状态码信息2.传递响应体消息二、自定义错误处理 app....
【玩转Jetson TX2 N... 1 VMware14 Workstation Pro安装 如果没有Ubuntu系统电脑,...
2023还有人不知道kuber... 文章目录Kubernetes(K8s)一、Openstack&VM1、**认识虚拟化****1.1*...
NOI2019模拟赛 T1牛油... 题目描述 牛油果是一种神秘的水果,其具有一个坚固程度x≥0x\geq 0x≥0...
嵌入式软件开发之Linux下C... 目录 前沿 Hello World! 编写代码 编译代码 GCC编译器  gcc 命...
云原生|Rancher与Ope... 目录一、Rancher(一)介绍(二)优点&...
如何突破卫星影像建模难点?重建... 日前,由重建大师生成的首个“珞珈三号01星”卫星影像三维模型一经发出,引...
L1-085 试试手气 L1... 我们知道一个骰子有 6 个面,分别刻了 1 到 6 个点。下面给你 6 个骰子的初始状...
SpringSecurity客... 概述 FilterChainProxy是spring-security的入口,包含默认...
数据结构--二叉树 目录1.树概念及结构1.1数的概念1.2数的表示2.二叉树概念及结构2.1二叉树的概念2.2数据结构...
Qt之QUrl和QUrlQue... QUrlQUrl 类提供了一个方便的接口使用 URLs。最常见的使用QUrl 的方式是通过构造函数来...
函数指针二三事 1 什么是函数指针? ​ 函数指针,顾名思义,它是一个指向...
[ 红队知识库 ] Windo... 🍬 博主介绍 👨‍🎓 博主介绍:大家好...
【PowerBI】PowerB... 目的: 陈述PowerBI连接Mysql数据库的坑。 方法1:直接使用【...
BI数据可视化|可自动刷新的可... BI数据可视化大屏和其他的BI报表一样,都是可用于日常的决策中,因此除了...
Linux 练习十二 (Lin... 文章目录1 计算机网络基础知识1.1 OSI参考模型和TCP/IP参考模型1.2 TCP 协议1.2...
SQL语言基础教学 | Mys... SQL语言基础教学SQL(Structured Query Languageÿ...
pandas数据分析(三) 书接pandas数据分析(二) 文章目录DataFrame数据处理与分...
DC-DC升压模块隔离高压稳压... 特点● 效率高达 80%● 2*2英寸标准封装● 单双电压输出● 价格低● 大于600V高压,稳压输...
Java【多线程基础2】 Th... 文章目录前言一、Thread类1, 构造方法2, 常用成员属性3, 常用成员方法3.1, start...
TDK| 电源——反激变压器设... 电源参数根据功率、输入输出的情况,我们选择反激电源拓扑。反激式变压器的优点有:1、 电...
Python:判断语句 目录一、布尔类型1.1定义1.2获取二、逻辑运算符2.1and运算符2.2or运算符2.2not运算...