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

这篇具有很好参考价值的文章主要介绍了【MySQL】嵌套查询—数据之旅:解析层层嵌套的迷思。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🎊专栏【MySQL】

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

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

文章目录

嵌套查询

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

🍔定义

🍔使用说明

🍔特点

🍔实际操作

🍔三层嵌套查询

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

🍔定义

🍔使用说明

🍔特点

🍔带有EXISTS的子查询

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

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

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

(3)总结


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

嵌套查询

定义

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

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

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

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

🍔定义

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

🍔使用说明

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

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

🍔特点

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

只能运行一次;

先执行子(内)查询

代码如下👇🏻

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

 运行结果👇🏻

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

🍔实际操作

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

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

代码如下👇🏻

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

 运行结果👇🏻

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

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

代码如下👇🏻

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

 运行结果👇🏻

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

🍔三层嵌套查询

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

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

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

代码如下👇🏻

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

 运行结果👇🏻

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

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

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

代码如下👇🏻

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

 运行结果👇🏻

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

(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);

 运行结果👇🏻

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

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

代码如下👇🏻

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

 运行结果👇🏻

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

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

代码如下👇🏻

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

 运行结果👇🏻

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

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

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

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

代码如下👇🏻

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谓词的子查询

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

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

代码如下👇🏻

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谓词的子查询不能被其他形式的子查询等价替换

🌺如果大家有不明白的地方,或者文章部分内容有问题,欢迎大家在评论区讨论,指正文章来源地址https://www.toymoban.com/news/detail-745257.html

到了这里,关于【MySQL】嵌套查询—数据之旅:解析层层嵌套的迷思的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 从 Oracle 到 MySQL 数据库的迁移之旅

    目录 引言 一、前期准备工作 1.搭建新的MySQL数据库 2 .建立相应的数据表 2.1 数据库兼容性分析 2.1.1 字段类型兼容性分析 2.1.2 函数兼容性分析 2.1.3 是否使用存储过程?存储过程的个数?复杂度? 2.1.4 是否使用触发器?个数?使用的场景? 2.2 建表过程中其他需要注意的事项

    2024年04月11日
    浏览(49)
  • MySQL案例——多表查询以及嵌套查询

    MySQL笔记——表的修改查询相关的命令操作 MySQL笔记——MySQL数据库介绍以及在Linux里面安装MySQL数据库,对MySQL数据库的简单操作,MySQL的外接应用程序使用说明 文章目录 系列文章目录 前言 一 创建数据库 1.1 创建一个部门表 1.2 建一个职务表 1.3 创建一个员工表 1.4 创建一个工

    2024年02月15日
    浏览(40)
  • MySQL数据库——MySQL WHERE:条件查询数据

    在 MySQL 中,如果需要有条件的从数据表中查询数据,可以使用 WHERE 来指定查询条件。 使用 WHERE 的语法格式如下: WHERE 查询条件 查询条件可以是: 带比较运算符和逻辑运算符的查询条件 带 BETWEEN AND 的查询条件 带 IS NULL 的查询条件 带 IN

    2024年02月03日
    浏览(58)
  • MySQL数据库——MySQL SELECT:数据表查询语句

    在 MySQL 中,可以使用 SELECT 语句来查询数据。查询数据是指从数据库中根据需求,使用不同的查询方式来获取不同的数据,是使用频率最高、最重要的操作。 SELECT 的语法格式如下: 其中,各条子句的含义如下: {*|字段列名} 包含星号通配符的字段列表,表示所要查询字段的

    2024年02月05日
    浏览(70)
  • MySQL数据库实验三 MySQL查询

    一、实验项目: MySQL查询。 二、实验目的 掌握MySQL的查询操作。 三、实验内容 (一): 1、查询lineitem表中商品编号(productid)和单价(unitprice),要求消除重复行。 2、计算lineitem表中每条记录的商品金额。 3、显示orders表单笔高于200元的客户号(userid)、成交金额(total

    2024年02月11日
    浏览(53)
  • MySQL修炼手册6:子查询入门:在查询中嵌套查询

    MySQL数据库作为一种强大而灵活的关系型数据库管理系统,提供了多种高级查询工具,其中子查询是一项强大而丰富的功能。在本篇文章中,我们将深入研究MySQL中子查询的基础概念,重点关注标量子查询和行子查询,以及它们在实际查询中的嵌套应用。为了更好地演示子查询

    2024年01月17日
    浏览(45)
  • MySQL数据库,联合查询

    目录 1. 联合查询 1.1 内查询 1.2 外查询 1.3 自连接 1.4 子查询 1.5 合并查询 联合查询,简单的来讲就是多个表联合起来进行查询。这样的查询在我们实际的开发中会用到很多,因此会用 笛卡尔积 的概念。 啥是笛卡尔积?两张表经过笛卡尔积后得到的新表的列数是两表列数之和

    2023年04月23日
    浏览(72)
  • MySQL数据库,聚合查询

    目录 1、聚合查询 1.1聚合函数 1.1.1count函数 1.1.2sum函数 1.1.3avg函数 1.1.4max函数 1.1.5min函数 1.2group by子句 1.3having 聚合函数查询又叫函数查询,它是通过一些特定的函数根据需求来查询相关的信息,常见的聚合函数为: COUNT - 求总数,不包含某字段为null值 SUM - 求和,不包含某字

    2023年04月21日
    浏览(55)
  • MySQL数据库基础之MySQL查询基础

    从今天开始,本系列内容就带各位小伙伴学习数据库技术 。数据库技术是Java开发中必不可少的一部分知识内容。也是非常重要的技术。本系列教程由浅入深, 全面讲解数据库体系。 非常适合零基础的小伙伴来学习。 全文大约【 1212】 字,不说废话,只讲可以让你学到技术、

    2024年02月06日
    浏览(52)
  • MySQL数据库——复杂查询(一)

    一、本关任务:给定一张  tb_Salary  表,如下所示,有 m = 男性 和 f = 女性 的值。交换所有的 f 和 m 值(例如,将所有 f 值更改为 m ,反之亦然)。 id name sex salary 1 Elon f 7000 2 Donny f 8000 3 Carey m 6000 4 Karin f 9000 5 Larisa m 5500 6 Sora m 500 要求只使用一句更新 update 语句,且不允许含

    2023年04月09日
    浏览(84)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包