目录

子查询的相关概念:

子查询的分类:

角度1:

单行子查询:

单行比较操作符:

子查询的空值情况:

多行子查询:

多行比较操作符:

ANY和ALL的区别:

子查询为空值的情况:

角度2:

相关(或者关联)子查询:

非相关(或者非关联)子查询:

EXISTS和NOT EXISTS关键字:

EXISTS:

NOT EXISTS:

子查询的基本使用:

子查询作为计算字段:

子查询结果作为临时表:

子查询结果作为过滤条件:

举例:

结论:


子查询的相关概念:

子查询是指一个查询语句嵌套在另一个查询语句的内部的查询。SQL中子查询的使用大大增加了SELECT查询的能力,因为很多时候查询需要从结果集中获取数据,或者需要从同一个表中先计算得出一个数据结果,然后这个数据结果(可能是某一标量,也可能是某个集合)进行比较。

子查询的称谓规范:外查询(主查询)、内查询(子查询)。

子查询需要使用()包裹,可多层嵌套。通常先执行子查询,再将结果传递给外部查询。

子查询放在比较条件的右侧,提高可读性。

子查询的分类:

角度1:

按照内查询的结果返回一条还是多条记录,将子查询分为:

单行子查询:

返回一个结果给主查询进行使用。

单行比较操作符:

操作符

含义

=

等于查询的数据

>

大于查询的数据

>=

大于等于查询的数据

小于等于查询的数据

<>

不等于查询的数据

子查询的空值情况:

子查询如果查询的结果为NULL,是不会进行报错的。外查询运用这个查询结果也是NULL值。

多行子查询:

返回多个结果给主查询进行使用。

多行比较操作符:

操作符

含义

IN

等于列表中任意一个

ANY

需要和单行比较操作符一起使用,和子查询返回的某一个值进行比较

ALL

需要和单行比较操作符一起使用,和子查询返回的所有值进行比较

SOME

实际上是ANY的别名,作用相同,一般常用ANY

ANY和ALL的区别:

 ANY:如果主查询中的值满足与子查询返回的任意一个值之间的比较条件,则条件为真。

ALL:如果主查询中的值满足与子查询返回的所有值之间的比较条件,则条件为真。

子查询为空值的情况:

内查询有一个NULL值的话,外查询的结果为NULL。

角度2:

按照内查询是否被多次执行,将子查询分为:

相关(或者关联)子查询:

子查询依赖外部查询的当前行数据,需结合外部查询逐步处理。

子查询需要执行多次,即采用循环的方式,先从外部查询开始,每次都传入子查询进行查询,然后将结果反馈给外部。

非相关(或者非关联)子查询:

子查询独立于外部查询执行,不引用外部查询的任何字段,可单独运行并返回固定结果集供外部查询使用。

子查询从数据表中查询了数据结果,如果这个数据结果只执行一次,然后这个数据结果作为主查询的条件进行执行。

EXISTS和NOT EXISTS关键字:

关联子查询通常会和EXISTS和NOT EXISTS关键字一起使用,用于检查子查询是否存在满足条件的行。

EXISTS和NOT EXISTS基于布尔逻辑判断数据的存在性而返回具体数据值。

EXISTS:

检查子查询是否返回至少一行记录。

SELECT ...
FROM 主表
WHERE EXISTS (子查询);

如果子查询中不存在满足条件的行:条件返回FALSE,继续在子查询中查找。

如果在子查询中存在满足条件的行:不在子查询中继续查找,条件返回TREU。

NOT EXISTS:

检查子查询是否没有返回任何记录。

如果子查询中无结果:返回TRUE,保留改行。

如果子查询中有结果:返回FALSE,丢弃该行。

SELECT ...
FROM 主表
WHERE NOT EXISTS (子查询);

子查询的基本使用:

子查询作为计算字段:

必须返回单值。

SELECT 字段名1,字段名2,...
FROM 表名
WHERE 字段名3 比较操作符 (SELECT 返回的字段名FROM 表名WHERE 条件(不含聚合函数条件)
);
SELECT 字段名1,(SELECT 返回的字段名FROM 表名WHERE 条件
)
FROM 表名
WHERE 条件;

子查询结果作为临时表:

必须指定别名。

SELECT 字段名1,字段名2,...
FROM 表名1 JOIN (SELECT 字段名FROM 表名WHERE 条件
) AS 别名
WHERE 条件;

子查询结果作为过滤条件:

SELECT 字段名1,字段名2,...
FROM 表名
WHERE 字段名 比较操作符 (SELECT 字段名,(聚合函数)FROM 表名[WHERE 条件(无聚合函数条件)]GROUP BY 非聚合函数字段名HAVING 条件(包含聚合函数条件)
);

举例:

牛客网SQL题目:

返回购买价格为 10 美元或以上产品的顾客列表_牛客题霸_牛客网

OrderItems表示订单商品表,含有字段订单号:order_num、订单价格:item_price;Orders表代表订单信息表,含有顾客id:cust_id和订单号:order_num

OrderItems表

order_numitem_price
a110
a21
a21
a42
a55
a21
a77

Orders表

order_numcust_id
a1cust10
a2cust1
a2cust1
a4cust2
a5cust5
a2cust1
a7cust7

使用子查询,返回单个订单的购买价格为 10 美元或以上产品的顾客列表,结果无需排序。

【示例结果】返回顾客id cust_id

cust_id
cust10

因为这里子查询返回的结果为多个,所以使用多行比较操作符IN。 

SELECT Orders.cust_id
FROM Orders
WHERE Orders.order_num IN (SELECT OrderItems.order_numFROM OrderItemsWHERE OrderItems.item_price >=10
);

牛客网SQL题目:

确定哪些订单购买了 prod_id 为 BR01 的产品(一_牛客题霸_牛客网

表OrderItems代表订单商品信息表,prod_id为产品id;Orders表代表订单表有cust_id代表顾客id和订单日期order_date

OrderItems表

prod_idorder_num
BR01a0001
BR01a0002
BR02a0003
BR02a0013

Orders表

order_numcust_idorder_date
a0001cust102022-01-01 00:00:00
a0002cust12022-01-01 00:01:00
a0003cust12022-01-02 00:00:00
a0013cust22022-01-01 00:20:00

编写 SQL 语句,使用子查询来确定哪些订单(在 OrderItems 中)购买了 prod_id 为 "BR01" 的产品,然后从 Orders 表中返回每个产品对应的顾客 ID(cust_id)和订单日期(order_date),按订购日期对结果进行升序排序。

【示例结果】返回顾客id cust_id和定单日期order_date。

cust_idorder_date
cust102022-01-01 00:00:00
cust12022-01-01 00:01:00
SELECT Orders.cust_id,Orders.order_date
FROM Orders
WHERE Orders.order_num IN (SELECT OrderItems.order_numFROM OrderItemsWHERE OrderItems.prod_id = 'BR01'
)
ORDER BY Orders.order_date ASC;

牛客网SQL题目:

返回购买 prod_id 为 BR01 的产品的所有顾客的电_牛客题霸_牛客网

你想知道订购 BR01 产品的日期,有表OrderItems代表订单商品信息表,prod_id为产品id;Orders表代表订单表有cust_id代表顾客id和订单日期order_date;Customers表含有cust_email 顾客邮件和cust_id顾客id

OrderItems表

Orders表


Customers表代表顾客信息,cust_id为顾客id,cust_email为顾客email

返回购买 prod_id 为BR01 的产品的所有顾客的电子邮件(Customers 表中的 cust_email),结果无需排序。

提示:这涉及 SELECT 语句,最内层的从 OrderItems 表返回 order_num,中间的从 Customers 表返回 cust_id。

【示例结果】

返回顾客email cust_email

我们先通过Orders表格中的order_num和OrderItems表格中的order_num进行相关的连接,查询得到想要的prod_id为"BR01"的order_num值。然后再将结果反馈给Customers表来进行相关的查询。因为这里主要讲的是子查询,所以就使用的子查询嵌套来表示。

SELECT Customers.cust_email
FROM Customers
WHERE Customers.cust_id IN (SELECT Orders.cust_idFROM OrdersWHERE Orders.order_num IN (SELECT OrderItems.order_numFROM OrderItemsWHERE OrderItems.prod_id = 'BR01')
);

 牛客网SQL题目:

从 Products 表中检索所有的产品名称以及对应的销售总_牛客题霸_牛客网

Products 表中检索所有的产品名称:prod_name、产品id:prod_id

prod_idprod_name
a0001egg
a0002sockets
a0013coffee
a0003cola

OrderItems代表订单商品表,订单产品:prod_id、售出数量:quantity

prod_idquantity
a0001105
a00021100
a0002200
a00131121
a000310
a000319
a00035

编写 SQL 语句,从 Products 表中检索所有的产品名称(prod_name),以及名为 quant_sold 的计算列,其中包含所售产品的总数(在 OrderItems 表上使用子查询和 SUM(quantity)检索)。

【示例结果】返回产品名称prod_name和产品售出数量总和

prod_namequant_sold
egg105
sockets1300
coffee1121
cola34

 这里将子查询的结果作为一个临时表,必须需要对临时表进行起别名。先通过将Products表格和自身建立连接,得到想要的子查询结果集,然后再将OrderItems表格建立连接。即可得到想要的结果集。

SELECT Products.prod_name,NewOrderItems.quant_sold
FROM Products JOIN (SELECT OrderItems.prod_id,SUM(OrderItems.quantity) AS quant_soldFROM OrderItemsGROUP BY OrderItems.prod_id
) AS NewOrderItems
ON Products.prod_id = NewOrderItems.prod_id;

牛客网SQL题目: 

返回每个顾客不同订单的总金额_牛客题霸_牛客网

我们需要一个顾客 ID 列表,其中包含他们已订购的总金额。

OrderItems表代表订单信息,OrderItems表有订单号:order_num和商品售出价格:item_price、商品数量:quantity。


Orders表订单号:order_num、顾客id:cust_id

编写 SQL语句,返回顾客 ID(Orders 表中的 cust_id),并使用子查询返回total_ordered 以便返回每个顾客的订单总金额,将结果按金额从大到小排序。

【示例结果】返回顾客id cust_id和total_order下单总额

因为要查询顾客ID所对应的订单总金额,所以通过OrderItems表格的自连接得到一个按照order_num分组并计算所对应的价格总和的临时表。通过Orders表格和OrderItems表格进行连接查询,得到想要的查询结果集。

SELECT的执行顺序:FROM在SELECT之前,并且子查询先执行,所以能够直接把NewOrderItems.total_ordered直接放在主查询SELECT后面。

因为子查询中含有聚合函数,所以子查询中的过滤条件应该使用HAVING关键字。

SELECT Orders.cust_id,NewOrderItems.total_ordered
FROM Orders JOIN (SELECT OrderItems.order_num,SUM(OrderItems.item_price*OrderItems.quantity) AS total_orderedFROM OrderItemsGROUP BY OrderItems.order_numORDER BY total_ordered DESC
) AS NewOrderItems
ON Orders.order_num = NewOrderItems.order_num;

结论:

 在SELECT中,除了在GROUP BY和LIMIT之外,都能使用子查询。

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

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

相关文章

Python批处理深度解析:构建高效大规模数据处理系统

引言&#xff1a;批处理的现代价值在大数据时代&#xff0c;批处理&#xff08;Batch Processing&#xff09; 作为数据处理的核心范式&#xff0c;正经历着复兴。尽管实时流处理备受关注&#xff0c;但批处理在数据仓库构建、历史数据分析、报表生成等场景中仍不可替代。Pytho…

是德科技的BenchVue和纳米软件的ATECLOUD有哪些区别?

是德科技的BenchVue和纳米软件的ATECLOUD虽然都是针对仪器仪表测试的软件&#xff0c;但是在功能设计、测试场景、技术架构等方面有着明显的差异。BenchVue&#xff08;是德科技&#xff09;由全球领先的测试测量设备供应商开发&#xff0c;专注于高端仪器控制与数据分析&#…

线上redis的使用

一.String1.缓存玩家单个数据&#xff0c;但是我觉得还是用hash好2.结合过期时间&#xff0c;比如:某个东西结算了&#xff0c;redis记录一下&#xff0c;并设置过期时间3.分布式锁二.Hash1.缓存一个单位的数据&#xff0c;比如&#xff1a;联盟信息2.被封禁的列表&#xff0c;…

【实践记录】github仓库的更新

首先登录&#xff0c;参考&#xff1a;记一次github连接本地git_如何连接github-CSDN博客 SSH&#xff1a; git config --global user.name "GitHubUsername" git config --global user.email "emailexample.com" ssh-keygen -t ed25519 -C "emailex…

Nature图形复现—Graphpad绘制带P值的含数据点的小提琴图

带 P 值的含数据点的小提琴图是一种科研数据可视化图表&#xff0c;它同时呈现数据的分布特征、原始观测值和统计显著性&#xff1a;通过小提琴形状展示概率密度分布&#xff08;反映数据集中趋势和离散程度&#xff09;&#xff0c;叠加抖动散点显示所有原始数据点&#xff08…

mongodb源代码分析createCollection命令由create.idl变成create_gen.cpp过程

mongodb命令db.createCollection(name, options)创建一个新集合。由于 MongoDB 在命令中首次引用集合时会隐式创建集合&#xff0c;因此此方法主要用于创建使用特定选项的新集合。例如&#xff0c;您使用db.createCollection()创建&#xff1a;固定大小集合&#xff1b;集群化集…

达梦(DM8)常用管理SQL命令(3)

达梦(DM8)常用管理SQL命令(3) 1.表空间 -- 查看表空间信息 SQL> SELECT * FROM v$tablespace;-- 查看数据文件 SQL> SELECT * FROM v$datafile;-- 表空间使用情况 SQL> SELECT df.tablespace_name "表空间名称",df.bytes/1024/1024 "总大小(MB)&q…

【Django】-5- ORM的其他用法

一、&#x1f680; ORM 新增数据魔法&#xff01;核心目标教你用 Django ORM 给数据库 新增数据 &#xff01;就像给数据库 “生小数据宝宝”&#x1f476;方法 1&#xff1a;实例化 Model save&#xff08;一步步喂数据&#xff09;obj Feedback() # 实例化 obj.quality d…

Flink Checkpoint机制:大数据流处理的坚固护盾

引言在大数据技术蓬勃发展的当下&#xff0c;数据处理框架层出不穷&#xff0c;Flink 凭借其卓越的流批一体化处理能力&#xff0c;在大数据流处理领域占据了举足轻重的地位 。它以高吞吐量、低延迟和精准的一次性语义等特性&#xff0c;成为众多企业处理实时数据的首选工具。在…

【STM32-HAL】 SPI通信与Flash数据写入实战

文章目录1.参考教程2. 4种时间模式3. 3个编程接口3.1 HAL_StatusTypeDef HAL_SPI_Transmit(...) &#xff1a;3.1.1 参数说明3.1.2 例子3.2 HAL_StatusTypeDef HAL_SPI_Receive(...) &#xff1a;3.2.1参数说明3.2.2 例子3.3 HAL_StatusTypeDef HAL_SPI_TransmitReceive(...) &…

SNR-Aware Low-light Image Enhancement 论文阅读

信噪比感知的低光照图像增强 摘要 本文提出了一种新的低光照图像增强解决方案&#xff0c;通过联合利用信噪比&#xff08;SNR&#xff09;感知的变换器&#xff08;transformer&#xff09;和卷积模型&#xff0c;以空间变化的操作方式动态增强像素。对于极低信噪比&#xff0…

在 Vue3 中使用 Mammoth.js(在 Web 应用中预览 Word 文档)的详解、常见场景、常见问题及最佳解决方案的综合指南

一、Mammoth.js 简介与核心功能 Mammoth.js 是一个专用于将 .docx 文档转换为 HTML 的库,适用于在 Web 应用中预览 Word 文档。其核心特点包括: 语义化转换:基于文档样式(如标题、段落)生成简洁的 HTML 结构,忽略复杂样式(如居中、首行缩进)。 轻量高效:适用于需要快…

2025 年 VSCode 插件离线下载硬核攻略

微软 2025 年起关闭 VSCode 官方市场 .vsix 文件直接下载入口&#xff0c;给企业内网开发者带来极大不便。不过别担心,今天提供一个下载.vsix文件地址。 VSC插件下载 (dreamsoul.cn) 下载好的.vsix文件后&#xff0c;打开vscode的应用&#xff0c;选择右上角...打开&#xff…

[leetcode] 位运算

位运算这类题目奇思妙招很多&#xff0c;优化方法更是非常考验经验积累。 常用小技能&#xff1a; bit_count()&#xff1a;返回整数的二进制表示中1的个数&#xff0c;e.g. x 7 x.bit_count() # 32.bit_length()&#xff1a;返回整数的二进制表示的长度&#xff0c;e.g. …

关于assert()函数,eval()函数,include

一.assert()函数例子assert("strpos($file, ..) false") or die("Detected hacking attempt!");assert("file_exists($file)") or die("That file doesnt exist!");第一个是会检验$file是否有.. &#xff0c;如果有strpos会返回true&…

ICT模拟零件测试方法--电位器测试

ICT模拟零件测试方法–电位器测试 文章目录ICT模拟零件测试方法--电位器测试电位器测试电位器测试配置电位器测试配置电位器测试注意事项电位器测量选项电位器测试 电位器测试测量从 0.1 欧姆到 10M 欧姆的电阻。 本节介绍&#xff1a; 电位器测试配置电位器测试注意事项电位…

wsl2使用宿主机网络方法

在Windows的资源管理器的地址栏输入&#xff1a; %UserProfile% &#xff0c;即可打开当前用户的主目录&#xff0c;创建文件&#xff1a; .wslconfig 输入[experimental]networkingModemirroredautoProxytrue之后重启WSL 管理员身份运行PowerShell&#xff1a; 停止WSL&#x…

当Windows远程桌面出现“身份验证错误。要求的函数不受支持”的问题

当Windows远程桌面出现“身份验证错误。要求的函数不受支持”的问题时&#xff0c;可以参考以下方法解决&#xff1a;修改组策略设置适用于Windows专业版、企业版等有组策略编辑器的系统。1. 按下WinR组合键&#xff0c;输入“gpedit.msc”&#xff0c;打开本地组策略编辑器。2…

零售新范式:开源AI大模型、AI智能名片与S2B2C商城小程序源码驱动下的圈层渗透革命

摘要&#xff1a;在消费圈层化与渠道碎片化的双重冲击下&#xff0c;传统零售渠道的"广撒网"模式逐渐失效。阿里巴巴零售通、京东新通路、国美Plus等零售巨头通过技术赋能重构小店生态&#xff0c;但其本质仍停留于供应链效率提升层面。本文创新性提出"开源AI大…

电池自动生产线:科技赋能下的高效制造新范式

在当今科技飞速发展的时代&#xff0c;电池作为众多电子设备和新能源产业的核心部件&#xff0c;其生产效率与质量至关重要。电池自动生产线的出现&#xff0c;犹如一场及时雨&#xff0c;为电池制造行业带来了全新的变革与发展机遇。自动化流程&#xff0c;开启高效生产之门传…