数据库系统概论(超详解!!!) 第四节 关系数据库标准语言SQL(Ⅲ)

news2024/11/14 21:27:50

1.连接查询

连接查询:同时涉及多个表的查询

连接条件或连接谓词:用来连接两个表的条件     

一般格式:

[<表名1>.]<列名1>  <比较运算符>  [<表名2>.]<列名2>

[<表名1>.]<列名1> BETWEEN [<表名2>.]<列名2> AND [<表名2>.]<列名3>

连接字段:连接谓词中的列名称

连接条件中的各连接字段类型必须是可比的,但名字不必是相同的

查询每个学生及其选修课程的情况
     SELECT  Student.*,SC.*  
     FROM  Student,SC 
     WHERE  Student.Sno = SC.Sno;

1、等值与非等值连接查询

等值连接:连接运算符为=

查询每个学生及其选修课程的情况
		        SELECT  Student.*,SC.*
		        FROM     Student,SC
		        WHERE  Student.Sno = SC.Sno;

连接操作的执行过程:

嵌套循环法(NESTED-LOOP)

首先在表1中找到第一个元组,然后从头开始扫描表2,逐一查找满足连接件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。

表2全部查找完后,再找表1中第二个元组,然后再从头开始扫描表2,逐一查找满足连接条件的元组,找到后就将表1中的第二个元组与该元组拼接起来,形成结果表中一个元组。

重复上述操作,直到表1中的全部元组都处理完毕

排序合并法(SORT-MERGE)

常用于=连接

首先按连接属性对表1和表2排序

对表1的第一个元组,从头开始扫描表2,顺序查找满足连接条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组。当遇到表2中第一条大于表1连接字段值的元组时,对表2的查询不再继续

找到表1的第二条元组,然后从刚才的中断点处继续顺序扫描表2,查找满足连接条件的元组,找到后就将表1中的第二个元组与该元组拼接起来,形成结果表中一个元组。直接遇到表2中大于表1连接字段值的元组时,对表2的查询不再继续

重复上述操作,直到表1或表2中的全部元组都处理完毕为止

索引连接(INDEX-JOIN)

对表2按连接字段建立索引

对表1中的每个元组,依次根据其连接字段值查询表2的索引,从中找到满足条件的元组,找到后就将表1中的第一个元组与该元组拼接起来,形成结果表中一个元组 


查询每个学生及其选修课程的情况,用自然连接完成。
 SELECT  Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
 FROM     Student,SC
 WHERE  Student.Sno = SC.Sno;

一条SQL语句可以同时完成选择和连接查询,这时WHERE子句是由连接谓词和选择谓词组成的复合条件。

查询选修2号课程且成绩在90分以上的所有学生的学号和姓名。
    SELECT Student.Sno, Sname
    FROM     Student, SC
    WHERE  Student.Sno=SC.Sno  AND    		               
                    SC.Cno='2' AND SC.Grade>90;

执行过程:

先从SC中挑选出Cno='2'并且Grade>90的元组形成一个中间关系

再和Student中满足连接条件的元组进行连接得到最终的结果关系

2、自身连接

自身连接:一个表与其自己进行连接

需要给表起别名以示区别

由于所有属性名都是同名属性,因此必须使用别名前缀

查询每一门课的间接先修课(即先修课的先修课)
    SELECT  FIRST.Cno,SECOND.Cpno
     FROM  Course  FIRST,Course  SECOND
     WHERE FIRST.Cpno = SECOND.Cno;

3、外连接

外连接与普通连接的区别:

普通连接操作只输出满足连接条件的元组

外连接操作以指定表为连接主体,将主体表中不满足连接条件的元组一并输出  

左外连接: 列出左边关系中所有的元组  

右外连接: 列出右边关系中所有的元组

全外连接

查询每个学生及其选修课程的情况
SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
    FROM  Student  LEFT OUTER JOIN SC ON    
                 (Student.Sno=SC.Sno); 

4、复合条件连接(多表连接)

多表连接:两个以上的表进行连接

查询每个学生的学号、姓名、选修的课程名及成绩
  SELECT Student.Sno, Sname, Cname, Grade
   FROM    Student, SC, Course    /*多表连接*/
   WHERE Student.Sno = SC.Sno 
                  AND SC.Cno = Course.Cno; /*符合条件*/

2.嵌套查询

嵌套查询概述

一个SELECT-FROM-WHERE语句称为一个查询块

将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语的条件中的查询称为嵌套查询

SELECT Sname		           /*外层查询/父查询*/
     FROM Student
     WHERE Sno IN
                        (SELECT Sno             /*内层查询/子查询*/
                            FROM SC
                            WHERE Cno= ' 2 ');

上层的查询块称为外层查询或父查询

下层查询块称为内层查询或子查询

SQL语言允许多层嵌套查询 :即一个子查询中还可以嵌套其他子查询

子查询的限制 :不能使用ORDER BY子句

不相关子查询:    

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

相关子查询:

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

1、带有IN谓词的子查询  

查询与“刘晨”在同一个系学习的学生。
此查询要求可以分步来完成
 ① 确定“刘晨”所在系名             
        SELECT  Sdept  
         FROM     Student                            
         WHERE  Sname= ' 刘晨 ';
	    结果为: CS
② 查找所有在CS系学习的学生。    
        SELECT   Sno,Sname,Sdept     
        FROM      Student                 
        WHERE  Sdept= ' CS '; 

查询与“刘晨”在同一个系学习的学生。
将第一步查询嵌入到第二步查询的条件中
    SELECT Sno,Sname,Sdept
    	FROM Student
   	WHERE Sdept  IN
                  (SELECT Sdept
                   FROM Student
                   WHERE Sname= ‘ 刘晨 ’);
    此查询为不相关子查询。

用自身连接完成查询要求
     SELECT  S1.Sno,S1.Sname,S1.Sdept
      FROM     Student S1,Student S2
      WHERE  S1.Sdept = S2.Sdept  AND
                      S2.Sname = '刘晨';

查询选修了课程名为“信息系统”的学生学号和姓名
 	SELECT Sno,Sname                       ③ 最后在Student关系中
  	FROM    Student                                     取出Sno和Sname
 	WHERE Sno  IN
             (SELECT Sno                              ② 然后在SC关系中找出选
              FROM    SC                                    修了3号课程的学生学号
              WHERE  Cno IN
                     (SELECT Cno                       ① 首先在Course关系中找出
                       FROM Course                      “信息系统”的课程号,为3号
                       WHERE Cname= ‘信息系统’
                     )
              );

用连接查询实现
     SELECT Sno,Sname
      FROM    Student,SC,Course
      WHERE Student.Sno = SC.Sno  AND
                     SC.Cno = Course.Cno AND
                     Course.Cname=‘信息系统’;

2、 带有比较运算符的子查询  

当能确切知道内层查询返回单值时,可用比较运算符(>,<,=,>=,<=,!=或< >)。

与ANY或ALL谓词配合使用

假设一个学生只可能在一个系学习,并且必须属于一个系,则在
查询每个学生的学号、姓名、选修的课程名及成绩
可以用 = 代替IN :
     SELECT Sno,Sname,Sdept
     FROM    Student
     WHERE Sdept   =
                   (SELECT Sdept
                    FROM    Student
                    WHERE Sname= ‘刘晨’);

子查询一定要跟在比较符之后

找出每个学生超过他选修课程平均成绩的课程号。
   SELECT Sno, Cno
    FROM  SC  x
    WHERE Grade >=(SELECT AVG(Grade) 
		                        FROM  SC y
                                   WHERE y.Sno=x.Sno);

从外层查询中取出SC的一个元组x,将元组x的Sno值(200215121)传送给内层查询。
       SELECT AVG(Grade)
       FROM SC y
       WHERE y.Sno='200215121';

执行内层查询,得到值88(近似值),用该值代替内层查询,得到外层查询:
       SELECT Sno, Cno
       FROM  SC x
       WHERE Grade >=88; 

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

使用ANY或ALL谓词时必须同时使用比较运算 ,语义为:      

> ANY    大于子查询结果中的某个值      

> ALL    大于子查询结果中的所有值

< ANY    小于子查询结果中的某个值    

< ALL    小于子查询结果中的所有值

>= ANY    大于等于子查询结果中的某个值    

>= ALL    大于等于子查询结果中的所有值

<= ANY    小于等于子查询结果中的某个值    

<= ALL    小于等于子查询结果中的所有值

= ANY    等于子查询结果中的某个值        

=ALL    等于子查询结果中的所有值(通常没有实际意义)

!=(或<>)ANY    不等于子查询结果中的某个值

!=(或<>)ALL    不等于子查询结果中的任何一个值

查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄
    SELECT Sname,Sage
    FROM    Student
    WHERE Sage < ANY (SELECT  Sage
                                         FROM    Student
                                         WHERE Sdept= ' CS ')
     AND Sdept <> ‘CS ' ;           /*父查询块中的条件 */

执行过程:
   (1)首先处理子查询,找出CS系中所有学生的年龄,构成一个集合(20,19)
   (2)处理父查询,找所有不是CS系且年龄小于 
        20 或 19的学生

用聚集函数实现

     SELECT Sname,Sage
     FROM   Student
     WHERE Sage < 
                             (SELECT MAX(Sage)
                               FROM Student
                               WHERE Sdept= 'CS ')
       AND Sdept <> ' CS ';

查询非计算机科学系中比计算机科学系所有学生年龄都小的学生姓名及年龄。
方法一:用ALL谓词
    SELECT Sname,Sage
    FROM Student
    WHERE Sage < ALL
                           (SELECT Sage
                            FROM Student
                            WHERE Sdept= ' CS ')
      AND Sdept <> ' CS ’;

方法二:用聚集函数
        SELECT Sname,Sage
        FROM Student
        WHERE Sage < 
                               (SELECT MIN(Sage)
                                FROM Student
                                WHERE Sdept= ' CS ')
          AND Sdept <>' CS ';

ANY(或SOME),ALL谓词与聚集函数、IN谓词的等价转换关系

ca4a71db40ad45ba9faa7351302e1cbd.png

4、 带有EXISTS谓词的子查询

EXISTS谓词 :存在量词

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

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

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

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

NOT EXISTS谓词 :

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

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

查询所有选修了1号课程的学生姓名。
 思路分析:
本查询涉及Student和SC关系
在Student中依次取每个元组的Sno值,用此值去检查SC表
若SC中存在这样的元组,其Sno值等于此Student.Sno值,并且其Cno= ‘1’,则取此Student.Sname送入结果表
    
     SELECT Sname
     FROM Student
     WHERE EXISTS
                   (SELECT *
                    FROM SC
                    WHERE Sno=Student.Sno AND Cno= ' 1 ');

查询没有选修1号课程的学生姓名。
     SELECT Sname
     FROM     Student
     WHERE NOT EXISTS
                   (SELECT *
                    FROM SC
                    WHERE Sno = Student.Sno AND Cno='1');

查询与“刘晨”在同一个系学习的学生。
    可以用带EXISTS谓词的子查询替换:
    
    SELECT Sno,Sname,Sdept
     FROM Student S1
      WHERE EXISTS
                 (SELECT *
                     FROM Student S2
                     WHERE S2.Sdept = S1.Sdept AND
                                   S2.Sname = '刘晨');

不同形式的查询间的替换

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

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

用EXISTS/NOT EXISTS实现全称量词(难点)

SQL语言中没有全称量词 ,(For all) 可以把带有全称量词的谓词转换为等价的带有存在量词的谓词:

171112a40491442c88c53af35b43e3d0.png

查询选修了全部课程的学生姓名。(不存在没有选修的课程)
        SELECT Sname
        FROM Student
        WHERE NOT EXISTS
                      (SELECT *
                        FROM Course
                        WHERE NOT EXISTS
                                      (SELECT *
                                       FROM SC
                                       WHERE Sno= Student.Sno
                                             AND Cno= Course.Cno
                                      )
                       );

分步理解,从最下边的where看起,从下往上分析。

1、最内层的select是把学生学号和课程号带入,结果是查询学生选课的记录,加上not exists,就是学生没选的课程。

2、再加上上层的select(从课程表),就是选出学生没选的课程。

3、最后在上面又加了一个not exists,就是不存在学生没选的课程(既学生选了所有的课程才会符合记录)

用EXISTS/NOT EXISTS实现逻辑蕴涵(难点)

SQL语言中没有蕴涵(Implication)逻辑运算 ,可以利用谓词演算将逻辑蕴涵谓词等价转换为:

9975c9b1e5e2423da7cfa4c6cdea94f6.png

查询至少选修了学生201215122选修的全部课程的学生号码。

解题思路:

用逻辑蕴涵表达:查询学号为x的学生,对所有的课程y,只要201215122学生选修了课程y,则x也选修了y。

形式化表示:     

用P表示谓词 “学生201215122选修了课程y”     

用q表示谓词 “学生x选修了课程y” 

等价变换:

4a5a3fc5c47245189901b82e9bfecaf3.png

变换后语义:不存在这样的课程y,学生201215122选修了y,而学生x没有选。

用NOT EXISTS谓词表示:     
       SELECT DISTINCT Sno
       FROM SC SCX
       WHERE NOT EXISTS
                     (SELECT *
                      FROM SC SCY
                      WHERE SCY.Sno = ' 201215122 '  AND
                                    NOT EXISTS
                                    (SELECT *
                                     FROM SC SCZ
                                     WHERE SCZ.Sno=SCX.Sno AND
                                                   SCZ.Cno=SCY.Cno));

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

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

相关文章

由浅到深认识Java语言(25):正则表达式

该文章Github地址&#xff1a;https://github.com/AntonyCheng/java-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.c…

相机显示储存卡未格式化怎么回事?怎么办

在摄影的学习和实践中&#xff0c;相机是我们记录美好瞬间的得力助手。然而&#xff0c;当相机突然提示储存卡未格式化时&#xff0c;这往往会让我们感到困惑和焦虑。本文将探讨相机显示储存卡未格式化的可能原因&#xff0c;并提供相应的解决方案。 图片来源于网络&#xff0c…

腾讯云优惠券获取方式及领取入口详解

随着云计算的普及&#xff0c;腾讯云作为国内领先的云计算服务提供商&#xff0c;受到了越来越多企业和个人的青睐。为了降低用户的使用成本&#xff0c;腾讯云推出了各种优惠券&#xff0c;让用户在享受优质服务的同时&#xff0c;还能获得更多实惠。本文将为大家详细介绍腾讯…

微服务(基础篇-004-Feign)

目录 http客户端Feign Feign替代RestTemplate&#xff08;1&#xff09; Feign的介绍&#xff08;1.1&#xff09; 使用Feign的步骤&#xff08;1.2&#xff09; 自定义配置&#xff08;2&#xff09; 配置Feign日志的两种方式&#xff08;2.1&#xff09; Feign使用优化…

AI预测福彩3D第18弹【2024年3月26日预测--第4套算法重新开始计算第4次测试】

昨天对第4套算法进行了第三次测试&#xff0c;其中第一套方案成功命中&#xff0c;目前第4套算法的预测战绩为3次测试2次命中。测试的目的主要是为了记录统计两套方案的稳定性和命中率。今天继续对第4套算法进行测试&#xff0c;今天是第4次测试&#xff0c;同样测试两个方案。…

【新手小白教程】2024最新:如何轻松订阅Patreon及其支付、充值全攻略

前言 什么是Patreon Patreon是一个极具创新性的在线平台&#xff0c;它为内容创作者提供了一个独特的机会&#xff0c;使他们能够直接通过订阅服务模式从粉丝那里获得资金支持或打赏。 这个平台吸引了各种类型的创作者&#xff0c;包括艺术家、音乐家、作家、视频制作人等&…

免费redis可视化工具windows/mac都可以使用,开源免费

官方地址&#xff1a;RedisInsight | The Best Redis GUI github开源地址&#xff1a;GitHub - RedisInsight/RedisDesktopManager Redis Desktop Manager – Redis可视化管理工具、redis图形化管理工具、redis可视化客户端、redis集群管理工具。 官方下载方式 滚动到页面底…

Win11文件右键菜单栏完整显示教程

近日公司电脑升级了win11&#xff0c;发现了一个小麻烦事&#xff0c;如下图&#xff1a; 当我想使用svn或git的时候必须要多点一下&#xff0c;这忍不了&#xff0c;无形之中加大了工作量&#xff01; 于是&#xff0c;菜单全显示教程如下&#xff1a; 第一步&#xff1a;管…

力扣热门算法题 102. 二叉树的层序遍历,104. 二叉树的最大深度,110. 平衡二叉树

102. 二叉树的层序遍历&#xff0c;104. 二叉树的最大深度&#xff0c;110. 平衡二叉树&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.25 可通过leetcode所有测试用例。 目录 102. 二叉树的层序遍历 解题思路 完整代码 Jav…

Spark基于DPU Snappy压缩算法的异构加速方案

一、总体介绍 1.1 背景介绍 Apache Spark是专为大规模数据计算而设计的快速通用的计算引擎&#xff0c;是一种与 Hadoop 相似的开源集群计算环境&#xff0c;但是两者之间还存在一些不同之处&#xff0c;这些不同之处使 Spark 在某些工作负载方面表现得更加优越。换句话说&am…

项目风险管理:从识别到应对

在项目启动阶段&#xff0c;应制定风险管理计划&#xff1b;在项目执行阶段&#xff0c;应定期进行风险审查和评估&#xff1b;在项目收尾阶段&#xff0c;应对风险管理进行总结和反思。 如何减少和规避风险&#xff1f; 我们可以学习和借鉴类似项目的经验&#xff0c;了解过…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之七 简单图像浮雕效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之七 简单图像浮雕效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之七 简单图像浮雕效果 一、简单介绍 二、简单图像浮雕效果实现原理 三、简单图像浮雕效果案例实现简单步骤 四、注…

2015年认证杯SPSSPRO杯数学建模D题(第一阶段)城市公共自行车全过程文档及程序

2015年认证杯SPSSPRO杯数学建模 D题 城市公共自行车 原题再现&#xff1a; 城市交通问题直接影响市民的生活和工作。在地形平坦的城市&#xff0c;公共自行车出行系统是一种很好的辅助手段。一般来说&#xff0c;公共自行车出行系统由数据中心、驻车站点、驻车桩、自行车&…

数据本地性如何助力企业在云上实现高效机器学习

分享嘉宾&#xff1a; Lu Qiu, Shawn Sun 本文将讨论数据本地性对于在云上进行高效机器学习的重要性。首先对比现有解决方案的利弊&#xff0c;并综合考虑如何通过数据本地性来降低成本和实现性能最大化。其次会介绍新一代的Alluxio设计与实现&#xff0c;详细说明其在模型训练…

生命源集团2024全球品牌发布会成功举办

生命源集团2024全球品牌发布会圆满落幕 3月20日&#xff0c;生命源集团在杭州隆重举办了主题为“生命源启&#xff0c;荣耀之巅”的2024全球品牌发布会。 活动伊始&#xff0c;嘉宾们陆续签到入场&#xff0c;现场气氛热烈而庄重。随后&#xff0c;生命源集团十二大事业部总裁…

3.3 数据定义 数据库与系统概论

目录 3.3.1 模式的定义与删除 1. 定义模式 2. 删除模式 CASCADE&#xff08;级联&#xff09; RESTRICT&#xff08;限制&#xff09; 3.3.2 基本表的定义、删除与修改 表的定义 2.数据类型 3. 模式与表 4. 修改基本表 5. 删除基本表 3.3.3 索引的建立与删除 1. …

ZYNQ学习之Ubuntu系统的简单设置与文本编辑

基本都是摘抄正点原子的文章&#xff1a;<领航者 ZYNQ 之嵌入式Linux 开发指南 V3.2.pdf&#xff0c;因初次学习&#xff0c;仅作学习摘录之用&#xff0c;有不懂之处后续会继续更新~ 一、Ubuntu的简单操作 1.1 切换拼音输入法 Ubuntu 自带的拼音输入法&#xff0c;有两种…

[NKCTF 2024]web解析

文章目录 my first cms全世界最简单的CTF解法一解法二 my first cms 打开题目在最下面发现是CMS Made Simple&#xff0c;版本为2.2.19 扫一下发现存在后台登陆界面&#xff0c;直接访问 用字典爆破下admin的密码为Admin123 然后直接登录&#xff0c;去漏洞库搜一下其实存在…

从人工智能入门到理解ChatGPT的原理与架构的第一天(First)(含机器学习特征工程详解)

目录 一.ChatGPT的发展历程 二.Attention is all you need 三.对于GPT-4的智能水平评估 四.大语言模型的技术演化 1.从符号主义到连接主义 2.特征工程 2.1数据探索 2.2数据清洗 2.3数据预处理 2.3.1无量纲化 2.3.1.1标准化 2.3.1.2区间缩放法 2.3.1.3标准化与归一…

layui框架实战案例(25):laydate中mark的数据后端生成

mark&#xff0c;自定义日期标记。该属性是对 calendar 属性的进一步延伸&#xff0c;灵活度更高。属性可批量设置多个日期标记&#xff0c;如&#xff1a; mark: {0-10-14: 生日, //每年每月的某一天0-0-10: 工资, // 每月 10 号2008-8-8: 开幕, // 指定的日期 }其中日期的格式…