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

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,SCWHERE  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,GradeFROM     Student,SCWHERE  Student.Sno = SC.Sno;

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

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

执行过程:

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

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

2、自身连接

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

需要给表起别名以示区别

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

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

3、外连接

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

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

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

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

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

全外连接

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

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

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

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

2.嵌套查询

嵌套查询概述

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

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

SELECT Sname		           /*外层查询/父查询*/FROM StudentWHERE Sno IN(SELECT Sno             /*内层查询/子查询*/FROM SCWHERE 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,SdeptFROM StudentWHERE Sdept  IN(SELECT SdeptFROM StudentWHERE Sname= ‘ 刘晨 ’);此查询为不相关子查询。用自身连接完成查询要求SELECT  S1.Sno,S1.Sname,S1.SdeptFROM     Student S1,Student S2WHERE  S1.Sdept = S2.Sdept  ANDS2.Sname = '刘晨';查询选修了课程名为“信息系统”的学生学号和姓名SELECT Sno,Sname                       ③ 最后在Student关系中FROM    Student                                     取出Sno和SnameWHERE Sno  IN(SELECT Sno                              ② 然后在SC关系中找出选FROM    SC                                    修了3号课程的学生学号WHERE  Cno IN(SELECT Cno                       ① 首先在Course关系中找出FROM Course                      “信息系统”的课程号,为3号WHERE Cname= ‘信息系统’));用连接查询实现SELECT Sno,SnameFROM    Student,SC,CourseWHERE Student.Sno = SC.Sno  ANDSC.Cno = Course.Cno ANDCourse.Cname=‘信息系统’;

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

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

与ANY或ALL谓词配合使用

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

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

找出每个学生超过他选修课程平均成绩的课程号。SELECT Sno, CnoFROM  SC  xWHERE Grade >=(SELECT AVG(Grade) FROM  SC yWHERE y.Sno=x.Sno);从外层查询中取出SC的一个元组x,将元组x的Sno值(200215121)传送给内层查询。SELECT AVG(Grade)FROM SC yWHERE y.Sno='200215121';执行内层查询,得到值88(近似值),用该值代替内层查询,得到外层查询:SELECT Sno, CnoFROM  SC xWHERE Grade >=88; 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

查询非计算机科学系中比计算机科学系任意一个学生年龄小的学生姓名和年龄SELECT Sname,SageFROM    StudentWHERE Sage < ANY (SELECT  SageFROM    StudentWHERE Sdept= ' CS ')AND Sdept <> ‘CS ' ;           /*父查询块中的条件 */执行过程:(1)首先处理子查询,找出CS系中所有学生的年龄,构成一个集合(20,19)(2)处理父查询,找所有不是CS系且年龄小于 20 或 19的学生用聚集函数实现SELECT Sname,SageFROM   StudentWHERE Sage < (SELECT MAX(Sage)FROM StudentWHERE Sdept= 'CS ')AND Sdept <> ' CS ';查询非计算机科学系中比计算机科学系所有学生年龄都小的学生姓名及年龄。
方法一:用ALL谓词SELECT Sname,SageFROM StudentWHERE Sage < ALL(SELECT SageFROM StudentWHERE Sdept= ' CS ')AND Sdept <> ' CS ’;方法二:用聚集函数SELECT Sname,SageFROM StudentWHERE Sage < (SELECT MIN(Sage)FROM StudentWHERE 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 SnameFROM StudentWHERE EXISTS(SELECT *FROM SCWHERE Sno=Student.Sno AND Cno= ' 1 ');查询没有选修1号课程的学生姓名。SELECT SnameFROM     StudentWHERE NOT EXISTS(SELECT *FROM SCWHERE Sno = Student.Sno AND Cno='1');查询与“刘晨”在同一个系学习的学生。可以用带EXISTS谓词的子查询替换:SELECT Sno,Sname,SdeptFROM Student S1WHERE EXISTS(SELECT *FROM Student S2WHERE S2.Sdept = S1.Sdept ANDS2.Sname = '刘晨');

不同形式的查询间的替换

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

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

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

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

171112a40491442c88c53af35b43e3d0.png

查询选修了全部课程的学生姓名。(不存在没有选修的课程)SELECT SnameFROM StudentWHERE NOT EXISTS(SELECT *FROM CourseWHERE NOT EXISTS(SELECT *FROM SCWHERE Sno= Student.SnoAND 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 SnoFROM SC SCXWHERE NOT EXISTS(SELECT *FROM SC SCYWHERE SCY.Sno = ' 201215122 '  ANDNOT EXISTS(SELECT *FROM SC SCZWHERE SCZ.Sno=SCX.Sno ANDSCZ.Cno=SCY.Cno));

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

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

相关文章

Typecho 博客文章评论添加显示 UserAgent(UA)的功能

本篇文章实现了为 Typecho 博客文章评论添加显示 UserAgent&#xff08;UA&#xff09;的功能本功能可替代 UserAgent 插件&#xff0c;更美观、简洁且好看 效果显示 大概就是这样了&#xff0c;实际效果请看我的评论&#xff01; 目前可以识别的操作系统以及浏览器 食用方…

用redis lua脚本实现时间窗分布式限流

需求背景&#xff1a; 限制某sql在30秒内最多只能执行3次 需求分析 微服务分布式部署&#xff0c;既然是分布式限流&#xff0c;首先自然就想到了结合redis的zset数据结构来实现。 分析对zset的操作&#xff0c;有几个步骤&#xff0c;首先&#xff0c;判断zset中符合rangeS…

吴恩达深度学习笔记:浅层神经网络(Shallow neural networks)3.1-3.5

目录 第一门课&#xff1a;神经网络和深度学习 (Neural Networks and Deep Learning)第三周&#xff1a;浅层神经网络(Shallow neural networks)3.1 神经网络概述&#xff08;Neural Network Overview&#xff09;3.2 神经网络的表示&#xff08;Neural Network Representation…

ArkTS编写的HarmonyOS原生聊天UI框架

简介 ChatUI&#xff0c;是一个ArkTS编写的HarmonyOS原生聊天UI框架&#xff0c;提供了开箱即用的聊天对话组件。 下载安装 ohpm install changwei/chatuiOpenHarmony ohpm 环境配置等更多内容&#xff0c;请参考如何安装 OpenHarmony ohpm 包 接口和属性列表 接口列表 接…

Qt实现简易的多线程TCP服务器(附源码)

目录 一.UI界面的设计 二.服务器的启动 三.实现自定义的TcpServer类 1.在widget中声明自定义TcpServer类的成员变量 2.在TcpServer的构造函数中对于我们声明的m_widget进行初始化&#xff0c;m_widget我们用于后续的显示消息等&#xff0c;说白了就是主界面的更新显示等 …

【Java常用API】带目的的爬虫

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

学习SpringBoot笔记--知识点(1)

目录 SpringBoot介绍 创建一个最基础的springbooot项目 使用Spring Initializr创建springboot项目 Spring Boot 自动配置机制 SpringBoot常用注解 1.组件注册 2.条件注解 3.属性绑定 SpringBoot自动配置流程​编辑 学习SpringBoot的方法 ​编辑 SpringBoot日志配置…

西井科技与安通控股签署战略合作协议 共创大物流全新生态

2024年3月21日&#xff0c;西井科技与安通控股在“上海硅巷”新象限空间正式签署战略合作框架协议。双方基于此前在集装箱物流的成功实践与资源优势&#xff0c;积极拓展在AI数字化产品、新能源自动驾驶解决方案和多场景应用&#xff0c;以及绿色物流链等领域的深度探索、强强联…

视频汇聚平台EasyCVR启用图形验证码之后调用login接口的操作方法

视频综合管理平台EasyCVR视频监控系统支持多协议接入、兼容多类型设备&#xff0c;平台可以将区域内所有部署的监控设备进行统一接入与集中汇聚管理&#xff0c;实现对监控区域的实时高清视频监控、录像与存储、设备管理、云台控制、语音对讲、级联共享等&#xff0c;在监控中心…

Windows如何搭建 ElasticSearch 集群

单机 & 集群 单台 Elasticsearch 服务器提供服务&#xff0c;往往都有最大的负载能力&#xff0c;超过这个阈值&#xff0c;服务器 性能就会大大降低甚至不可用&#xff0c;所以生产环境中&#xff0c;一般都是运行在指定服务器集群中。 除了负载能力&#xff0c;单点服务器…

【Unity】从0到1的横版2d制作笔记-DAY3

确定碰撞体积 选择rigidbody2d&#xff0c;创建player重力 创建player碰撞体积 创建瓦片地图碰撞体积 使平台变成一个整体 ​​​​​ 设置Body Type为Static&#xff08;避免平台也因为重力影响下落&#xff09; 回到Player&#xff0c;在Rigidbody2D中设置为冻结旋转 Player设…

2016年认证杯SPSSPRO杯数学建模C题(第二阶段)如何有效的抑制校园霸凌事件的发生全过程文档及程序

2016年认证杯SPSSPRO杯数学建模 C题 如何有效的抑制校园霸凌事件的发生 原题再现&#xff1a; 近年来&#xff0c;我国发生的多起校园霸凌事件在媒体的报道下引发了许多国人的关注。霸凌事件对学生身体和精神上的影响是极为严重而长远的&#xff0c;因此对于这些情况我们应该…

SQL映射文件

一、SQL映射的xml文件 1.1 mapper元素 二、select 三、别名与Java映射 四、resultMap 啊

Java毕业设计 基于SSM网上二手书店系统

Java毕业设计 基于SSM网上二手书店系统 SSM jsp 网上二手书店系统 功能介绍 用户&#xff1a;首页 图片轮播 图书查询 图书分类显示 友情链接 登录 注册 图书信息 图片详情 评价信息 加入购物车 资讯信息 资讯详情 个人中心 个人信息 修改密码 意见信息 图书收藏 已经付款 邮…

Golang基础知识(笔记迁移)

golang 变量作用域 局部作用域&#xff1a;代码块、函数内的全局作用域&#xff1a;顶层作用域&#xff0c;代码块外的就是全局&#xff0c;如果变量名大写&#xff0c;则改变量整个程序都可以使用。 类型断言 golang的类型断言在变量后加上.(type)&#xff0c;如果类型断言…

怿星科技Neptune CHT-S测试系统,让智能座舱测试更加高效便捷

随着汽车“智能化”浪潮的推进&#xff0c;汽车的智能化水平正在持续刷新行业认知。在这股智能化潮流中&#xff0c;智能座舱作为客户体验最为直观的部分&#xff0c;其重要性不言而喻。倘若座舱设备出现死机、黑屏、卡顿等现象&#xff0c;都将对客户的使用体验产生非常大的影…

xmes前端问题,给form表单赋值后,再次从表单拿不到该值

xmes前端&#xff0c;给form表单赋值后&#xff0c;再次从表单拿不到该值&#xff0c;但页面可以展示 赋值 this.$[frm-main].$$([namefilm_num]).value filmNum ; 获取表单的值&#xff0c;这里拿不到之前赋的值 const reqData this.$[frm-main].serializeMyForm(); 原因&…

2.7、创建列表(List)

概述 列表是一种复杂的容器&#xff0c;当列表项达到一定数量&#xff0c;内容超过屏幕大小时&#xff0c;可以自动提供滚动功能。它适合用于呈现同类数据类型或数据类型集&#xff0c;例如图片和文本。在列表中显示数据集合是许多应用程序中的常见要求&#xff08;如通讯录、…

Copilot for Microsoft365使用体验

注&#xff1a;本文来自粉丝投稿。 上周进行了留言抽奖&#xff0c;粉丝获得了一周体验资格&#xff0c;并写下了使用体验&#xff0c;特此赠送1个月copilot使用资格。 留言赠送copilot for Microsoft365一周体验卡 每周一Copilot for Microsoft 365留言赠送 上周一通过陈老…

【CPP】智能指针

引言 智能指针是RAII思想的体现&#xff0c;有时候程序抛异常导致指针指向的内存资源未释放&#xff0c;造成内存泄漏&#xff0c;这时就需要用到智能指针&#xff0c;它可以出作用域自动调用析构函数释放内存资源 内存泄漏 什么是内存泄漏 什么是内存泄漏&#xff1a;内存泄…