当前位置: 首页 > 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 点击…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...