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修炼手册系列感兴趣,请继续关注我们的后续文章。感谢您的阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/629634.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序---如何创建分包

1.在项目根目录中&#xff0c;创建分包的根目录&#xff0c;名为subpkg&#xff0c;这个名字可以自己定义 2.在 pages.json 中&#xff0c;和 pages 节点平级的位置声明 subPackages 节点&#xff0c;用来定义分包相关的结构&#xff1a; 3.在分包目录&#xff0c;点击右键新建…

Docker容器运行多个php,一个正常另一个报502

问题是解决了&#xff0c;但是并不知道问题出在哪儿 docker-compse.yml文件并没有什么改动 在解决这个问题的过程中多次重新打包镜像配置运行容器&#xff0c;没有任何效果&#xff0c;最多就是原本正常的站点也变得不可用 我在看nginx的配置时&#xff0c;发现可以在locati…

Python UI框架库之kivy使用详解

概要 Python是一种广泛使用的编程语言&#xff0c;而Kivy是一个用于创建跨平台移动应用和多点触控应用的开源Python框架。Kivy的设计目标是提供一种简单而强大的方式来构建富有创意的用户界面和交互体验。本文将详细介绍Kivy的基本概念、核心特性、布局系统、用户界面设计和实…

手写webpack核心原理,支持typescript的编译和循环依赖问题的解决

主要知识点 babel读取代码的import语句算法&#xff1a;bfs遍历依赖图为浏览器定义一个require函数的polyfill算法&#xff1a;用记忆化搜索解决require函数的循环依赖问题 Quick Start GitHub&#xff1a;https://github.com/Hans774882968/mini-webpack npm install npm…

[zabbix] zabbix监控其他

一、温习zabbix自定义监控 二、zabbix 自动发现与自动注册 2.1 zabbix 自动发现 //zabbix 自动发现&#xff08;对于 agent2 是被动模式&#xff09; zabbix server 主动的去发现所有的客户端&#xff0c;然后将客户端的信息登记在服务端上。 缺点是如果定义的网段中的主机数…

Android系统开发之浅谈广播接收器回调

广播接器BroadcastReceiver 广播Intent和广播接收器BroadcastReceiver&#xff0c;是大家android开发用的特别多的二个控件。 那如何从系统角度看待广播和广播接收器呢&#xff1f; 对于静态注册BroadcastReceiver和动态注册的BroadcastReceiver是如何回调其onReceive方法呢…

安全帽/反光衣检测AI边缘计算智能分析网关V4如何修改IP地址?

智能分析网关V4是TSINGSEE青犀推出的一款AI边缘计算智能硬件&#xff0c;硬件采用BM1684芯片&#xff0c;集成高性能8核ARM A53&#xff0c;主频高达2.3GHz&#xff0c;INT8峰值算力高达17.6Tops&#xff0c;FB32高精度算力达到2.2T&#xff0c;硬件内置了近40种AI算法模型&…

MySQL索引和视图基础练习题

一、创建表的要求 学生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept) 学号&#xff0c;姓名&#xff0c;性别&#xff0c;年龄&#xff0c;所在系Sno为主键 课程表&#xff1a;Course (Cno, Cname,) 课程号&#xff0c;课程名Cno为主键 学生选课表&#xff1a;SC (S…

C++(1) —— 基础语法入门

目录 一、C初识 1.1 第一个C程序 1.2 注释 1.3 变量 1.4 常量 1.5 关键字 1.6 标识符命名规则 二、数据类型 2.1 整型 2.2 sizeof 关键字 2.3 实型&#xff08;浮点型&#xff09; 2.4 字符型 2.5 转义字符 2.6 字符串型 2.7 布尔类型 bool 2.8 数据的输入 三…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -投票帖子排行实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

Redis实现全局唯一Id

一、全局唯一ID 每个店铺都可以发布优惠券&#xff1a; 当用户抢购时&#xff0c;就会生成订单并保存到tb_voucher_order这张表中&#xff0c;而订单表如果使用数据库自增ID就存在一些问题&#xff1a; id的规律性太明显 受单表数据量的限制 场景分析&#xff1a;如果我们的…

两整数之和

题目链接 两整数之和 题目描述 注意点 不使用 运算符 和 - ​​​​​​​&#xff0c;计算并返回两整数之和-1000 < a, b < 1000 解答思路 需要用位运算来模拟加法&#xff0c;关键是要找到相加的和以及进位1的部分。如果不考虑进位的话&#xff0c;相加可以运用异…

Redis内部数据结构Dict结构详解

目录 dict的数据结构定义 dict的创建&#xff08;dictCreate&#xff09; dict的查找&#xff08;dictFind&#xff09; dict的插入&#xff08;dictAdd和dictReplace&#xff09; dict的删除&#xff08;dictDelete&#xff09; 如果你使用过Redis&#xff0c;一定会像我一样对…

STM32F103标准外设库——GPIO 输入、输出 (五)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

高级 Python 面试问题与解答

文章目录 专栏导读1.什么是PIP&#xff1f;2.什么是 zip 函数&#xff1f;3.Python 中的 __init __ () 是什么&#xff1f;4.Python 中的访问说明符是什么&#xff1f;5.Python 中的单元测试是什么&#xff1f;6.Python全局解释器锁&#xff08;GIL&#xff09;&#xff1f;7.P…

浪花 - 搜索标签前后端联调

前传&#xff1a;浪花 - 根据标签搜索用户-CSDN博客 目录 一、完善后端搜索标签接口 二、前后端搜索标签接口的对接 1. 使用 Axios 发送请求 2. 解决跨域问题 3. Axios 请求传参序列化 4. 接收后端响应数据 5. 处理后端响应数据格式 6. 搜索结果为空的页面展示 附&am…

区域入侵/区域人数统计AI边缘计算智能分析网关V4如何修改IP地址?

智能分析网关V4是TSINGSEE青犀推出的一款AI边缘计算智能硬件&#xff0c;硬件采用BM1684芯片&#xff0c;集成高性能8核ARM A53&#xff0c;主频高达2.3GHz&#xff0c;INT8峰值算力高达17.6Tops&#xff0c;FB32高精度算力达到2.2T&#xff0c;硬件内置了近40种AI算法模型&…

C++ 后端面试 - 题目汇总

文章目录 &#x1f37a; 非技术问题&#x1f37b; 基本问题&#x1f942; 请自我介绍&#xff1f;&#x1f942; 你有什么问题需要问我的&#xff1f; &#x1f37b; 加班薪资&#x1f942; 你对加班有什么看法&#xff1f;&#x1f942; 你的薪资期望是多少&#xff1f;【待回…

如何避免知识付费小程序平台的陷阱?搭建平台的最佳实践

随着知识经济的兴起&#xff0c;知识付费已经成为一种趋势。越来越多的人开始将自己的知识和技能进行变现&#xff0c;而知识付费小程序平台则成为了一个重要的渠道。然而&#xff0c;市面上的知识付费小程序平台琳琅满目&#xff0c;其中不乏一些不良平台&#xff0c;让老实人…

SpringBoot ES 聚合后多字段加减乘除

SpringBoot ES 聚合后多字段加减乘除 在SpringData Elasticsearch中&#xff0c;聚合统计的原理主要依赖于Elasticsearch本身的聚合框架。Elasticsearch提供了强大的聚合功能&#xff0c;使得你可以对文档进行各种计算和统计&#xff0c;从而得到有关数据集的有用信息。 Elast…