【MySQL】不允许你不会使用子查询

news2024/9/20 16:54:28

🎬 博客主页:博主链接
🎥 本文由 M malloc 原创,首发于 CSDN🙉
🎄 学习专栏推荐:LeetCode刷题集!
🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
📆 未来很长,值得我们全力奔赴更美好的生活✨

在这里插入图片描述
在这里插入图片描述

文章目录

  • 😇MySQL的前情介绍
  • 😇本章详情
  • 😇子查询
    • 😇利用子查询进行过滤
    • 😇列必须匹配
    • 😇子查询和性能
  • 😇作为计算字段使用子查询
  • 🤣如何巩固学习
  • 🤣本文小结

😇MySQL的前情介绍

😁大家好呀,今天是我第N次写MySQL,也是最近才学习MySQL,也想着记录一下自己的学习过程,并且分享给大家尼!

😇本章详情

🐤本文章介绍什么是子查询以及如何使用它们。

😇子查询

前言

SELECT语句是SQL的查询。迄今为止我们所看到的所有SELECT语句都是简单查询,即从单个数据库表中检索数据的单条语句。

查询(query)

查询(query) 任何SQL语句都是查询。但此术语一般指SELECT语句。

SQL还允许创建子查询(subquery),即在其他查中的查询。为什么要这样做呢?理解这个概念的最好方法是考察几个例子。

😇利用子查询进行过滤

💐本文所有章节中使用的数据库表都是关系表(。订单存储在两个表中。对于包含订单号、客户ID订单日期的每个订单,orders表存储一行。各订单的物品存储在相关的orderitems表中。orders表不存储客户信息。它只存储客户的ID。实际的客户信息存储在customers表中。

现在,假如需要列出订购物品TNT2的所有客户,应该怎样检索?下面列出具体的步骤。

  1. 检索包含物品TNT2的所有订单的编号。
  2. 检索具有前一步骤列出的订单编号的所有客户的ID。
  3. 检索前一步骤返回的所有客户ID的客户信息。

上述每个步骤都可以单独作为一个查询来执行。可以把一条SELECT语句返回的结果用于另一条SELECT语句的WHERE子句。

也可以使用子查询来把3个查询组合成一条语句。


第一条SELECT语句的含义很明确,对于prod id为TNT2的所有订单物品,它检索其order_num列。输出列出两个包含此物品的订单:

输入

SELECT order_num FROM orderitems
	WHERE prod_id = 'TNT2';

输出
在这里插入图片描述


🌻下一步,查询具有订单20005和20007的客户ID。利用第前面章节介绍的IN子句,编写如下的SELECT语句:

输入

SELECT cust_id FROM orders
	WHERE order_num IN (20005,20007);

输出
在这里插入图片描述


现在,把第一个查询(返回订单号的那一个)变为子查询组合两个查询。请看下面的SELECT语句:

输入

SELECT cust_id FROM orders 
	WHERE order_num IN (SELECT order_num FROM WHERE prod_id = 'TNT2');

输出
在这里插入图片描述
分析

在SELECT语句中,子查询总是从内向外处理。在处理上面的SELECT语句时,MySQL实际上执行了两个操作。

首先,它执行下面的查询:
SELECT order_num FROM orderitems WHERE prod_id = 'TNT2';
此查询返回两个订单号:20005和20007。然后,这两个值以IN操作符要求的逗号分隔的格式传递给外部查询的WHERE子句。外部查询变成:
SELECT cust_id FROM orders WHERE order_num IN (20005,20007)
可以看到,输出是正确的并且前面硬编码WHERE子句所返回的值相同。


格式化SQL

格式化SQL 包含子查询的SELECT语句难以阅读和调试,特别是它们较为复杂时更是如此。如上所示把子查询分解为多行并且适当地进行缩进,能极大地简化子查询的使用


现在得到了订购物品TNT2的所有客户的ID。下一步是检索这些客户ID的客户信息。检索两列的SQL语句为:

输入

SELECT cust_name,cust_contact FROM customers
	WHERE cust_id IN (10001,10004);

可以把其中的WHERE子句转换为子查询而不是硬编码这些客户ID:

输入

SELECT cust_name,cust_contact FROM customers
	WHERE cust_id IN (SELECT cust_id FROM orders WHERE order_num 
		IN (SELECT order_num FROM orderitems WHERE prod_id = 'TNT2'));

输出
在这里插入图片描述
分析

为了执行上述SELECT语句,MySQL实际上必须执行3条SELECT语句。最里边的子查询返回订单号列表,此列表用于其外面的子查询的WHERE子句。外面的子查询返回客户ID列表,此客户ID列表用于最外层查询的WHERE子句。最外层查询确实返回所需的数据。


可见,在WHERE子句中使用子查询能够编写出功能很强并且很灵活的SQL语句。对于能嵌套的子查询的数目没有限制,不过在实际使用时由于性能的限制,不能嵌套太多的子查询。

😇列必须匹配

🌼列必须匹配 在WHERE子中使用子查询(如这里所示),应该保证SELECT语句具有与WHERE子中相同数目的列。通常子查询将返回单个列并且与单个列匹配,但如果需要也可以使用多个列。


虽然子查询一般与IN操作符结合使用,但也可以用于测试等于(=不等于 (<>)等。

😇子查询和性能

WHERE子句的位置 在同时使用ORDER BY和WHERE子句时应该让ORDER BY位于WHERE之后,否则将会产生错误(关于ORDERBY的使用,请参阅作者的前几篇文章)

😇作为计算字段使用子查询

提示

使用子查询的另一方法是创建计算字段。假如需要显示customers表中每个客户的订单总数。订单与相应的客户ID存储在orders表中。

为了执行这个操作,遵循下面的步骤。

  1. 从customers表中检索客户列表。
  2. 对于检索出的每个客户,统计其在orders表中的订单数目。

正如前两篇文章所述,可使用SELECT COUNT()对表中的行进行计数并且通过提供一条WHERE子句来过滤某个特定的客户ID,可仅对该客户的订单进行计数。例如,下面的代码对客户10001的订单进行计数:

输入

SELECT COUNT(*) AS orders FROM orders 
	WHERE cust_id = 10001;

为了对每个客户执行COUNT()计算,应该将COUNT()作为一个子查询。请看下面的代码:

输入

SELECT cust_name,cust_state, 
	(SELECT COUNT(*) FROM orders WHERE orders.cust_id = customers.cust_id) AS 
		orders FROM customers 
			ORDER BY cust_name;

输出
在这里插入图片描述
分析

这条SELECT语句对customers表中每个客户返回3列:cust_name、cust_ state和orders。orders是一个计算字段,它是由圆括号中的子查询建立的。该子查询对检索出的每个客户执行一次。在此例子中,该子查询执行了5次,因为检索出了5个客户。

子查询中的WHERE子句与前面使用的WHERE子句稍有不同,因为它使用了完全限定列名。下面的语句告诉SQL比较orders表中的cust_id与当前正从customers表中检索的cust_id:
WHERE orders.cust_id = customers.cust_id

相关子查询(correlated subquery)

涉及外部查询的子查询。
这种类型的子查询称为相关子查询。任何时候只要列名可能有多义性,就必须使用这种语法(表名和列名由一个句点分隔)。为什么这样?我们来看看如果不使用完全限定的列名会发生什么情况:

输入

SELECT cust_name,cust_state,
	(SELECT COUNT(*) FROM orders WHERE cust_id = cust_id) AS
		orders FROM customers 
			ORDER BY cust_name;

输出
在这里插入图片描述

分析

显然,返回的结果不正确(请比较前面的结果),那么,为什么会这样呢?有两个cust_id列,一个在customers中,另一个在orders中,需要比较这两个列以正确地把订单与它们相应的顾客匹配。如果不完全限定列名,MySQL将假定你是对orders表中的cust_id进行自身比较。而SELECT COUNT(*) FROM orders WHERE cust id= cust_id;总是返回orders表中的订单总数(因为MySQL查看每个订单的cust id是否与本身匹配,当然,它们总是匹配的)。

🤣如何巩固学习

提示:在学习的过程中,我们需要先自行进行思考,而不是一遇到不会的就放弃思考直接看答案,如果最后遇到真的不会的题目,我们可以适当的进行观看答案,看自己的思路是否正确,在作出正确的判断

🤣本文小结

本文章学习了什么是子查询以及如何使用它们。子查询最常见的使用是在WHERE子句的IN操作符中,以及用来填充计算列。我们举了这两种操作类型的例子。

好啦今日的分享到这里就结束啦,我是爱你们的M malloc希望可以帮助到你们噢,最后别忘记三连啦!!

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

Web_php_unserialize

源码解析 依旧是反序化漏洞&#xff0c;本源码定义了一个Demo的类&#xff0c;里包含了__construct、__destruct()、__wakeup三个方法 简介&#xff1a; __construct()方法是在创建对象时&#xff0c;调用赋初值 __destruct()方法是在对象不再使用时自动调用&#xff0c;这里的…

Jest单元测试Vue项目实践

​ 做单元测试的优点&#xff1a; 1.减少bug避免低级错误 2.提高代码运行质量 3.快速定位问题 4.减少调试时间&#xff0c;提高开发效率 5.便于重构 Jest安装&#xff1a; npm install babel-jest jest jest-serializer-vue vue/test-utils vue/cli-plugin-unit-jest -D…

好用到飞起的新项目「GitHub 热点速览」

作者&#xff1a;HelloGitHub-小鱼干 虽然本周 GitHub 热榜都是一些熟悉的面孔&#xff0c;但还是有不少新开源的项目&#xff0c;比如受启发于 Stripe IDs 的 UUIDv7 扩展 typeid&#xff0c;相信有了它&#xff0c;数据标识问题就迎刃而解了。此外&#xff0c;还有刚开源就获…

Linux--自动化的构建项目:make、Makefile

make是一个命令 Makefile是一个文件 Makefile的构成&#xff1a; ①依赖关系 ②依赖方法 编写Malefile文件的最终目标是生成项目&#xff0c;换句话说就是&#xff0c;想让Makefile把我的源代码编译&#xff0c;自动形成可执行文件 示例&#xff1a; 注&#xff1a;.PHONY…

c++11 标准模板(STL)(std::basic_ostream)(五)

定义于头文件 <ostream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ostream : virtual public std::basic_ios<CharT, Traits> 类模板 basic_ostream 提供字符流上的高层输出操作。受支持操作包含有格式…

C++动态库使用

个人博客地址: https://cxx001.gitee.io 前言 Windows与Linux下面的动态链接库区别 1. 文件后缀不同 Linux动态库的后缀是 .so 文件&#xff0c;而window则是 .dll 文件。 2. 文件格式不同 &#xff08;a&#xff09;Linux下是ELF格式&#xff0c;即Executable and Linkab…

数据结构--字符串的朴素模式匹配算法

数据结构–字符串的朴素模式匹配算法 主串&#xff1a; \color{purple}主串&#xff1a; 主串&#xff1a; ‘嘿嘿嘿红红火火恍恍惚惚嗨皮开森猴开森 笑出猪叫 \color{red}笑出猪叫 笑出猪叫哈哈哈哈嗨森哈哈哈哈哈哈嗝’ 模式串&#xff1a; \color{purple}模式串&#xff1a…

计算机毕业论文内容参考|基于Python的城乡低保信息管理系统的设计和实现

文章目录 导文摘要课题背景国内外现状与趋势课题内容相关技术与方法介绍系统分析系统设计系统实现系统测试总结与展望1本文总结2后续工作展望导文 计算机毕业论文内容参考|基于Python的城乡低保信息管理系统的设计和实现 摘要 本文介绍了基于Python的城乡低保信息管理系统的设…

【电路原理学习笔记】第2章:电压、电流和电阻:2.2 电荷

第2章&#xff1a;电压、电流和电阻 2.2 电荷 电子是最小的带负电荷的粒子。当物质中存在过量的电子时&#xff0c;该物质就带负的电荷&#xff1b;当电子不足时&#xff0c;就带正的净电荷。电子和质子的电荷量相等&#xff0c;但极性相反。 电荷&#xff1a;电荷是由于物质…

企业电子名片小程序哪家?市面上哪一款名片小程序更好用?

市面上名片小程序很多&#xff0c;但是选择一款真正好用的功能强大的小程序名片就不是很多&#xff0c; 推荐你看看开利网络的链企来名片功能&#xff0c;不但具有人物的基础信息&#xff0c;还有云展厅可以上传企业信息展示企业&#xff0c;链接打通了活动&#xff0c;展会&am…

7DGroup性能实施项目日记9

好多天没写实施日记了&#xff0c;这段时间&#xff0c;我也有些其他事情要做&#xff0c;因为前阵子答应了写些东西&#xff0c;所以这几天晚上弄到两三点&#xff0c;终于写完了五万字的东西交了差。 这一段时间是培训的课程关键内容&#xff0c;基本都是分析的关键环节。主…

2023年6月NISP一级线上考试成绩发布

作为计算机行业的在校生&#xff0c;掌握更多专业知识&#xff0c;取得更有价值更有竞争力的证书&#xff0c;既能丰富自身专业知识的储备&#xff0c;又能增加毕业后就业应聘的砝码&#xff0c;早日行动&#xff0c;早日脱颖而出。 6月&#xff0c;恭喜以下同学喜提 中国信息…

Mac OS 配置java的环境变量

Mac OS 配置java的环境变量 下载java的jdk安装包 下载完成后&#xff0c;点击安装&#xff0c;一直下一步即可。Mac会默认安装到:/Library/Java/JavaVirtualMachines/jdk-1.8.jdk&#xff0c;commandoptionc复制路径 打开terminal&#xff0c;运行如下命令&#xff1a; 创建…

Qt6.5 LTS Windows使用VS2019编译全过程【包含静态编译】

Qt6.5 LTS Windows使用VS2019编译 目的编译主机环境编译依赖项方式1、 使用自定义.bat脚本编译编写脚本编译使用示例 方式2、使用官方configue脚本进行编译 目的 鉴于之前一直使用的是Qt5&#xff0c;现在Qt6已经出到Qt6.6了&#xff0c;弄个Qt6尝尝鲜吧&#xff0c;但是从Qt5…

某中厂面试题分享(附详细答案解析)

前言&#xff1a; 本篇文章主要记录上周某中厂面试题的知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。 如果文章有什么需要改进的地方欢迎大佬提出&#xff0c;对大佬有帮助希望可以支持下哦~ 小威在此先感谢各位小伙伴儿了&#x1f601; 以下正文开始 文章目…

【性能工程】性能比较:REST vs gRPC vs 异步通信

微服务之间的通信方式对微服务架构内的各种软件质量因素有重大影响&#xff08;有关微服务网络内通信的关键作用的更多信息&#xff09;。沟通方式会影响软件的性能和效率等功能性需求&#xff0c;以及可变性、可扩展性和可维护性等非功能性需求。因此&#xff0c;有必要考虑不…

Element-Plus select选择器-下拉组件错位bug(有高度滚动时)

1. bug重现 由于项目不便展示&#xff0c;因此在官网复现bug https://element-plus.org/zh-CN/component/select.html#基础用法 2. 调试 源码调试时发现下拉菜单是直接放在body 元素里&#xff0c;这时候希望它不要直接放在body里&#xff0c; 查阅文档看到这两个属性&#x…

直线模组怎样保养才合理?

直线模组简单来说就是自动领域中做直线来回往返运动的传动部件&#xff0c;被广泛应用于自动化领域市场当中&#xff0c;可实现二轴、三轴、龙门等多轴搭建的形式&#xff0c;也可用于水平使用、垂直移载使用&#xff0c;能满足自动化领域中大多数的用户。 至于直线模组的保养&…

基于Java+控制台+Mysql实现图书管理系统

基于Java控制台Mysql实现图书管理系统 一、系统介绍二、功能展示1.主页2.添加图书3.图书列表4.根据图书名称号查询图书信息5.根据编号删除图书信息6.根据编号编辑图书信息7.退出系统 三、数据库四、其它1.其他系统实现2.获取源码 一、系统介绍 使用控制台Mysql完成一个图书管理…

实现使用语音控制myCobot机械臂运动

基于语音识别技术的机器人手臂控制智能化尝试 介绍&#xff1a; 在电影《钢铁侠》中&#xff0c;我们看到托尼斯塔克在建造设备时与人工智能贾维斯交流。托尼向贾维斯描述了他需要的零件&#xff0c;贾维斯控制机械臂协助托尼完成任务。随着当今技术的发展&#xff0c;这种实现…