SQL除法的实现

文章通过举例说明如何使用SQL的notexists子句来实现关系数据库中的除法操作,以找出选修所有课程的学生学号。通过对SC和Course两个关系模式的交互查询,解释了双重否定逻辑如何确保学生选修了所有课程。最后提供了一个查询示例,查询至少选修了指定学生所有课程的其他学生号码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

R(X,Y)÷S(Y) 等价于

Select distinct R.X from R R1
Where not exists(
Select * from S
Where not exists(
Select * from R R2
Where R2.X = R1.X and R2.Y = S.Y
)
)

以万年例子关系模式SC(sno,cno)与Course为例。
课程表Course
选课表SC

SC÷Course得到就是选了全部课程的学生学号,即95001.

现在开始分析SQL语句除法过程:

SC÷Course得到选了全部课程的学生学号=得到学号,该学生没有一门课没选。
这里使用了双重否定。
第一层:该学生一门都没选。假定该学生学号为95001

select * from course c
where not exists(
	select * from sc
	where sc.sno=95001 and sc.cno = c.cno
)

这次查寻过程如下:选取Course的第1个元组(1),与该学生95001结合,发现sc中存在(95001,1),即95001选了1号课,由于not exists ,故course第一个元组(1)排除了,不显示;接下来按照上诉,一次选取course元组进行操作,发现结果什么都没显示,空集。

第二层

not exists(
	select * from course c
	where not exists(
		select * from sc
		where sc.sno=95001 and sc.cno = c.cno
	)
)

按照上诉分析,对于95001这个学号,not exists(空集)=true。即95001选了全部课程,接下来循环遍历检查学号就可以得到全部要求的学号了。

select sc1.sno from SC sc1
where not exists(
	select * from Course c
	where not exists(
		select * from SC sc2
		where sc2.sno.sc1.sno and sc2.cno = c.cno
	)
)

多多过几遍过程就会了。

[例]查询至少选修了学生95002选修的全部课程的学生号码。

select distinct sc1.sno from SC sc1
where not exists(
	select * from SC sc2
	where sc2.sno = 95002 and
	not exists(
		select * from SC sc3
		where sc3.sno = sc1.sno and sc3.cno = sc2.cno
	)
	
)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值