当前位置: 首页 > news >正文

MySQL:子查询

MySQL 子查询

MySQL中的子查询是一个强大的功能,子查询是指在一个查询语句中嵌套另一个查询语句的情况。嵌套查询中的内部查询语句可以使用外部查询语句的结果来进行过滤、联接或作为子查询的值,它允许我们在一个查询内部嵌套另一个查询。通过子查询可以实现多表查询

子查询可以在 SELECTUPDATEDELETEFROM 等语句中使用,而且可以进行多层嵌套。在实际开发时,子查询经常出现在 WHERE 子句中。

子查询的类型

  1. 标量子查询:返回单个值的子查询,常用于比较操作。
  2. 列子查询:返回一列值的子查询,常用在IN、ANY、ALL等比较操作中。
  3. 行子查询:返回一行数据的子查询,通常与单行比较操作符(如=)一起使用。
  4. 表子查询:返回多行多列数据的子查询,结果集通常被当作一个临时表在FROM子句中引用。

子查询语句

子查询语句需要使用圆括号括起来,子查询的结果通常被用作外部查询的条件或数据源

SELECT lastName, firstName 
FROM employees 
WHERE officeCode IN (SELECT officeCode FROM offices WHERE country = 'USA');

在这里插入图片描述

MySQL会先执行子查询语句,并将查询结果返回到父查询,执行父查询。

子查询的功能也可以通过表连接完成,但是子查询会使 SQL 语句更容易阅读和编写。

一般来说,表连接(内连接和外连接等)都可以用子查询替换,但反过来却不一定,有的子查询不能用表连接来替换。子查询比较灵活、方便、形式多样,适合作为查询的筛选条件,而表连接更适合于查看连接表的数据。

FROM 子句中的子查询

可以在 FROM 子句中使用子查询(Subquery),使用它来创建一个派生表(Derived table)或临时表,然后将该表与其他表进行连接或联接操作

SELECT t1.column1, t2.column2
FROM (SELECT column1 FROM table1 WHERE condition) AS t1
JOIN table2 AS t2 ON t1.column1 = t2.column1;'''
子查询根据给定的条件检索column1,将子查询结果命名为t1,在父查询中将t1当作一张表使用,与t2进行连接,使用公共列进行联接操作。
'''
SELECT t1.column1, t1.column2
FROM (SELECT column1, column2FROM table1WHERE column3 IN (SELECT column3 FROM table2 WHERE condition)
) AS t1;

WHERE 子句中的子查询

在子查询的 WHERE 子句中,可以使用各种条件表达式和逻辑运算符来指定筛选条件。根据具体的需求,可以在子查询中使用 WHERE 子句来进行以下操作:

  1. 单个条件筛选:
SELECT column1, column2
FROM table1
WHERE column1 IN (SELECT column1 FROM table2 WHERE condition);
  1. 多个条件筛选:
SELECT column1, column2
FROM table1
WHERE column1 IN (SELECT column1 FROM table2 WHERE condition1 AND condition2);
  1. 范围筛选:
SELECT column1, column2
FROM table1WHERE column1 IN (SELECT column1 FROM table2 WHERE column2 BETWEEN value1 AND value2);
  1. 子查询中的多级嵌套:
SELECT column1, column2
FROM table1
WHERE column1 IN (SELECT column1 FROM table2 WHERE column2 IN (SELECT column2 FROM table3 WHERE condition));

子查询中的 IN 、NOT IN 子句

在子查询中,可以使用 IN 和 NOT IN 运算符来进行集合匹配和排除的操作,判断目标列是否在子查询集合中。

子查询中的 EXISTS 子句

子查询中,EXISTSNOT EXISTS 是用于判断子查询是否返回数据的条件运算符。通常以关联子查询形式使用。

若返回结果为true,则会继续执行父查询,否则不执行。

SELECT column_list FROM table_name
WHERE EXISTS / NOT EXISTS (condition)

EXISTS用于判断指定的子查询是否返回了至少一行结果。如果子查询返回了至少一行结果,那么EXISTS

NOT EXISTS则相反,用于判断指定的子查询是否不返回任何行结果。如果子查询没有返回任何行结果,那么NOT EXISTS条件会被认为是满足的。

关联子查询

关联子查询(Correlated Subquery)是指在子查询中引用了外部查询的列或表,在父子查询之间建立了相关联关系

关联子查询可根据外部查询的每个结果进行计算和筛选,因此它的执行频率与外部查询的结果集大小相关。

语法结构:

SELECT column1, column2
FROM table1
WHERE conditionAND column3 OPERATOR (SELECT column4FROM table2WHERE table2.column5 = table1.column6);

关联子查询常用的运算符包括 INANYALL 等用于比较和筛选数据的操作符。根据具体的需求,关联子查询可以在 SELECTWHEREHAVING 等子句中使用。

注意,关联子查询的性能通常较低,因为它会根据外部查询的结果执行多次。为了优化性能,可以考虑使用其他表达方式或采取其他优化措施,如合理使用联接操作、索引优化等。

注意事项

  1. 数据量和性能:子查询可能会引入额外的开销,特别是在处理大量数据、结果集很大时。对于复杂的查询,子查询可能会增加查询的执行时间。要确保子查询的效率,并根据需要考虑优化查询或使用其他查询方法。

  2. 嵌套层数:过多的嵌套子查询可能导致查询难以理解和管理,导致查询复杂度增加。可以考虑使用连接操作(JOIN)或其他查询优化技术来改进查询性能。

  3. 子查询结果的准确性:在使用子查询时,必须确保子查询返回的结果是准确的。这包括正确的筛选条件、关联关系以及使用正确的聚合函数(如果适用)等。如果子查询结果不准确,可能会导致整个查询结果不正确。

  4. 子查询的引用:在某些情况下,可能需要在子查询中引用外部查询的列或条件。确保正确地使用别名(ALIAS)和适当的查询引用方式,以避免语法错误和结果不符合预期。

  5. 子查询的优化:在某些情况下,子查询可以通过调整查询逻辑、使用临时表或引入适当的索引等方法进行优化。考虑优化子查询以提高查询性能和效率。

  6. 只出现在子查询中而没有出现在父查询中的表不能包含在输出列中
    多层嵌套子查询的最终数据集只包含父查询(即最外层的查询)的 SELECT 子句中出现的字段,而子查询的输出结果通常会作为其外层子查询数据源或用于数据判断匹配。

相关文章:

MySQL:子查询

MySQL 子查询 MySQL中的子查询是一个强大的功能,子查询是指在一个查询语句中嵌套另一个查询语句的情况。嵌套查询中的内部查询语句可以使用外部查询语句的结果来进行过滤、联接或作为子查询的值,它允许我们在一个查询内部嵌套另一个查询。通过子查询可以…...

C++—— IO流

一、C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf()和printf()。 scanf():从标准输入设备(键盘)中读取数据,并将值存放在变量中。 printf():将指定的文字/字符串输出到标准输出设备(…...

vue+node后台处理大文件切片上传--前端部分

本文主要介绍,在vue3vite项目下,如何进行有效的大文件上传,本文章主要讲大文件切片上传方式,并提供简单的demo代码供参考 首先,请确保已经创建好项目,这一步跳过。 1、为了选择合适的文件,我们…...

【通俗理解】艺术与数学交融

【通俗理解】艺术与数学交融 艺术与数学的奇妙交融 你可以把艺术比作一个“梦幻花园”,它充满了无限的可能性和美感。而数学则是一把“精密钥匙”,它能够解开花园中的秘密,揭示美的内在结构。 艺术与数学交融的核心作用 组件/步骤描述艺术表…...

深入探讨 Docker 容器文件系统

引言 随着云计算和微服务架构的兴起,Docker 容器技术迅速成为开发和运维人员的首选工具。Docker 容器不仅提供了一种轻量级的虚拟化方式,还简化了应用程序的部署和管理。在众多的技术细节中,Docker 容器文件系统是一个至关重要的组成部分。本…...

《LeetCode热题100》---<4.子串篇三道>

本篇博客讲解LeetCode热题100道子串篇中的三道题 第一道:和为 K 的子数组 第二道:滑动窗口最大值 第三道:最小覆盖子串 第一道:和为 K 的子数组(中等) 法一:暴力枚举 class Solution {public in…...

全国区块链职业技能大赛样题第9套前端源码

后端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746050 前端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746216 智能合约+数据库表设计:https://blog.csdn.net/Qhx20040819/article/details/140746646 登录 ​ 用户管理...

如何提高编程面试成功率:LeetCode Top 100 问题及解答解析(详细面试宝典)

以下是 LeetCode Top 100 面试必备题目及其解决方案示例。这些题目涵盖了数据结构、算法、动态规划、回溯等多种重要的面试话题。希望各位同学有所收货,早日脱离底层到达彼岸! 1. Two Sum 题目: 给定一个整数数组 nums 和一个目标值 target&#xff0c…...

K-近邻和神经网络

K-近邻(K-NN, K-Nearest Neighbors) 原理 K-近邻(K-NN)是一种非参数分类和回归算法。K-NN 的主要思想是根据距离度量(如欧氏距离)找到训练数据集中与待预测样本最近的 K 个样本,并根据这 K 个…...

用EasyV全景图低成本重现真实场景,360°感受数字孪生

全景图,即借助绘画、相片、视频、三维模型等形式,通过广角的表现手段,尽可能多表现出周围的环境。避免了一般平面效果图视角单一,不能带来全方位视角的缺陷,能够全方位的展示360度球型范围内的所有景致,最大…...

【Golang 面试 - 进阶题】每日 3 题(九)

✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…...

孟德尔随机化、R语言,报错,如何解决?

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…...

一文剖析高可用向量数据库的本质

面对因电力故障、网络问题或人为操作失误等导致的服务中断,数据库系统高可用能够保证系统在这些情况下仍然不间断地提供服务。如果数据库系统不具备高可用性,那么系统就需要承担停机和数据丢失等重大风险,而这些风险极有可能造成用户流失&…...

JavaScript青少年简明教程:异常处理

JavaScript青少年简明教程:异常处理 在 JavaScript 中,异常指的是程序执行过程中出现的错误或异常情况。这些错误可能导致程序无法正常执行,甚至崩溃。ECMA-262规范了多种JavaScript错误类型,这些类型都继承自Error基类。主要的错…...

科普文:Lombok使用及工作原理详解

1. 概叙 Lombok是什么? Project Lombok 是一个 JAVA 库,它可以自动插入编辑器和构建工具,为您的 JAVA 锦上添花。再也不要写另一个 getter/setter 或 equals 等方法,只要有一个注注解,你的类就有一个功能齐全的生成器…...

飞致云开源社区月度动态报告(2024年7月)

自2023年6月起,中国领先的开源软件公司FIT2CLOUD飞致云以月度为单位发布《飞致云开源社区月度动态报告》,旨在向广大社区用户同步飞致云旗下系列开源软件的发展情况,以及当月主要的产品新版本发布、社区运营成果等相关信息。 飞致云开源大屏…...

mybatis-plus——实现动态字段排序,根据实体获取字段映射数据库的具体字段

前言 前端需要根据表头的点击控件可以排序,虽然前端能根据当前页的数据进行对应字段的排序,但也仅局限于实现当前页的排序,无法满足全部数据的排序,所以需要走接口的查询进行排序,获取最全的排序数据 实现方案 前端…...

redis:Linux安装redis,redis常用的数据类型及相关命令

1. 什么是NoSQL nosql[not only sql]不仅仅是sql。所有非关系型数据库的统称。除去关系型数据库之外的都是非关系数据库。 1.1为什么使用NoSQL ​ NoSQL数据库相较于传统关系型数据库具有灵活性、可扩展性和高性能等优势,适合处理非结构化和半结构化数据&#xff0c…...

JavaScript 和 HTML5 Canvas实现图像绘制与处理

前言 JavaScript 和 HTML5 的 canvas 元素提供了强大的图形和图像处理功能,使得开发者能够在网页上创建动态和交互式的视觉体验。这里我们将探讨如何使用 canvas 和 JavaScript 来处理图像加载,并在其上进行图像绘制。我们将实现一个简单的示例&#xf…...

Java之Java基础二十(集合[上])

Java 集合框架可以分为两条大的支线: ①、Collection,主要由 List、Set、Queue 组成: List 代表有序、可重复的集合,典型代表就是封装了动态数组的 ArrayList 和封装了链表的 LinkedList;Set 代表无序、不可重复的集…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...

云原生周刊:k0s 成为 CNCF 沙箱项目

开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...

Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践

前言:本文将向开发者介绍一款创新性协作工具——Neko虚拟浏览器。在数字化协作场景中,跨地域的团队常需面对实时共享屏幕、协同编辑文档等需求。通过本指南,你将掌握在Ubuntu系统中使用容器化技术部署该工具的具体方案,并结合内网…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...

深入解析光敏传感技术:嵌入式仿真平台如何重塑电子工程教学

一、光敏传感技术的物理本质与系统级实现挑战 光敏电阻作为经典的光电传感器件,其工作原理根植于半导体材料的光电导效应。当入射光子能量超过材料带隙宽度时,价带电子受激发跃迁至导带,形成电子-空穴对,导致材料电导率显著提升。…...