数据库子查询

SQL自学:什么是子查询,如何使用它们 子查询是一个嵌套在另一个 SQL 查询(通常是 SELECT、INSERT、UPDATE 或 DELETE 语句)中的查询。它的结果被用作外部查询的一部分,以进一步筛选、聚合或连接数据。子查询可以返回单个值、一行或一列数据,甚至是一个完整的结果集,具体取决于它在外部查询中的使用方式。在这个例子中,内部查询返回了订单数量大于 10 的产品 ID,外部查询则使用这些产品 ID 从products表中检索出对应的产品名称。 阅读详情
所用案例涉及的四个表:
一、子查询定义
1、概念:(what)
子查询:将一个查询语句嵌套在另一个查询语句中,在特定情况下,一个查询语句的条 件需要另一个查询语句来获取,内层查询语句的查询结果可以为外层查询语句提供查询条 件。
2、子查询使用方式:
可用于 where 子句中;
还能够用于 from 子句中作为一个临时表;
以字段的形式出现在 select 语句的选择列中
3、分类
子查询中只查一个字段的值;
根据子查询所返回的结果行数,可以将其分为单行子查询和多行子查询。
二、单行子查询应用
1、概念
单行子查询指子查询的返回结果只有一行数据。
当在主查询的条件语句中引用子查询的结果时,可使用单行比较符(如=、>、
<、>=、<= 和 < >)进行比较。
2、使用例子(how)
从内到外,逐层分析
有连接关系的两个表进行子查询:
 第一例子:
1 ‐‐ 用子查询实现查询所有张三下过的订单3 A第一步:
2 SELECT WORKER_ID FROM T_WORKER w WHERE w.NAME='张三'
3 B第二步:
4 SELECT * FROM T_ORDER o where o.CASHIER_ID=(
5 SELECT WORKER_ID FROM T_WORKER w
6 WHERE w.NAME='张三'
7 )
 第二例子(子查询使用聚合函数):
1 ‐‐ 用子查询实现查询价格高于或等于所有订单平均价格的订单
2 A第一步:
3 SELECT AVG(MONEY) FROM T_ORDER
4 B第二步:
5 SELECT * FROM T_ORDER o
6 WHERE o.MONEY >(
7 SELECT AVG(MONEY) FROM T_ORDER
8 )
3、子查询使用归纳:
子查询一般用于 select 语句的 where 子句中,且可以嵌套。
编写复杂的子查询的解决思路是逐层分解查询,即从最内层的子查询开始分解, 将嵌套的 SQL 语句拆分为一个个独立的 SQL 语句。
子查询的执行过程遵循“由里及外”的原则,即先执行最内层的子查询语句,然 后将执行结果与外层的语句进行合并,依次逐层向外扩展并最终形成完整的 SQL 语 句。
一般情况下,连接查询可改为子查询实现;但子查询却不一定可改为连接查询实 现。
子查询与连接查询执行效率的比较:当子查询执行结果的行数较大,而主查询执 行结果的行数较小时,子查询执行效率较高;反之,则连接查询执行效率较高。
三、多行子查询应用
1.in 比较符
(1)概念(what)
使用多行比较符 in 时,主查询会与子查询中的每一个值进行 比较,如果与其中的任意一个值相同,则返回。
not in 与 in 的含义恰好相反。
单行子查询也是多行子查询的一种特殊情况,所以单行子查询 的“=”比较符可以替换为多行子查询的“in”比较符。但不能将多行子查询的“in”比较符替换为单行子查询的“=”比较符。
(2)使用例子(how)
从内到外,逐层分析
1 ‐‐ 用子查询实现查询所有张三和李四下过的订单
2 SELECT * FROM T_ORDER o
3 where o.CASHIER_ID in(
4 SELECT WORKER_ID FROM T_WORKER w
5 WHERE w.NAME='张三' OR w.NAME='李四'
6 )
2.all 关键字子查询
(1)概念:(what)
通过 all 关键字将一个表达式或列的值与子查询所返回的一列值中的每一行进行比较, 只要有一次比较的结果为 false(假),则 all 测试返回 false,主查询不执行;否则返 回 true,执行主查询。
(2)语法结构

表达式或字段   单行比较运算符   all( 子查询 )

(3)all运算符含义
all 关键字位于单行比较运算符之后;
当 <all 时,表示小于最小值(all后面跟着的子查询里的),等 价于“<(子查询里取最小值)”。
当 >all 时,表示大于最大值(all后面跟着的子查询里的),等 价于“>(子查询里取最大值)”。
(4)例子
1 ‐‐ 查询李四下的订单中高于张三下的所有订单金额的订单
2 SELECT * FROM T_ORDER o
3 WHERE o.CASHIER_ID in(
4 SELECT WORKER_ID FROM T_WORKER w
5 WHERE w.NAME='李四'
6 ) AND
7 o.MONEY > ALL(
8 SELECT MONEY FROM T_ORDER WHERE CASHIER_ID in(
9 SELECT WORKER_ID FROM T_WORKER wo
10 WHERE wo.NAME='张三'
11 )
12 )
13 等价于:14 SELECT * FROM T_ORDER o
15 WHERE o.CASHIER_ID in(
16 SELECT WORKER_ID FROM T_WORKER w
17 WHERE w.NAME='李四'
18 ) AND
19 o.MONEY > (
20 SELECT MAX(MONEY) FROM T_ORDER WHERE CASHIER_ID in(
21 SELECT WORKER_ID FROM T_WORKER wo
22 WHERE wo.NAME='张三'
23 )
24 )
3.any|some 关键字子查询
(1)概念:(what)
any 与 some 的查询功能相同。
any 或 some 用于子查询之前,通过 any|some 比较运算符, 将一个表达式或列的值与子查询所返回的一列值中的每一行进行比 较,只要有一次比较的结果为 true,则 any 或 some 测试返回
true,主查询执行;否则结果为false,主查询不执行。
(2)语法结构

表达式或字段  多行比较运算符  any(子查询)

表达式或字段  多行比较运算符  some(子查询)

(3)any|some运算符含义
any|some关键字位于比较运算符之后;
当 <any|some 时,表示小于最大值(后面跟着的子查询里 的),等价于“<(子查询里取最大值)”。
当 =any|some 时,表示与 in 运算符等价 当 >any|some 时,表示大于最小值(后面跟着的子查询里 的),等价于“>(子查询里取最小值)”。
(4)例子
1 需求:
2 ‐‐ 查询李四下的订单中高于张三下的任意一个订单金额的订单
3 SELECT * FROM T_ORDER o
4 WHERE o.CASHIER_ID in(
5 SELECT WORKER_ID FROM T_WORKER w
6 WHERE w.NAME='李四'7 ) AND
8 o.MONEY > SOME(
9 SELECT MONEY FROM T_ORDER WHERE CASHIER_ID in(
10 SELECT WORKER_ID FROM T_WORKER wo
11 WHERE wo.NAME='张三'
12 )
13 )
四、子查询特殊应用
1.from 子句中的子查询
(1)概念:from 子句中的子查询主要作为查询过程中的临时数据表
(2)例子:
1 ‐‐ 查询每个收银员的下单总额
2 select w.name,c.sale from t_worker w,
3 (select CASHIER_ID,sum(money) as sale
4 from t_order o group by CASHIER_ID
5 ) c
6 where w.worker_id=c.CASHIER_ID
2.select 子句中的子查询
(1)概念:
select 子句中使用子查询,其实质是将子查询的执行结果作为 select 子句的列,可以
起到与连接查询异曲同工的作用。且此处的子查询只能查一列,多于一列执行出错
(2)例子:
1 ‐‐ 为了了解张三的业绩情况,查所有订单数及张三下的订单数所对比
2 select count(*) as '所有订单数',
3 (select count(*) from t_order ord where ord.CASHIER_ID=(
4 SELECT WORKER_ID FROM T_WORKER w
5 WHERE w.NAME='张三'
6 )
7 ) as '张三下单数'
8 from t_order
3.exists 子查询的用法
(1)概念:
exists 用于检查子查询是否至少会返回一行数据。该子查询实际上并不返回任何数据,而是返回值 true 或 false。
exists 子查询的返回结果若为 true,则执行主查询获得所有预 订电影票的客户姓名;exists 子查询的返回结果若为 false,则不执 行主查询。
(2)语法结构:
主查询表达式 [not] exists ( 子查询 )
(3)例子:
1 ‐‐ 查询被点过的餐品信息
2 SELECT f.* FROM t_food f
3 where EXISTS(
4 select * from
5 t_orderdetail od
6 where f.FOOD_ID=od.FOOD_ID
7 )
8
9 ‐‐ 查询没有被点过的餐品信息
10 SELECT f.* FROM t_food f
11 where not EXISTS(
12 select * from
13 t_orderdetail od
14 where f.FOOD_ID=od.FOOD_ID
15 )
五、DML 语句中的子查询
1.update 子句中的子查询
(1)概念:
在 DML 语句中使用子查询与在 select 语句中使用子查询的原理是一致的,均
为将内层子查询的结果作为外层主查询中 where 条件的参考值来使用。
在 DML 的 update 语句、delete 语句和 insert 语句中使用子查询,可以维护
数据,完成复杂的更新、删除和插入功能。
(2)例子:
1 ‐‐ 修改张三下的所有订单金额为200
2 update t_order set
3 money=200
4 where CASHIER_ID=(5 SELECT WORKER_ID FROM T_WORKER w
6 WHERE w.NAME='张三'
7 )
2.delete 子句中的子查询
(1)注意:删除数据时需要考虑表的主从关系,正确的做法是先删除从表数据,再删除主
表数据。
(2)例子:
1 需求:删除张三下的所有订单
2 delete from ticket_sell where customerID in
3 (select id from customer where username='chen01')
【08】MySQL复杂查询:子查询语句详解与示例 MySQL的子查询功能强大,能够在许多复杂查询中帮助我们提取数据。通过标量子查询、多行子查询、多列子查询和相关子查询,开发者可以灵活地在查询中使用嵌套查询,处理各种复杂的数据需求。了解并掌握子查询的语法和优化技巧,将帮助你在数据库设计和查询过程中更加高效地操作数据。 阅读详情

相关推荐

MySQL (九) : 子查询、单行子查询、多行子查询、相关子查询、EXISTS和NOT EXISTS关键字

第09章_子查询 子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL 4.1开始引入。 SQL 中子查询的使用大大增强了 SELECT 查询的能力,因为很多时候查询需要从结果集中获取数据,或者需要从同一个表中先计算得出一个数据结果,然后与这个数据结果(可能是某个标量,也可能是某个集合)进行比较。 1. 需求分析与问题解决 1.1 实际问题 现有解决方式: #方式一: SELECT salary FROM employees WHERE last_name = 'Abel

Guizy 2126

MySQL基础-子查询

子查询概念:子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL 4.1开始引入SQL 中子查询的使用大大增强了 SELECT 查询的能力,因为很多时候查询需要从结果集中获取数据,或者需要从同一个表中先计算得出一个数据结果,然后与这个数据结果(可能是某个标量,也可能是某个集合)进行比较子查询的基本语法结构:说明:子查询(内查询)在主查询之前一次执行完成子查询的结果被主查询(外查询)使用子查询要包含在括号内建议将子查询放在比较条件的右侧,便于阅读。

~ 1万+

紫光同创PGL50H开发板实战:盘古50KN网口板的高速通信与数据处理

本文详细介绍了紫光同创PGL50H开发板(盘古50KN网口板)在高速通信与数据处理领域的实战应用。文章从开箱、核心芯片解析、开发环境搭建入手,重点讲解了如何配置与测试其8路千兆以太网接口和SFP光纤接口,并深入探讨了FPGA与DDR3协同进行多路数据汇聚处理的系统架构与调试方法,为网络通信与高速数据处理系统开发提供了宝贵的实践经验。

weixin_28256233的博客 452

六、子查询——介绍

六、子查询——介绍 1.什么是子查询? 子查询又称嵌套查询。想要了解子查询,需要先知道查询块儿是什么:在SQL语言中,一个select--from--where语句被称为一个查询块儿,子查询就是在一个查询块儿里面又嵌套了一个查询块儿。如下示例: 2.子查询语法 注意点: (1)将子查询放在比较条件的右侧。 (2)子查询必须使用圆括号()括起来。 (3)一般子查询结果必须为...

python伊甸园的博客 4091

别再到处找包了!Keil5芯片支持包(Pack)最全管理指南:安装、更新、迁移与离线备份

本文详细解析了Keil5芯片支持包(Pack)的全生命周期管理,包括安装、更新、迁移与离线备份的工程化解决方案。针对STM32F10x等常见芯片,提供了高效获取Pack的策略、版本管理技巧及团队协作方案,帮助开发者解决常见的'Device Family Pack missing'等问题,提升嵌入式开发效率。

weixin_28729205的博客 540

国民技术N32G45X SysTick定时器实战:从1us到100ms的精准延迟实现(附完整代码)

本文详细解析了国民技术N32G45X芯片中SysTick定时器的工作原理,并提供了从1微秒到100毫秒的高精度延迟实现方案。通过对比官方库函数的局限性,文章重点介绍了无中断查询模式、时钟源选择策略以及完整的代码实现,帮助嵌入式开发者精准控制时序,适用于LED控制、软件模拟通信协议等多种实战场景。

weixin_29190573的博客 374

大云海山数据库(He3DB) 内核分析-子查询优化

文章摘要:本文分析了He3DB中子查询优化的实现,重点探讨了子连接上拉和子查询上拉两种优化技术。子连接上拉主要处理EXISTS_SUBLINK和ANY_SUBLINK类型,将其转换为半连接或反连接;子查询上拉则通过pull_up_subqueries_recurse函数实现,需满足特定条件才能提升简单子查询。文章详细说明了各类子查询的转换条件、处理流程及代码实现逻辑,揭示了He3DB子查询优化的实现机制与限制。

weixin_43544348的博客 1074

.NET适配HarmonyOS进展 1. 前言

目前国产化系统浪潮下,适配鸿蒙是中国软件大势所趋,.NET作为最适合开发客户端语言之一,适配鸿蒙系统(HarmonyOS Next)是目前.NET开发者最关心的事情。我目前业余时间正在移植Avalonia到HarmonyOS,去年在.NET Conf CN上分享过,目前又取得一点进展,所以本文把所有问题进行整合与大家进行分享。

2301_76476890的博客 1461

大云海山数据库(He3DB) PG内核分析-子查询优化

子查询分类:相关子查询:子查询语句引用了外层查询中表的列属性。非相关子查询:子查询语句和外层表没有直接关系,子查询可以单独执行一次,外层查询重复使用子查询的执行结果。He3DB子查询分类:子连接:出现在表达式中的子查询叫做子连接(where、on、having条件、投影中)。子查询:出现在范围表中的子查询叫做子查询(from子句)。

于巍,花名漠雪,移动云数据库技术委员会主任,海山数据库研发负责人,PG中文社区常委,PG中文社区海外联络人。15年数据库内核研发经验,4年美国、以色列等海外研发经历,华为GaussDB、阿里云PolarDB、移动云He3DB等核心架构 416

STM32入门教程:车牌识别

在本文中,我们介绍了如何使用STM32实现车牌识别功能,并提供了详细的代码案例。通过以上步骤,你可以开始开发自己的车牌识别系统了。希望本文对你有所帮助!

2401_85258012的博客 874

在MATLAB和Simulink中设计并仿真一个电动汽车整车动力学模型与控制系统

电动汽车(EV, Electric Vehicle)的动力学建模与控制仿真在车辆开发过程中起着至关重要的作用。通过Simulink进行整车动力学模型的构建和控制策略的验证,可以有效评估车辆性能、优化系统设计并降低开发成本。以下是如何在MATLAB和Simulink中设计并仿真一个电动汽车整车动力学模型与控制系统的详细步骤。通过上述步骤,我们成功设计并实现了基于Simulink的电动汽车整车动力学模型与控制仿真。该系统能够模拟复杂的整车动力学行为,验证控制策略的有效性,并通过优化设计提高车辆的性能和可靠性。

xiaoheshang_123的博客 550

【数据库】|子查询

👀:定义:exist 子查询 子句有结果,父句执行,子句没有结果,父句不执行。1、使用子查询,因为子查询会先执行子句,在执行父句,效率非常低。定义:什么叫子查询,也就是先执行子查询,后执行父查询。✅面试题目:请查询没有学习过张三老师的课的学生?✅面试题目:给你一个页面让你写另一个页面。❓✅面试题:如何实现替换,执行顺序?查询id最大的一个学生(子查询)查询每个班级下面id最大的学生?查询大于5 人的班级的名称和人数。查询学生的所有成绩进行排名输出。查询张三老师教了哪些学生?如何实现到这个步骤?

m0_48851832的博客 1679

NPU性能榨取手把手教程:RK3588上YOLOv5s多线程部署与120FPS极限探索

RK3588 YOLOv5s多线程部署优化指南 本教程深入解析RK3588芯片上YOLOv5s模型的高性能多线程部署方案。RK3588作为瑞芯微旗舰AIoT芯片,内置三核NPU(6TOPS算力)和硬件加速器(RGA/VPU),为AI推理提供强大支持。通过线程池技术,我们将视频处理的读取、推理、后处理等环节解耦并行,显著提升系统吞吐量。教程详细介绍了从PyTorch到RKNN格式的模型转换流程、INT8量化方法,以及基于RKNN C++ SDK的YOLOv5推理核心实现,帮助开发者最大化发挥RK3588的AI

LXY_LOVE36的博客 973

数据库基础——10.子查询

这篇文章来讲一下数据库的子查询子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL 4.1开始引入。SQL 中子查询的使用大大增强了 SELECT 查询的能力,因为很多时候查询需要从结果集中获取数据,或者 需要从同一个表中先计算得出一个数据结果,然后与这个数据结果(可能是某个标量,也可能是某个集 合)进行比较。

m0_52096593的博客 3343

Android 13.0 Launcher3中去掉Hotseat功能实现

在13.0系统产品定制化开发中,在Launcher3的定制化需求也是特别多的,由产品是小屏幕的产品,所以产品需求Launcher3 页面布局的原因,要求Launcher3 需要去掉Hotseat 不显示Hotseat下面几个图标,而做满屏app的显示,从而达到美观的效果,下面就来分析去掉Hotseat从而实现这个功能

安卓兼职framework和app工程师的博客 1327

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Oracle数据库:子查询、单行子查询,多行子查询,in,any,all语句,子查询的练习案例

Oracle数据库:子查询、单行子查询,多行子查询,in,any,all语句,子查询的练习案例

weixin_46838716的博客 1743

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Laravel 跨数据库子查询指南

Laravel 跨数据库子查询指南 1. 目录结构及介绍 Laravel Cross Database Subqueries 是一个用于处理跨数据库子查询的Eloquent扩展。以下是该仓库的基本目录结构及其简介: laravel-cross-database-subqueries/ ├── composer.json # 包含依赖管理与元数据 ├── CONTRIBUTIN...

gitblog_00390的博客 537

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

数据库-子查询

子查询是数据库的另一种查询手段,它跟连接查询不一样,连接查询只适合跨表查,子查询可以跨表查询,也可以在本表查询。但是如果想展示多个表的字段,那必须是连接查询,子查询一般情况下不能展示多表字段。 1、表格数据 2、详解 子查询是什么意思呢,其实说白了就是“查询里边有查询”,例如,我想查询比张三年龄大的学生名和年龄。 我们来思考一下,我想要的是学生名和年龄,但是有条件,条件是比“张三”年龄大的,所以先要找出张三的年龄,然后再拿着张三的年龄找到年龄列,挨个比较,找比它大的。 通过上边的分析我们知道,我们总共

qq_39568217的博客 4179

数据库 子查询

子查询:一看标题,就知道会出现子与父的关系,话不多说,我们直接上题 现有这两表 问题:查询课程2不及格的人的学号与姓名 你首先会想到的是join连接查询 Select S.sno,SC.cno from S join SC on S.sno=SC.sno where SC.grade<60; 结果正确 那么有没有另一种方法呢?结果是有的 读题发现成绩在SC表中我们可以在SC表中找出不及格的学生的那行元组 Select * from SC where grade<60; 经过表发现靠不

weixin_46506102的博客 2455

Thinkphp中mysql的Db子查询及OR用法

Thinkphp中DB的子查询|OR条件查询

鹏!的博客 726

MySQL数据库中的子查询

MySQL数据库中的子查询 一,嵌套子查询 例1 注意:对应子查询来说,外查询条件要什么,子查询就查什么,一一对应的关系。 例2 二,相关子查询(单值子查询) 例1 子查询首选使用in做匹配。 insert和select结合: insert into 表名1(列名1,列名2..) ...

weixin_44878850的博客 3466

【DB笔试面试613】在Oracle中,和子查询相关的查询转换有哪些?

♣题目部分在Oracle中,和子查询相关的查询转换有哪些? ♣答案部分(一)子查询推进(Push Subquery)示例 1LHR@orclasm>se...

小麦苗DBA宝典 825

数据库子查询作为条件详解

子查询是嵌套在其他查询中的查询。它可以位于SELECT、INSERT、UPDATE或DELETE语句中,并且可以作为条件、列或表使用。

Web安全工具库 453
上一篇: 数据库设计原理与实战
下一篇: 哈哈哈日记
Jarvis!
博客等级 码龄6年 822粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值