【MySQL】嵌套查询—数据之旅:解析层层嵌套的迷思

news2024/12/23 13:41:01

🎊专栏【MySQL】

🌺每日一句:宝剑锋从磨砺出,梅花香自苦寒来

⭐欢迎并且感谢大家指出我的问题

文章目录

嵌套查询

(1)不相关子查询(带有IN谓词的子查询)

🍔定义

🍔使用说明

🍔特点

🍔实际操作

🍔三层嵌套查询

(2)相关子查询(带有EXISTS谓词的子查询)

🍔定义

🍔使用说明

🍔特点

🍔带有EXISTS的子查询

🍔带多个EXISTS(或NOT EXISTS)查询

🍔带有比较运算符的子查询

🍔带有ANY(SOME)或ALL谓词的子查询

(3)总结


嵌套查询

定义

        在SQL语言中,一个SELECR-FROM-WHERE语句称为一个查询块,将一个查询块嵌套在另一个查询块的WHERE子句或HAVING语句的条件中的查询称为嵌套查询。

子查询分为不相关子查询和相关子查询

(1)不相关子查询(带有IN谓词的子查询)

🍔定义

   子查询的查询条件不依赖于父查询,这类子查询称为不相关子查询(一般子查询)。

🍔使用说明

1.不相关子查询一般使用谓词IN。

2.由里向外,逐层处理。即每个子查询在上一级查询处理之前求解,子查询的结果用于建立其父查询的查找条件。

🍔特点

能独立运行,子查询条件不依赖父查询;

只能运行一次;

先执行子(内)查询

代码如下👇🏻

SELECT sname     /*外查询/父查询*/
FROM student
WHERE sno IN (      /*括号里面的为内查询或子查询*/
SELECT sno
FROM sc
WHERE cno='2');

 运行结果👇🏻

🍔实际操作

例1(查询与刘晨在同一个系学习的学生)

代码如下👇🏻

SELECT sno,sname,sdept
FROM student
WHERE sdept IN
             ( SELECT sdept
               FROM student
               WHERE sname='刘晨');

 运行结果👇🏻

例2(查询有一门课程成绩等于85分的学号和姓名)

代码如下👇🏻

SELECT sno,sname
FROM student
WHERE sno IN(
          SELECT sno
          FROM sc
          WHERE grade=85);

 运行结果👇🏻

🍔三层嵌套查询

例1(查询选修了课程名为"信息系统"的学生学号和姓名)

代码如下👇🏻

SELECT sno,sname
FROM student
WHERE sno IN(
SELECT sno
FROM sc
WHERE cno IN(
SELECT cno
FROM course
WHERE cname='信息系统')
);

 运行结果👇🏻

例2(查询李同学不学的课程的课程名)

代码如下👇🏻

SELECT cname 
FROM course
WHERE cno NOT IN(
 SELECT cno
 FROM sc
 WHERE sno IN (
 SELECT sno 
 FROM student
 WHERE sname LIKE '李%'));

 运行结果👇🏻

(2)相关子查询(带有EXISTS谓词的子查询)

🍔定义

    子查询的查询条件依赖于外层父查询的某个属性值,称这类查询为相关子查询。

🍔使用说明

1.相关子查询一般使用谓词EXISTS。

2.首先取外层查询中表的第一个元组,根据它与内层查询相关的属性值处理内层查询,若WHERE子句返回值为真,则取此元组放入结果表,然后再取外层表的下一个元组,重复这一过程,直至外层表全部查询完为止。

🍔特点

子查询不能独立运行;

子查询多次运行;

先执行父(外)查询;

🍔带有EXISTS的子查询

EXISTS说明:

带有EXISTS谓词的子查询不返回任何数据,只产生逻辑真值'true'或逻辑假值'false'

若内层查询结果非空,则外层的WHERE子句返回真值

若内层查询结果为空,则外层的WHERE子句返回假值

NOT EXISTS说明:

若内层查询结果非空,则外层的WHERE子句返回假值

若内层查询结果为空,则外层的WHERE子句返回真值

注意事项

由EXISTS(或NOT EXISTS)引出的子查询,其目标列表达式通常都用*,因为带EXISTS(或NOT EXISTS)的子查询只返回真值或假值,给出列名无实际意义

(查询有一门课程成绩等于85分的学号和姓名)

代码如下👇🏻

SELECT sno,sname
FROM student
WHERE EXISTS
( SELECT *
 FROM sc
 WHERE student.sno=sc.`Sno` AND grade=85);

 运行结果👇🏻

例2(查询没有选修了二号课程的学生姓名)

代码如下👇🏻

SELECT sname
 FROM student
 WHERE NOT EXISTS(
 SELECT *
 FROM sc
 WHERE sno=student.`Sno` AND cno='2');

 运行结果👇🏻

例3(查询没有与刘晨在同一个系学习的学生)

代码如下👇🏻

SELECT sno,sname,sdept
 FROM student s1
 WHERE NOT EXISTS(
 SELECT *
 FROM student s2
 WHERE s2.`Sdept`=s1.`Sdept` AND s2.`Sname`='刘晨');

 运行结果👇🏻

🍔带多个EXISTS(或NOT EXISTS)查询

例如(查询选修了全部课程的学生姓名)

代码如下👇🏻

SELECT sname
 FROM student 
 WHERE NOT EXISTS(
 SELECT *              /*子查询1*/
 FROM course
 WHERE NOT EXISTS(
 SELECT *              /*子查询2*/
 FROM sc
 WHERE sno=student.`Sno` AND cno=course.`Cno`));

🍔带有比较运算符的子查询

例如(找出每个学生超过他选修课程平均成绩的课程号)

代码如下👇🏻

 SELECT sno,cno
 FROM sc X
 WHERE grade >=(
 SELECT AVG(grade)
 FROM sc Y
 WHERE y.`Sno`=x.`Sno`);

🍔带有ANY(SOME)或ALL谓词的子查询

例如(查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄)

代码如下👇🏻

SELECT sname,sage
 FROM student
 WHERE sage< ANY(
 SELECT sage
 FROM student
 WHERE sdept='cs')
AND sdept <> 'cs';   /*父查询块中的条件*/

等价于代码如下👇🏻

SELECT sname,sage
 FROM student
 WHERE sage<(
 SELECT MAX(sage)
 FROM student
 WHERE sdept='cs')
 AND sdept <> 'cs';

(3)总结

不同形式的查询间的替换:

1.连接查询一定能用嵌套查询替换

2.所有带IN谓词比较运算符ANY和ALL谓词的子句查询都能用带EXISTS谓词的子查询等价替换

3.一些带EXISTS或NOT EXISTS谓词的子查询不能被其他形式的子查询等价替换

🌺如果大家有不明白的地方,或者文章部分内容有问题,欢迎大家在评论区讨论,指正

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

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

相关文章

【python海洋专题三十八】海洋指数画法--折线图样式二

【python海洋专题三十八】海洋指数画法–折线图样式二 数据&#xff1a;AMO_index 图像展示&#xff1a; 图片 往期推荐 图片 【python海洋专题一】查看数据nc文件的属性并输出属性到txt文件 【python海洋专题二】读取水深nc文件并水深地形图 【python海洋专题三】图像…

Centos7利用tftp与shell备份H3C设备配置

二、TFTPH3C TFTP&#xff08;Trivial File Transfer Protocol&#xff09;是一种简单的文件传输协议&#xff0c;通常用于在计算机网络中传输小文件&#xff0c;如配置文件、固件和其他小型数据文件。TFTP被设计成一种轻量级的协议&#xff0c;因此相对于其他文件传输协议&…

win7电脑怎么录屏?教你一键捕捉电脑屏幕

在Win7操作系统中&#xff0c;录制屏幕活动是一项重要且有用的功能。不仅可以用于制作教程和演示文稿&#xff0c;还可以用于记录游戏过程或视频会议。可是win7电脑怎么录屏呢&#xff1f;在本文中&#xff0c;我们将介绍三种流行的Win7电脑录屏方法。通过本文&#xff0c;您将…

浅谈余压监控系统在某高层住宅的应用方案

【摘要】&#xff1a; 本文介绍了余压监控系统的基本架构和功能&#xff0c;结合某高层住宅建设实例分析了高层民用建筑中设置此系统的优点与必要性&#xff0c;总结了余压监控系统的功能用于高层建筑物中楼梯间和前室、前室和走道之间的余压的监控与调节&#xff0c;使监控区域…

3D可视化字母出现频率_vtkLinearExtrusionFilter

开发环境&#xff1a; Windows 11 家庭中文版Microsoft Visual Studio Community 2019VTK-9.3.0.rc0vtk-example参考代码目的&#xff1a;学习与总结 demo解决问题&#xff1a;统计输入文本中字母出现的频率&#xff0c;不区分大小写&#xff0c;使用3D可是化方式进行显示&…

Floor报错注入理论及实战

rand()函数&#xff1a;随机返回0-1之间的小数 floor()函数&#xff1a;小数向下取证书。向上取整数ceiling() concat_ws函数&#xff1a;将括号内数据用第一个字段连接起来 group by子句&#xff1a;分组语句&#xff0c;常用语结合统计函数&#xff0c;根据一个或多个列&a…

Spring Security使用总结五,加密用户密码,不再使用明文保存密码

上一章我们成功的注册了一个新用户&#xff0c;按照正常逻辑来说&#xff0c;这一章应该是登录了&#xff0c;但是我们也看到了&#xff0c;这数据库保存的居然是明文密码&#xff0c;这谁受得了&#xff0c;这要是用户信息泄露了&#xff0c;这不让人一锅端了啊&#xff0c;还…

LeetCode | 21. 合并两个有序链表

LeetCode | 21. 合并两个有序链表 OJ链接 定义一个新链表&#xff0c;把小的结点尾插到新的链表注意在插入新的链表中&#xff0c;1. 空链表&#xff0c;插入的节点就是链表的头节点和尾结点。2. 非空链表&#xff0c;插入的节点就是链表的新的尾结点&#xff0c;头结点不变…

Lazarus安装和入门资料

azarus-2.2.6-fpc-3.2.2-win64 下载地址 Lazarus 基础教程 - Lazarus Tutorials for Beginners Lazarus Tutorial #1 - Learning programming_哔哩哔哩_bilibili https://www.devstructor.com/index.php?pagetutorials Lazarus是一款开源免费的object pascal语言RAD IDE&…

【Linux权限:系统中的数字锁与安全之门】

1.Linux下的用户 Linux下有两种用户&#xff1a;超级用户&#xff08;root&#xff09;、普通用户。 超级用户&#xff1a;可以再linux系统下做任何事情&#xff0c;不受限制普通用户&#xff1a;在linux下做有限的事情。超级用户的命令提示符是“#”&#xff0c;普通用户的命令…

HashMap 是怎么解决哈希冲突的?

&#xff08;本文摘自mic老师面试文档&#xff09; 常用数据结构基本上是面试必问的问题&#xff0c;比如 HashMap、LinkList、 ConcurrentHashMap 等。 关于 HashMap&#xff0c;有个学员私信了我一个面试题说&#xff1a; “HashMap 是怎么解决哈希冲突 的&#xff1f;” …

Redis极速上手开发手册【Redis全面复习】

文章目录 什么是RedisRedis的特点Redis的应用场景Redis安装部署Redis基础命令Redis多数据库特性Redis数据类型Redis数据类型之stringRedis数据类型之hashRedis数据类型之listRedis数据类型之setRedis数据类型之sorted set案例&#xff1a;存储高一班的学员信息 Redis封装工具类…

DevExpress WinForms桑基图组件,开创大数据流可视化新方式!

界面控件DevExpress WinForms能帮助开发者创建信息丰富的WinForms应用程序&#xff0c;使用其Sankey Diagram&#xff08;桑基图&#xff09;控件&#xff0c;您可以非常轻松地可视化大数据的数据流。 DevExpress WinForms有180组件和UI库&#xff0c;能为Windows Forms平台创…

获奖名单出炉 ,鲲鹏应用创新大赛2023全国总决赛圆满落幕

11月2日&#xff0c;以“数智未来 因你而来”为主题的鲲鹏应用创新大赛2023全国总决赛在四川成都顺利举办。经过长达6个月的层层筛选与激烈角逐&#xff0c;最终从三大赛事、5大赛道中评选出了13个金奖、16个银奖、19个铜奖。 鲲鹏应用创新大赛是面向全球开发者的顶级赛事&…

DxO照片处理工具合集:FilmPack+PureRAW+PhotoLab+ViewPoint中文版

DxO照片处理工具合集是一款强大而全面的图像处理软件&#xff0c;它可以帮助您提升照片的质量&#xff0c;使其更加出色。无论您是一名专业摄影师&#xff0c;还是一个热爱摄影的业余爱好者&#xff0c;DxO照片处理工具合集都能满足您的需求&#xff0c;让您的照片更加出众&…

单元测试框架----UnitTest框架

UnitTest框架核心要点&#xff1a;TestCase(测试用例)、TestSuite(测试套件)、TextTestRunner&#xff08;测试执行器&#xff09;、TextTestResult&#xff08;测试报告&#xff09;、Fixture&#xff08;测试夹具&#xff09; TestSuite 步骤&#xff1a; 步骤1&#xff1a…

git解决冲突的方法。

1、 cherry-pick git fetch ssh://jingyou.caigerrit.transtekcorp.com:29418/leshan refs/changes/23/34123/3 && git cherry-pick FETCH_HEAD2、 文件解冲突&#xff01; 3、 cherry-pick完整。 git cherry-pick --continue4、查看状态。 5、 push。 git push o…

ChatGPT如何管理对话历史?

问题 由于现在开始大量使用ChatGPT对话功能&#xff0c;认识到他在提供启发方面具有一定价值。比如昨天我问他关于一个微习惯的想法&#xff0c;回答的内容还是很实在&#xff0c;而且能够通过他的表达理解自己的问题涉及到的领域是什么。 此外&#xff0c;ChatGPT能够总结对话…

Stable Diffusion:最先进的文本生成图像模型

稳定扩散 生成式 AI 技术正在迅速发展&#xff0c;现在可以简单地根据文本输入生成文本和图像。Stable Diffusion 是一种文本到图像模型&#xff0c;使您能够创建逼真的应用程序。 扩散模型通过学习去除添加到真实图像中的噪声进行训练。这种降噪过程会产生逼真的图像。这些模…

第一章《补基础:不怕学不懂微积分》笔记

微积分包含众多知识点&#xff0c;例如极限概念、求导公式、乘积法则、链式法则、隐函数求导、 积分中值定理、泰勒公式等。其中&#xff0c;研究导数、微分及其应用的部分一般称为微分学&#xff0c;研究不定积分、定积分及其应用的部分一般称为积分学。微分学和积分学统称为微…