数据库关系代数中除运算讲解和SQL语句的实现

article/2025/10/7 3:28:40

【数据库原理】关系代数篇——除法讲解

                                                                                                                                                                                                                                                           陈宇超   编辑总结:

除法运算的一般形式示意图

 

如何计算R÷S呢,首先我们引进”象集”的概念,具体意义看下面的陈述即可理解

关系R和关系S拥有共同的属性BC , R÷S得到的属性值就是关系R包含而关系S不包含的属性,即A属性

 

在R关系中A属性的值可以取{ a1,a2,a3,a4 }

a1值对应的象集为 {  (b1,c2)  , (b2,c1) ,  (b2,c3)  }

a2值对应的象集为 {  (b3,c7)  , (b2,c3) }

a3值对应的象集为 {  (b4,c6)  }

a4值对应的象集为 {  (b6,c6)  }

 

关系SBC上的投影为 {  (b1,c2)  , (b2,c1) ,  (b2,c3)  }

 

只有a1值对应的象集包含关系S的投影集,所以只有a1应该包含在A属性中

所以R÷S为

                A                  

a1

 

【例题一】为了更好的理解除法的实际作用,请看下面的例题

设有教学数据库有3个关系(以下四小问均用除法的思想解决)

学生信息关系student(sno,sname,age,sex)

学生选课关系 sc(sno,cno,score)

学校课程关系 course(cno,cname)

Student表

                         sno                            

                       sname                    

                              age                                 

                 sex                    

S001

陈晓

16

S002

周倩

21

S003

华南

19

S004

曹匀

21

S005

郑威

20

Course表

                         cno                            

                      cname                      

C001

计算机科学

C002

诗歌鉴赏

C003

资本论

SC表

                         sno                           

                           cno                       

                    score                   

                        S001

                         C001

                     88

                        S001

                          C002

                     95

                        S001

                          C003

                     99

                        S002

                          C001

                     97

                        S002

                          C003

                     84

                        S003

                          C002

                     69

                        S005

                          C002

                     77

                        S005

                          C003

                     98

 

SQL语言中没有全称量词,具体实现时可以把带有全称量词的谓词转换为等价的带有存在量词的谓词。

解决这类的除法问题一般采用双嵌套notexists来实现带全称量词的查询解决所谓forall的问题。

 

(1)   检索所学课程包含了C002课程的学生学号

解   关系代数表达式:∏sno ( sc÷∏cno(σcno=’C002’ (course) )

Sql语句

从略

 

(2)   求至少选择了C001和C003两门课程的学生学号

解    关系代数表达式:∏sno ( sc÷∏cno(σcno=’C001’ or cno=’C003’(course) )

Sql语句

select  distinct  sno  from  sc  A  where  not  exists

(

       select  *  from   course B where  cno   in ('C002','C003')  and   not  exists

        (

      select * from  sc C where   A.sno=C.sno   and   B.cno=C.cno

        )

)

也可以采用自连接

select   s1.sno   from (  select   *  from   sc   where    cno='C001'  )   as   s1,

                                     (  select   *  from    sc   where   cno='C003'   )   as   s2

where s1.sno=s2.sno

 

(3)   求至少学习了学生S003所学 课程的学生学号

解    关系代数表达式:∏sno ( sc÷∏cno(σsno=’S003’ (sc) )

select   distinct   sno from   sc   A   where   not   exists

(

           select   *   from   sc   B   where   sno='S003'   and    not   exists

   (

         select   *   from   sc   C   where   A.sno=C.sno   and   B.cno=C.cno

  )

)

 

(4)   求选择了全部课程的学生的学号

解    此例的等价自然语义是,输出这样的学号,不存在某门课程在他的选课记录里没有选这门课

        关系代数表达式:∏sno (sc÷∏cno(course) )

Sql语句

select distinctsno  from  sc  A  where  not  exists

(

          select  cno  from  course B  where  not  exists

          (

             select *  from  sc C  where C.sno=A.sno and C.cno=B.cno

     )

)

 

(5)   求选择了全部课程的学生的学号和姓名

解    关系代数表达式:∏sno,sname((student∞sc)÷∏cno(course) )

Sql语句

select    sno,sname   from   student   A   where not exists

(

     select   cno   from   course  B   where   not   exists

  (

select *  from  sc C  where  C.sno=A.sno  and  C.cno=B.cno

)

)

以上小问用groupby结合count语句也是可以实现的,也更好理解一些。

例如

求选择了全部课程的学生学号

SELECT   sno  FROM  (  SELECT COUNT(*)   cnt,   Sno

FROM  SC

GROUP BY   sno  )   T  WHERE cnt  =( SELECT COUNT(Cno )  FROM COURSE  )

求至少选择了C002C003两门课程的学生学号

select   sno   from  sc  where cno   in('C002','C003')   group by   sno   having COUNT(cno)=2

注意:但该方法对于一个学生多次选修一门课程的情况无法处理,需要对其中的 SC 关系用distinct进行一定的预处理,所以group by+ count 有一定的局限性

 


http://chatgpt.dhexx.cn/article/hJxxQ2kV.shtml

相关文章

关系代数基本运算 数据库

操作目录 关系代数的八种基本运算并交差笛卡尔积选择投影连接除总结 关系代数的八种基本运算 并 并,就是将两个或多个表并连起来,需要注意的就是在并的过程中,我们并不是直接一笼统地并起来,而且还要对相同的元祖进行合并&#x…

数据库系统概论----关系运算之除运算

这一周都在复习《数据库系统概论》这门课,看到关系运算的这一节时,对于除运算不是很理解。 通过百度,我觉得也没有得到比较容易理解的讲解。 这里呢,我就分享一下我的理解吧,如有差错的地方,还希望看到这…

数据库-----关系运算

关系数据库概述 相关术语 ◎在现实世界中,描述一个事物常常要抽取其若干特征来表示,这些特征称为属性,如用学号、性别、班级等来描述学生。每个属性的取值范围对应一个值的集合,称为属性的域,如性别的域是{男&#x…

数据库基础--关系代数中的除法运算

除法运算的定义: 这个概念的描述的非常抽象,刚开始学习的同学完全不知所云。这里通过一个实例来说明除法运算的求解过程 设有关系R、S 如图所示,求RS 的结果 求解步骤过程: 第一步:找出关系R和关系S中相同的属…

数据库的运算

数据库的运算可分为集合运算和关系运算。 一、集合运算 • 从关系的水平方向迚行; • 包括,幵、交、差、笛卡尔积运算。 • 幵运算(R U S):可实现数据的揑入。 • 差运算(R–S):主…

关系数据库:专门关系运算

专门关系运算有:选择,投影,连接,除运算。 1.选择从关系中找出满足给定条件的所有元组称为选择,其中条件是用逻辑表达式给出的,逻辑表达式为真时元组被选取。 选择运算记为δF(R)&am…

详解【数据库】关系代数基本运算

文章目录 五中基本的关系代数操作并(Union)差(Difference)广义笛卡尔积(Extended Cartesian Product)投影(Projection)选择(Selection) 连接等值连接自然连接…

数据库关系运算——除运算

书上给“除运算”的定义是: 设关系R除以关系S的结果为关系T,则T包含所有在R但不在S中的属性及其值,且T的元组与S的元组的所有组合都在R中。 我对此不是很理解。 直到看到这样的解读,方才恍然大悟:

【数据库】关系代数基本运算

前言 关系代数是以关系为运算对象的一组高级运算的集合。由于关系定义为属性个数相同的元组的集合,因此集合代数的操作就可以引入到关系代数中。关系代数中的操作可以分为两类:传统的关系操作,并、差、交、笛卡尔积(乘&#xff09…

数据库原理之关系数据库关系运算

关系数据库关系运算 选择投影链接除运算 选择运算 选择运算是从关系R中选取使逻辑表达式F为 真的元组,是从行的角度进行的运算 投影运算 投影操作主要是从列的角度进行运算,但投影之后不仅取消可原关系中的某些列,而且还可能取消某些元组…

数据库之关系数据库的关系运算

关系运算的机理有什么用 我们学习关系运算的机理,对我们理解数据库查询操作非常重要 所以我们进行关系操作时很大程度上需要明白关系操作以及关系之间的逻辑 在我们进行数据库查询操作时,如何规范的使用数据库语言,如何进行选择时能够消除我…

数据库中的关系运算

1、和(Union)运算、针对行 针对两张具有相同属 性的表,将两者表合并起来,在合并过程中遇到重复的行保留一项就行了。 2、差(difference)运算、针对行 针对两张具有相同属 性的表,第一张表减去第…

数据库关系运算

专升本 数据库的关系运算 本文章是讨论数据库中的8种关系运算,分为传统的集合运算和专门的关系运算 传统集合运算 1:并运算U:将表拼接起来,且去掉重复记录(同结构) 2:交运算∩:取…

kafka消费模式

简介:kafka是一种消息队列,主要是观察者模式(Obsever)一个分布式的发布、订阅的消息系统,支持海量数据的数据传递(高吞吐)。Kafka将消息持久化到磁盘中,并对消息创建了备份保证了数据…

kafka 命令行操作大全

kafka 命令行操作大全 一、集群相关常用命令二、topic相关常用命令2.1 脚本&参数简介2.2 举例 三、生产者命令行常用操作3.1 脚本&参数简介3.2 举例发送消息 四、生产者命令行常用操作4.1 脚本&参数简介4.2 举例消费消息 这里主要讲命令行操作,如何安装…

Kafka版本讲解

1 文章背景 在维护一些老项目时候,总会听到 kafka 0.8版本,0.10版本,会感觉到很奇怪,为什么版本号 不是从1.0.0开始,本篇文档重点阐述一下kafka非主流的版本号 2 参考文章 Apache Kafka 3 个人理解 kafka对外发布第一个版本的时候版本号就不…

Kafka消费模式详解

美图欣赏: ​​​​​​ 一.Kafka是什么 在流式计算中,Kafka一般用来缓存数据,spark通过消费Kafka的数据进行计算。 1)Apache Kafka是一个开源消息系统,由Scala写成。是由Apache软件基金会开发的一个开源消息系统项目…

Hadoop生态之kafka史上最全详解!

1、消息队列的介绍 消息(Message):是指在应用之间传送的数据,消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。 消息队列(Message Queue)&#x…

Kafka为什么依赖Zookeeper?

前言:在我们了解kafka为什么依赖zookeeper之前,首先要先知道zookeeper自身的一个基础架构和作用 “所有一切的努力都是为了自己的名字” Zookeeper概念扫盲 基本概述 ZooKeeper是一个分布式协调服务,它的主要作用是为分布式系统提供一致性…

Kafka能干什么,为什么如此受欢迎?

一、Kafka是什么? Kafka是最初由Linkedin公司开发的一个分布式、分区的、多副本的、多订阅者,由Scala和Java编写的基于zookeeper协调的分布式流处理平台,常见可以用于web日志、访问日志,消息服务等等,Linkedin于2010年将其贡献给了…