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

效率提升秘籍:用快马AI一键生成nt动漫角色管理模块代码

最近在开发一个nt动漫相关的项目&#xff0c;其中角色管理模块是必不可少的部分。这个模块需要实现角色列表展示、详情查看、新增、编辑和删除等功能。传统开发方式下&#xff0c;光是搭建这些基础功能就要花费不少时间。不过我发现用InsCode(快马)平台可以快速生成这些重复性高…...

seo公司招聘的实习机会有哪些

SEO公司招聘的实习机会有哪些&#xff1f; 在当今数字化时代&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;已经成为企业在网络上获得高流量和高曝光度的关键手段。随着越来越多的企业意识到SEO的重要性&#xff0c;SEO公司也在不断扩展&#xff0c;吸引大量优秀的实习…...

FPGA新手避坑指南:用Xilinx MIG IP核驱动DDR3内存的完整配置流程(以MT41J256M16为例)

FPGA新手避坑指南&#xff1a;Xilinx MIG IP核驱动DDR3内存的完整配置流程&#xff08;以MT41J256M16为例&#xff09; 第一次接触FPGA与DDR3接口设计时&#xff0c;面对密密麻麻的芯片手册和复杂的IP核配置界面&#xff0c;很多工程师都会感到无从下手。本文将手把手带你完成从…...

SDMatte高清人像抠图作品集:影视级海报与创意合成的幕后利器

SDMatte高清人像抠图作品集&#xff1a;影视级海报与创意合成的幕后利器 1. 开篇&#xff1a;当AI遇见专业级人像抠图 想象一下这样的场景&#xff1a;电影海报需要将主演从绿幕背景中完美剥离&#xff0c;电商广告要把模特无缝融入不同场景&#xff0c;艺术创作需要将人物与…...

Neo4j关系创建失败?手把手教你处理GraphRAG生成的异常ID格式(含正则清洗技巧)

Neo4j关系创建失败&#xff1f;手把手教你处理GraphRAG生成的异常ID格式&#xff08;含正则清洗技巧&#xff09; 当你满怀期待地将GraphRAG生成的知识图谱数据导入Neo4j&#xff0c;准备欣赏可视化成果时&#xff0c;却发现关系创建失败——这可能是每个数据工程师都经历过的噩…...

戴森球计划FactoryBluePrints蓝图库:从新手到专家的终极工厂建设指南

戴森球计划FactoryBluePrints蓝图库&#xff1a;从新手到专家的终极工厂建设指南 【免费下载链接】FactoryBluePrints 游戏戴森球计划的**工厂**蓝图仓库 项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints FactoryBluePrints蓝图库是戴森球计划游戏…...

聚焦 AI 智能体:2026年上市企业综合竞争力全景盘点

随着人工智能技术的深度渗透&#xff0c;AI智能体正从概念走向规模化应用&#xff0c;成为企业数字化转型的核心引擎。在A股市场中&#xff0c;多家上市公司积极布局AI智能体赛道&#xff0c;凭借各自的技术积淀与行业理解&#xff0c;推出了差异化的产品与服务。本文将聚焦五家…...

【深度验证】ArcGIS Band Collection Statistics相关性分析结果偏差的根源探究

1. 当GIS分析结果与统计软件不一致时 最近在做一个遥感数据分析项目时&#xff0c;我遇到了一个奇怪的现象&#xff1a;同样的数据集&#xff0c;在ArcGIS中使用Band Collection Statistics工具计算出的皮尔逊相关系数&#xff0c;与在Excel和R中计算的结果存在明显差异。起初我…...

跨平台终端与进程控制:从原理到实践

跨平台终端与进程控制&#xff1a;从原理到实践 【免费下载链接】node-pty Fork pseudoterminals in Node.JS 项目地址: https://gitcode.com/gh_mirrors/no/node-pty 在现代软件开发中&#xff0c;终端交互和进程管理是不可或缺的核心能力。无论是构建IDE、开发自动化工…...

Qwen3.5-2B部署实操:CentOS 7兼容性处理与依赖库降级方案

Qwen3.5-2B部署实操&#xff1a;CentOS 7兼容性处理与依赖库降级方案 1. 模型简介 Qwen3.5-2B是阿里云推出的轻量化多模态基础模型&#xff0c;属于Qwen3.5系列的小参数版本&#xff08;20亿参数&#xff09;。该模型主打低功耗、低门槛部署特性&#xff0c;特别适配端侧和边…...