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

MySQL修炼手册6:子查询入门:在查询中嵌套查询

目录

  • 写在开头
  • 1 子查询基础概念
    • 1.1 了解子查询的基本概念
    • 1.2 子查询与主查询的关系
  • 2 标量子查询详细展开
    • 2.1 学会使用标量子查询
      • 2.1.1 在SELECT语句中使用
      • 2.1.2 在WHERE子句中使用
      • 2.1.3 在ORDER BY子句中使用
    • 2.2 标量子查询在条件判断中的应用
      • 2.2.1 使用比较运算符
      • 2.2.2 使用逻辑运算符
    • 2.3 小结
  • 3 行子查询
    • 3.1 使用行子查询获取多行数据
      • 3.1.1 使用IN子查询进行条件判断
      • 3.1.2 使用EXISTS子查询进行存在性判断
      • 3.1.3 使用ANY和ALL子查询进行比较
    • 3.2 行子查询的嵌套应用
      • 3.2.1 多层嵌套查询
      • 3.2.2 使用行子查询进行数据集合
      • 3.2.3 使用行子查询进行数据更新
      • 3.2.4 使用行子查询进行数据删除
      • 3.2.5 使用行子查询进行数据插入
    • 3.3 行子查询的综合应用
  • 写在最后

写在开头

MySQL数据库作为一种强大而灵活的关系型数据库管理系统,提供了多种高级查询工具,其中子查询是一项强大而丰富的功能。在本篇文章中,我们将深入研究MySQL中子查询的基础概念,重点关注标量子查询和行子查询,以及它们在实际查询中的嵌套应用。为了更好地演示子查询的应用,我们将以创建水果表为例,展示实际场景中如何巧妙地运用子查询。

1 子查询基础概念

1.1 了解子查询的基本概念

在MySQL中,子查询是指在另一个查询内部执行的查询语句。它允许我们在一个查询中引用另一个查询的结果,从而在一个复杂的查询中实现更灵活和复杂的逻辑。

子查询通常用于解决以下情况:

  • 复杂条件判断: 当需要根据某个条件的复杂逻辑来过滤数据时,可以使用子查询在条件中进行逻辑判断。

  • 精细数据筛选: 在某些场景下,我们需要获取某个条件下的精细数据,而这个条件的计算可能需要嵌套查询来完成。

  • 动态数据源: 有时候,我们需要根据一个查询的结果来动态确定另一个查询的数据源,这时子查询就可以派上用场。

1.2 子查询与主查询的关系

子查询与主查询之间存在一种父子关系。主查询是包含子查询的外部查询,而子查询则是在主查询内部执行。子查询的结果可以影响主查询的结果集,从而实现更为复杂和具体的数据获取。

为了更好地演示子查询的应用,我们将通过创建一张水果表来展示实际的场景。

-- 创建水果表
CREATE TABLE fruits (fruit_id INT PRIMARY KEY,fruit_name VARCHAR(50)
);-- 插入一些示例数据
INSERT INTO fruits (fruit_id, fruit_name) VALUES
(1, '苹果'),
(2, '香蕉'),
(3, '橙子'),
(4, '葡萄');-- 创建水果价格表
CREATE TABLE fruit_prices (fruit_id INT PRIMARY KEY,price DECIMAL(5, 2)
);-- 插入一些示例数据
INSERT INTO fruit_prices (fruit_id, price) VALUES
(1, 2.50),
(2, 1.20),
(3, 1.80),
(4, 3.00);

上述创建了一个简单的水果表,包含水果的ID和名称。接下来,我们将使用子查询来演示子查询基础概念的运用。

2 标量子查询详细展开

2.1 学会使用标量子查询

标量子查询是一种强大的工具,能够返回单一值,常常用于需要在主查询中获取一个标量值的情况。以下是一些标量子查询的常见应用方法:

2.1.1 在SELECT语句中使用

标量子查询可以嵌套在SELECT语句中,用于获取某个特定条件的单一值。例如,我们想要获取水果表中最贵的水果价格:

SELECT MAX(price) 
FROM fruit_prices 
WHERE fruit_id = (SELECT fruit_id FROM fruits WHERE fruit_name = '苹果');

在这个例子中,标量子查询用于获取水果表中名为“苹果”的水果ID,然后主查询使用这个ID来获取相应水果的最高价格。

2.1.2 在WHERE子句中使用

标量子查询在WHERE子句中的应用非常广泛。例如,我们想要获取水果表中价格高于平均价格的水果信息:

SELECT *
FROM fruits
WHERE price > (SELECT AVG(price) FROM fruit_prices);

这里的标量子查询返回水果价格的平均值,主查询则通过比较水果价格和平均值来筛选符合条件的水果信息。

2.1.3 在ORDER BY子句中使用

标量子查询还可以在ORDER BY子句中用于动态排序。例如,我们想要按照水果价格的相对位置进行排序:

SELECT *
FROM fruits
ORDER BY ABS(price - (SELECT AVG(price) FROM fruit_prices)) DESC;

在这个例子中,标量子查询用于计算每个水果价格与平均价格的差值,主查询通过这个差值的绝对值进行降序排序。

2.2 标量子查询在条件判断中的应用

标量子查询在条件判断中发挥着重要的作用,使得我们能够更灵活地根据子查询的结果进行判断。以下是一些标量子查询在条件判断中的应用方法:

2.2.1 使用比较运算符

比较运算符如=, >, <, >=, <=等可以与标量子查询结合使用。例如,我们想要获取水果价格高于其他水果平均价格的水果:

SELECT *
FROM fruits
WHERE price > (SELECT AVG(price) FROM fruit_prices WHERE fruit_id <> fruits.fruit_id);

在这个例子中,标量子查询用于计算除当前水果外其他水果的平均价格,主查询通过比较水果价格和平均价格来筛选符合条件的水果信息。

2.2.2 使用逻辑运算符

逻辑运算符如AND, OR, NOT等也可以与标量子查询结合使用。例如,我们想要获取价格高于平均价格且销售量大于100的水果:

SELECT *
FROM fruits
WHERE price > (SELECT AVG(price) FROM fruit_prices)AND sales > (SELECT MAX(sales) FROM fruit_sales);

在这个例子中,标量子查询分别用于获取价格平均值和销售量的最大值,主查询通过逻辑运算符来组合条件,筛选出符合条件的水果信息。

2.3 小结

标量子查询的灵活性使得它在各种场景下都能发挥重要作用。通过在不同部分的查询语句中嵌套标量子查询,我们能够更加高效、动态地获取需要的信息,使得查询更具弹性。在实际应用中,根据具体需求合理使用标量子查询,将为查询的复杂逻辑提供便利和效率提升。

3 行子查询

3.1 使用行子查询获取多行数据

行子查询是一种返回多行数据的子查询类型,在实际应用中,它常常用于条件判断、过滤和数据集合的操作。

3.1.1 使用IN子查询进行条件判断

假设我们想要获取水果价格表中价格在2.00以上的水果信息,我们可以使用IN子查询:

SELECT *
FROM fruit_prices
WHERE fruit_id IN (SELECT fruit_id FROM fruit_prices WHERE price > 2.00);

在这个例子中,行子查询用于获取价格在2.00以上的水果ID,主查询通过IN运算符来筛选出符合条件的水果价格信息。

3.1.2 使用EXISTS子查询进行存在性判断

我们想要找出水果表中至少有一种价格在2.00以上的水果的所有水果信息。可以使用EXISTS子查询:

SELECT *
FROM fruits
WHERE EXISTS (SELECT 1 FROM fruit_prices WHERE fruit_prices.fruit_id = fruits.fruit_id AND price > 2.00);

在这个例子中,行子查询用于判断是否存在价格在2.00以上的水果,主查询通过EXISTS来筛选出符合条件的水果信息。

3.1.3 使用ANY和ALL子查询进行比较

想要找出水果价格表中价格高于所有水果平均价格的水果信息,可以使用ANY和ALL子查询:

-- 使用ANY子查询
SELECT *
FROM fruit_prices
WHERE price > ANY (SELECT AVG(price) FROM fruit_prices);-- 使用ALL子查询
SELECT *
FROM fruit_prices
WHERE price > ALL (SELECT AVG(price) FROM fruit_prices);

在这两个例子中,行子查询用于获取水果价格的平均值,主查询通过ANY和ALL运算符来比较价格是否高于平均价格,分别得到符合条件的水果信息。

3.2 行子查询的嵌套应用

3.2.1 多层嵌套查询

有时候,我们需要进行多层嵌套查询,以满足更复杂的条件。例如,找出水果表中价格高于所有水果平均价格并且数量大于2的水果信息:

SELECT *
FROM fruits
WHERE fruit_id IN (SELECT fruit_id FROM fruit_prices WHERE price > ALL (SELECT AVG(price) FROM fruit_prices))
AND fruit_id IN (SELECT fruit_id FROM order_items WHERE quantity > 2);

在这个例子中,我们嵌套使用了两个子查询,分别用于条件判断水果价格和水果数量是否满足条件,主查询通过AND逻辑运算符连接这两个条件,得到符合条件的水果信息。

3.2.2 使用行子查询进行数据集合

行子查询还可以用于数据集合的操作,例如,获取水果价格表中价格最高的两种水果:

SELECT *
FROM fruit_prices
WHERE price IN (SELECT price FROM fruit_prices ORDER BY price DESC LIMIT 2);

在这个例子中,行子查询用于获取价格最高的两种水果的价格,主查询通过IN运算符来筛选出相应的水果价格信息。

3.2.3 使用行子查询进行数据更新

行子查询不仅可以在查询时使用,还可以在数据更新时发挥作用。假设我们想要将水果价格表中价格高于平均价格的水果涨价20%:

UPDATE fruit_prices
SET price = price * 1.2
WHERE price > (SELECT AVG(price) FROM fruit_prices);

在这个例子中,行子查询用于获取水果价格的平均值,主查询通过比较价格是否高于平均价格,更新符合条件的水果价格。

3.2.4 使用行子查询进行数据删除

行子查询还可以在数据删除时使用。例如,我们想要删除水果价格表中价格低于某个阈值的水果记录:

DELETE FROM fruit_prices
WHERE price < (SELECT threshold_price FROM config_table);

在这个例子中,行子查询用于获取阈值价格,主查询通过比较价格是否低于阈值,删除符合条件的水果价格记录。

3.2.5 使用行子查询进行数据插入

行子查询还可用于数据插入的操作。假设我们想要将另一张表的符合条件的数据插入到水果价格表中:

INSERT INTO fruit_prices (fruit_id, price)
SELECT fruit_id, base_price * 1.1
FROM base_prices
WHERE base_price > (SELECT AVG(base_price) FROM base_prices);

在这个例子中,行子查询用于获取基准价格的平均值,主查询通过比较基准价格是否高于平均价格,将符合条件的水果价格插入到水果价格表中。

3.3 行子查询的综合应用

在实际应用中,行子查询的综合应用可以更加复杂,例如,通过行子查询在多个表之间进行数据匹配,筛选出复杂条件下的数据。这里提供的例子只是冰山一角,实际应用中的场景可能更为多样和复杂。

在使用行子查询时,需要注意查询的效率和性能,确保查询的数据量不会过大,以及索引的合理使用,以提高查询效率。

写在最后

通过本文的学习,我们深入了解了MySQL中子查询的基础概念、标量子查询和行子查询的应用。同时,通过实际场景中水果表的演示,我们展示了如何在查询中嵌套子查询,使得查询更加灵活和强大。希望本文能够帮助读者更好地掌握MySQL中子查询的使用方法,并在实际工作中灵活运用这一强大的功能。如果您对MySQL修炼手册系列感兴趣,请继续关注我们的后续文章。感谢您的阅读!

相关文章:

MySQL修炼手册6:子查询入门:在查询中嵌套查询

目录 写在开头1 子查询基础概念1.1 了解子查询的基本概念1.2 子查询与主查询的关系 2 标量子查询详细展开2.1 学会使用标量子查询2.1.1 在SELECT语句中使用2.1.2 在WHERE子句中使用2.1.3 在ORDER BY子句中使用 2.2 标量子查询在条件判断中的应用2.2.1 使用比较运算符2.2.2 使用…...

01章【JAVA开发入门】

计算机基本概念 计算机组成原理 计算机组装 计算机&#xff1a;电子计算机&#xff0c;俗称电脑。是一种能够按照程序运行&#xff0c;自动、高速处理海量数据的现代化智能电子设备。由硬件和软件所组成&#xff0c;没有安装任何软件的计算机称为裸机。常见的形式有台式计算机、…...

ARM day1

一、概念 ARM可以工作的七种模式用户、系统、快中断、中断、管理、终止、未定义ARM核的寄存器个数 37个32位长的寄存器&#xff0c;当前处理器的模式决定着哪组寄存器可操作&#xff0c;且任何模式都可以存取&#xff1a; PC(program counter程序计数器) CPSR(current program…...

ImageNet Classification with Deep Convolutional 论文笔记

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…...

Spring Boot中加@Async和不加@Async有什么区别?设置核心线程数、设置最大线程数、设置队列容量是什么意思?直接在yml中配置线程池

在 Spring 中&#xff0c;Async 注解用于将方法标记为异步执行的方法。当使用 Async 注解时&#xff0c;该方法将在单独的线程中执行&#xff0c;而不会阻塞当前线程。这使得方法可以在后台执行&#xff0c;而不会影响主线程的执行。 在您提供的代码示例中&#xff0c;a1() 和…...

自动化理论基础(2)—开发语言之Python

一、知识汇总 掌握 Python 编程语言需要具备一定的基础知识和技能&#xff0c;特别是对于从事自动化测试等领域的工程师。以下是掌握 Python 的一些关键方面&#xff1a; 基本语法&#xff1a; 理解 Python 的基本语法&#xff0c;包括变量、数据类型、运算符、条件语句、循环…...

Spark算子(RDD)超细致讲解

SPARK算子&#xff08;RDD&#xff09;超细致讲解 map,flatmap,sortBykey, reduceBykey,groupBykey,Mapvalues,filter,distinct,sortBy,groupBy共10个转换算子 &#xff08;一&#xff09;转换算子 1、map from pyspark import SparkContext# 创建SparkContext对象 sc Spark…...

转盘寿司(100%用例)C卷 (JavaPythonC++Node.jsC语言)

寿司店周年庆,正在举办优惠活动回馈新老客户。 寿司转盘上总共有n盘寿司,prices[i]是第i盘寿司的价格,如果客户选择了第i盘寿司,寿司店免费赠送客户距离,第i盘寿司最近的下一盘寿司i,前提是prices[j]< prices[i],如果没有满足条件的j,则不赠送寿司。 每个价格的寿司都…...

【python】搭配Miniconda使用VSCode

现在的spyder总是运行出错&#xff0c;启动不了&#xff0c;尝试使用VSCode。 一、在VSCode中使用Miniconda管理的Python环境&#xff0c;可以按照以下步骤进行&#xff1a; a. 确保Miniconda环境已经安装并且正确配置。 b. 打开VSCode&#xff0c;安装Python扩展。 打开VS…...

从购买服务器到部署前端VUE项目

购买 选择阿里云服务器&#xff0c;地址&#xff1a;https://ecs.console.aliyun.com/home。学生会送一个300的满减券&#xff0c;我买了一个400多一年的&#xff0c;用券之后100多点。 使用SSH连接服务器 我选择的是vscode 中SSH工具。 安装一个插件 找到配置文件配置一下…...

python中print函数的用法

在 Python 中,print() 函数是用于输出信息到控制台的内置函数。它可以将文本、变量、表达式等内容打印出来,方便程序员进行调试和查看结果。print() 函数的基本语法如下: ``` print(*objects, sep= , end=\n, file=sys.stdout, flush=False) ``` 其中,objects 是要打印…...

SpringBoot整合MyBatis项目进行CRUD操作项目示例

文章目录 SpringBoot整合MyBatis项目进行CRUD操作项目示例1.1.需求分析1.2.创建工程1.3.pom.xml1.4.application.properties1.5.启动类 2.添加用户2.1.数据表设计2.2.pojo2.3.mapper2.4.service2.5.junit2.6.controller2.7.thymeleaf2.8.测试 3.查询用户3.1.mapper3.2.service3…...

Android Studio下载gradle反复失败

我的版本&#xff1a;gradle-5.1.1 首先检查设置路径是否正确&#xff0c;参考我的修改&#xff01; 解决方案 1.手动下载Gradle.bin Gradle Distributions 下载地址 注意根据编译器提示下载&#xff0c;我这要求下载的是bin 而不是all 2.把下载好的整个压缩包放在C:\Users\…...

【HTML5】 canvas 绘制图形

文章目录 一、基本用法二、用法详见2.0、方法属性2.1、绘制线条2.2、绘制矩形2.3、绘制圆形2.4、绘制文本2.5、填充图像 一、基本用法 canvas 标签&#xff1a;可用于在网页上绘制图形&#xff08;使用 JavaScript 在网页上绘制图像&#xff09;画布是一个矩形区域&#xff0c…...

【数据结构】二叉树-堆(top-k问题,堆排序,时间复杂度)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​ 目录 堆排序 第一种 ​编辑 第二种 …...

通过浏览器判断是否安装APP

场景 求在分享出来的h5页面中&#xff0c;有一个立即打开的按钮&#xff0c;如果本地安装了我们的app&#xff0c;那么点击就直接唤本地app&#xff0c;如果没有安装&#xff0c;则跳转到下载。 移动端 判断本地是否安装了app 首先我们可以确认的是&#xff0c;在浏览器中无…...

vivado Revision Control

2020.2 只需要git 管理 prj.xpr 和 prj.srcs/ https://china.xilinx.com/video/hardware/ip-revision-control.html Using Vivado Design Suite with Revision Control https://www.xilinx.com/video/hardware/vivado-design-suite-revision-control.html http://www.xi…...

【AI视野·今日Robot 机器人论文速览 第七十三期】Tue, 9 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Tue, 9 Jan 2024 Totally 40 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Digital Twin for Autonomous Surface Vessels for Safe Maritime Navigation Authors Daniel Menges, Andreas Von Brandis, A…...

java解析json复杂数据的第四种思路

文章目录 一、概述二、数据预览1. 接口json数据 三、代码实现1. 核心代码2. 字符串替换结果3. 运行结果 一、概述 接前两篇 java解析json复杂数据的两种思路 java解析json复杂数据的第三种思路 我们已经有了解析json数据的几种思路&#xff0c;下面介绍的方法是最少依赖情况下…...

【不用找素材】ECS 游戏Demo制作教程(1) 1.15

一、项目设置 版本&#xff1a;2022.2.0f1 &#xff08;版本太低的话会安装不了ECS插件&#xff09; 模板选择3D URP 进来后移除URP&#xff08;因为并不是真的需要&#xff0c;但也不是完全不需要&#xff09; Name: com.unity.entities.graphics Version: 1.0.0-exp.8 点击…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

提升移动端网页调试效率:WebDebugX 与常见工具组合实践

在日常移动端开发中&#xff0c;网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时&#xff0c;开发者迫切需要一套高效、可靠且跨平台的调试方案。过去&#xff0c;我们或多或少使用过 Chrome DevTools、Remote Debug…...