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

5 篇文章 3 订阅
订阅专栏

        这个条SQL语句是来自王姗老师《数据库系统概论》书中111页的例子。SQL语句是在我自己建立的表的基础上写出来的。SQL语句如下

select distinct Sno
from tb_SC x
where not exists
(
	select *
	from tb_SC y
	where y.Sno='20173824001' and not exists
	(
		select *
		from tb_SC Z
		where z.Cno=y.Cno and 
		z.Sno=x.Sno
	)
)

        首先,题目要我们所求的是一名学生的学号,但是这个名学生X必须至少选修了学号为201215122学生Y的全部课程,当然学生X也可以选修多余学生Y的课程。因为SQL中没有全称量词,所以,这里得使用否定之否定来实现。

        第一:求出学生Y选修的所有课程;第二:把学生X的学号拿到SC表里面去对,看看是否满足所有的记录都在SC里面。

        举个例子:X={2017001,2017002},Y={数据库,操作系统,数据结构},Z={2017001=数据库,2017001=操作系统,2017002=数据结构}。其中X是所有学生学号的集合,Y是201215122同学选修的所有课程的集合,Z是一张选修课程表。那么首先我们取出X中的第一条记录2017001,去和Y中第一条记录数据库组合,形成新记录W:2017001=数据库,然后拿W去Z中找,看看能不能找到W。显然,这条记录可以找到。那么继续操作,从Y中取出第二条记录操作系统,组合成W:2017001=操作系统,拿W去Z里面发现还是可以找到。继续从Y里面拿出一条记录数据结构,组合成W:2017001=数据结构,去Z里面找,发现没有找到。那么这个时候没有找到,说明了一个什么问题。证明2017001没有选修数据结构这门课,但是Y选修了这门课(Y是201215122同学选修的所有课程的集合),所以X中的2017001不符合题意。

        看到这里应该就对它的写法的一个思想理解了。接下来具体到SQL语句去理解。以下内容为个人理解,可能存在错误的地方,望大家留言评论。

        首先看到上面的思想,就知道的使用循环来实现这个目的,在我的另外一篇博客里面就说到,相关子查询就是一个循环。所以,这里得使用相关子查询来实现。

        其次前面说了,要使用否定之否定来做,所以要使用not exists。而且,对于exists和not exists来说,也必须和相关子查询来搭配使用。(个人理解)

        我们看到第二重查询中有一个 y.Sno='20173824001’这个就是为了后面三张表在做连接的使用导致y.Sno只能是20173824001,那么就会导致y.Cno只能是20173824001所选择的课程的Cno(这个也就是我们的目的),所以,z.Cno也会被限制住。z.Cno被限制后,导致z.Sno也被限制住,同时影响x.Sno。如果大家不理解的画,可以先单独写一哈这样的语句:

select * 
from tb_SC x,tb_SC y,tb_SC z
where x.Sno=z.Sno and y.Cno=z.Cno

这个就是把三张表连接起来,至于为什么要这样连,不写成

where x.Cno=z.Cno and y.Sno=z.Sno

这个原因就是上面的那段话,通过一些限制就可以达到这个效果了。我还试过这样写:

select distinct Sno
from tb_SC x
where not exists
(
	select *
	from tb_SC y
	where  not exists
	(
		select *
		from tb_SC Z
		where z.Cno=y.Cno and 
		z.Sno=x.Sno and y.Sno='20173824001'
	)
)

结果也是错误的。为什么也是错误的呢?我是这样想的。对于正确写法而言,我们最终相当于是在下面这个SQL语句得出的表中匹配结果。

select *
from tb_SC x,tb_SC y,tb_SC z
where z.Cno=y.Cno and 
z.Sno=x.Sno

上面的结果得出的表,我截一部分来看看:结果有很多组合!
在这里插入图片描述
但是按照错误的写法来看,我们就是在这样的SQL语句得出的表中来匹配结果:

select *
from tb_SC x,tb_SC y,tb_SC z
where z.Cno=y.Cno and 
z.Sno=x.Sno and y.Sno='20173824001'

这个是它的结果:结果相对来说就很少了。
在这里插入图片描述
        最后,大家可以看到,写成错误的写法,显然会将有些应该匹配的数据丢失。记得,当你之后回头复习发现还是不会的时候,可以自己把上面的函数去执行一下就可以了,看看结果到底是什么。图片终究是不真实的,自己实际看到的才真实。

        最上面的结果是会返回学生20173824001的,但是我现在要查询的是:至少选修了学生20173824001选修的全部课程的其他学生的学号。

select distinct Sno
from tb_SC x
where not exists
(
	select *
	from tb_SC y
	where y.Sno='20173824001' and not exists
	(
		select *
		from tb_SC Z
		where z.Cno=y.Cno and 
		z.Sno=x.Sno  and x.Sno!='20173824001'
	)
)

        说了很多,其实还是得自己多多理解,这个复杂的SQL语句靠别人是学不会的,的自己理解。加油?

-------------------------------------------------------分割线----------------------------------------------------------
以下内容是25 jun 补充:

        

查询至少选修了0001号和0002号课程的学生的学号。

一开始遇到这个题目,就想到的使用否定之否定。但是,发现自己写不出来了。欸,只能说自己还是没有掌握吧!为什么说这里可以不用使用否定之否定呢?是因为上面是要我们求“至少选修了学生201215122选修的全部课程的学生号码”,我们并不知道201215122到底选修了什么。但是这题不一样,题目明确说了,就是至少选修了0001和0002号课程的学生。所以,我们使用一个谓词in就可以了。SQL语句如下:

select distinct Sno
from tb_SC
where Sno in(
select x.Sno
from tb_SC x,tb_SC y
where x.Sno=y.Sno and x.Cno='0001' and y.Cno='0002');

如果这里没有加上distinct的话,就会有很多重复的记录,就像这个样子
在这里插入图片描述
原因很简单,就是因为嵌套查询的原理都是拿出一条元组记录一个一个去比配,满足的话就放到结果集中去。所以,因为选课表是一个学生可能选择多门课,所以,就会有重复的记录了。

        还有为什么要使用自身连接,这个为之前的博客里面有说到过,链接给大家去看啦!https://blog.csdn.net/suliangkuanjiayou/article/details/93108945

-------------------------------------------------------------------分割线----------------------------------------------
以下内容2.july补充:

        还是之前的老问题,但是我现在发现了一个新的东西。
问题:查询选修了所有课程的学生学号。SQL语句如下

select Sno
from tb_Student
where not exists(
select *
from tb_Course
where not exists(
select * 
from tb_SC
where tb_SC.Cno=tb_Course.Cno and 
tb_SC.Sno=tb_Student.Sno
)
)

我发现这里是用到了tb_Student,tb_Course,tb_SC三张表。
但是对于一个同样的类似的问题,
问题:查询至少选修了1001号老师所有课程的学生的学号。SQL语句如下:

select distinct Sno
from tb_SC x
where not exists(
select *
from tb_Course,tb_Teacher
where tb_Course.Tno=tb_Teacher.Tno
and tb_Teacher.Tno='1001' and not exists(
select * 
from tb_SC y
where x.Sno=y.Sno and y.Cno=tb_Course.Cno
)
)

但是这里仅仅使用了tb_SC表,和tb_Course表(tb_Teacher表忽略,因为和它关系不大)。我就在想,我觉得按照之前我的想法,这里写成这这样子应该也是没有问题的:

select  Sno
from tb_Student
where not exists(
select *
from tb_Course,tb_Teacher
where tb_Course.Tno=tb_Teacher.Tno
and tb_Teacher.Tno='1001' and not exists(
select * 
from tb_SC 
where tb_Student.Sno=tb_SC.Sno and tb_SC.Cno=tb_Course.Cno
)
)

因为按照我之前博客的讲法,就是从tb_Student表中拿出一条记录,和tb_Course中1001号老师讲授的所有课程进行组合,如果在tb_SC中可以找到所有的记录,则说明这个学生选修了所有的课程。然后,事实告诉我们,还真的就是对的。哈哈哈哈。

        细心的同学可能知道了,第一个答案上面使用distinct的,不然出来的结果就是会有很多重复的,但是后面那个方法是没有加上distinct关键字的,但是结果还是正确无误的。可以用心体会以下这个的区别

查询至少选修学生200215122选修的全部课程学生号码
垃圾佬的博客
05-10 1万+
查询至少选修学生200215122选修的全部课程学生号码 解体思路 如果有一门课学生200215122选了而另一个同学没选就不输出这个学生好吗 即不存在一个课程Y,同学200215122选了 而同学X没选 代码如下 SELECT DISTINCT sno FROM SC AS SCX WHERE NOT EXISTS ( SELECT * FROM SC AS SCY ...
查询至少学习了1号课程和2号课程学生的学号,姓名的八种写法
06-22
查询至少学习了1号课程和2号课程学生的学号,姓名的八种写法,是非常经典的
查询至少选修学生201215122选修的全部课程学生号码(1)
2401_84281729的博客
04-29 350
课程,涵盖了95%以上网络安全知识点,真正体系化!
sql查询至少选修学生202019122选修的全部课程学生号码
zys_shan的博客
04-21 8105
问题:查询至少选修学生202019122选修的全部课程学生号码 解题思路:用逻辑蕴含表达这个查询 用p表示谓词"学生202019122选修课程y" 用q表示谓词"学生x选修课程y" 则上述查询为(∀y)p → q 等价变换(这一部分会较难理解): (∀y)p → q ≡ ┐(∃y ( ┐(p → q ) ) ≡ ┐(∃y(┐(┐p Vq))) ≡┐∃y(p∧┐q) 解析: ...
查询与维护学生信息管理数据表(分组与排序)
最新发布
2301_80812435的博客
05-08 500
select "sno",count(*) as "选课门数",sum("degree") as "总成绩" from "sc" group by "sno" order by count(*) desc;select "cno",count(*) as "选课人数",max("degree") as "最高分" from "sc" group by "cno","degree";select "cno",count(*) as "选课人数" from "sc" group by "cno";
求出选修了所有课程学生姓名
farawayplace613的专栏
12-26 3336
求出选修了所有课程学生姓名学生表 S(SNO int pk,SN varchar(8))  --SNO为学号 ,SN为学生姓名。课程表 C(CNO int pk,CN varchar(50)) --CNO为课程号,CN为课程选修表 SC(SNO int pk,CNO int pk,SCORE number(7,2),fk(SNO,CNO) )  --SCORE为成绩。--以下语句为求出
一道SQL:至少选修学生002选修的全部课程学生编号
计算机技术博客
08-22 7071
INSERT test_c SELECT '001', '001' UNION ALL SELECT '001', '002' UNION ALL SELECT '001', '003' UNION ALL SELECT '002', '001' UNION ALL SELECT '002', '002'  UNION ALL SELECT '003', '003' UNION ALL
查询至少选了1班2号同学所选课的所有同学班号、学号
qq_43380015的博客
12-27 1550
∀。
课程设计说明书-学生选修课程系统.docx
03-21
课程设计说明书-学生选修课程系统 课程设计说明书-学生选修课程系统是一个基于信息时代的教育管理系统的设计方案。该系统旨在解决学生选课管理的随意性,提高信息处理的速度和准确性。通过使用计算机进行信息管理和...
学生选修课程系统设计
09-07
 假定有n门课程,每门课程课程编号,课程名称,课程性质,总学时,授课学时,实验或上机学时,学分,开课学期等信息,学生可按要求(如总学分不得少于60)自由选课。...e) 学生选修课程(可选项)
C语言课程设计学生选修课程系统设计.doc
07-11
"C语言课程设计学生选修课程系统设计" 一、设计目的: 在信息化的社会中,计算机的应用是必不可少的,计算机可以进行信息管理,提高工作效率和安全性。因此,设计一个学生选修课程系统,以规范化、系统化、程序化...
C语言课程设计学生选修课程系统设计.pdf
10-01
C语言课程设计学生选修课程系统设计 一、设计目的 在信息时代,计算机被广泛应用于信息系统中,以提高工作效率和安全性。计算机可以充分发挥其优越性,进行信息管理和控制。这项设计旨在建立一个学生选课系统,使...
where exists/not exists-----查询选修了全部课程学生姓名
csdnnmbdybb的博客
08-27 7737
看课件对照icourse课程网上的课程视频。 对于这题----查询选修了全部课程学生姓名------一步步分析 首先,我们的目标是要姓名 from student where(没有一门课是他没选修的) 没有一门课是他没选修的-----> 学过缩句的我们知道这句话的主语就是课,前面是 not exists; 所以 就是where not exists( select * fr...
数据库系统原理——对比与解析查询至少有一门课与学号为’0700001’的学生所学相同的学生的学号和姓名和查询至少选修了学号为“0700001”学生选修的所有课程学生姓名。
#两个西柚
06-28 4847
一、【问题描述】 用SQL语句完成下列数据查询操作 1.查询至少有一门课与学号为’0700001’的学生所学相同的学生的学号和姓名。 2.查询至少选修了学号为“0700001”学生选修的所有课程学生姓名。 二、【问题解答】 问题解析:因为在第一题的要求中是要查询至少有一门课与学号为‘0700001’的学生相同的学生学号和姓名,因此查询的结果中学生只要有一门课程或者一门课程以上选修的与‘0700001’的学生相同即可,所以只要先查询出‘0700001’学生选修课程课程号,然后再对比看看哪些学生
选修所有课程学生信息
weixin_30739595的博客
08-05 236
create table students( sid int not null primary key auto_increment, sname char(4) not null, ssex char(2) not null);create table course( cid int not null primary key auto_increment, cnam...
SQL语句基本操作练习(五)
FDR_Enterprise的博客
03-22 2651
SQL查询必会的几个操作:嵌套查询EXISTS、集合查询、基于派生表的查询
数据库作业:SQL练习5 - SELECT(嵌套查询EXISTS、集合查询、基于派生表的查询
karive的博客
03-18 1952
【3.60】查询所有选修了1号课程学生姓名。 SELECT Sname FROM Student WHERE EXISTS (SELECT * FROM SC WHERE Sno=Student.Sno AND Cno='1'); 带有EXIST谓词的子查询。带IN谓词,ANY和ALL 谓词的子查询都能用EXIST子查询等价替换但是有些EXIST子查询不能被其他...
数据库原理关系代数两道经典题目
热门推荐
qq_53162179的博客
05-15 1万+
两道关系代数题
查询至少选修学生201215122选修的全部课程学生号码关系代数
06-06
假设学生选修课程的关系模式为: Student(sid, sname) -- 学生表,包含学生编号和学生姓名 Course(cid, cname) -- 课程表,包含课程编号和课程名称 Enrollment(sid, cid) -- 选课表,记录学生选修课程,包含学生编号和课程编号 则查询至少选修学生201215122选修的全部课程学生号码的关系代数表达式如下: π sid ((π cid (Enrollment) - π cid (σ sid=201215122(Enrollment))) - π cid (σ sid NOT IN (201215122) (Enrollment)))GROUP BY sidHAVING COUNT(cid) = (SELECT COUNT(cid) FROM Course)) 该表达式的含义是:首先从选课表中剔除学生201215122选修课程,再从中剔除未选修课程学生,最后根据学生编号进行分组,并统计每个学生选修课程数量是否与总课程数量相等,如果相等则表示该学生选修了全部课程

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • SQL语句中的嵌套子查询 36862
  • 查询至少选修了学生201215122选修的全部课程的学生号码 36839
  • HTTP协议抓包分析 30939
  • 计网真题:信道利用率计算 30127
  • 关于二叉树先序遍历和后序遍历为什么不能唯一确定一个二叉树分析 21863

分类专栏

  • 多线程 1篇
  • 面试 3篇
  • 网络编程 3篇
  • 统考408错题集 2篇
  • 计算机组成原理 1篇
  • 编译原理 2篇
  • 《自己动手写编译器、链接器》读书笔记 1篇
  • 算法学习 1篇
  • 数据结构 8篇
  • 小白问题 1篇
  • c语言常见问题和解决方法 8篇
  • 算法题目 1篇
  • Linux学习 10篇
  • C++ 1篇
  • 编程语言之间的比较
  • Java 1篇
  • 数据库
  • 数据库原理及应用 5篇
  • 操作系统 6篇
  • 计算机网络 2篇

最新评论

  • 操作系统408真题:共享段表的操作

    NotFear: 你好,我现在手上没有这本书了。如果你在第4版没有看到的话,可以找一下电子版的第3版,看看P187页有没有相关内容。

  • 操作系统408真题:共享段表的操作

    a5595950: 请问这是汤小丹第几版啊 我第四版书上怎么没有共享段表表情包表情包

  • SQL语句中的嵌套子查询

    powerfulbeauty: 我悟了!同时查询一个属性的两个值的话,采用自身连接

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

    powerfulbeauty: 同感,只需要把1001号老师课程的课程号找出来

  • 操作系统408真题:共享段表的操作

    讳莫_如深: 通过贴主的图4-34,我的理解是: 重定位跟这个共享段表没关系,共享段表就是做描述的 各进程该干啥干啥 这道题一下就简单了

大家在看

  • 2024年6.18有必要购买正版FL Studio21吗? 929
  • 基于单片机的机械手臂控制系统设计 474
  • 计算机Java项目|SpringBoot的图书进销存管理系统 1156
  • 文件包含// 403
  • 国内高校ACM ICPC的主要成绩 339

最新文章

  • Mac OS上使用matplotlib库显示中文字体
  • fork()函数与虚拟地址
  • memcpy与strcpy的区别
2024年1篇
2021年7篇
2020年6篇
2019年25篇
2018年11篇

目录

目录

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

4617作文网淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男子给前妻转账 现任妻子起诉要回网友建议重庆地铁不准乘客携带菜筐月嫂回应掌掴婴儿是在赶虫子重庆警方辟谣“男子杀人焚尸”国产伟哥去年销售近13亿新的一天从800个哈欠开始男孩疑遭霸凌 家长讨说法被踢出群高中生被打伤下体休学 邯郸通报男子持台球杆殴打2名女店员被抓19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警两大学生合买彩票中奖一人不认账德国打算提及普京时仅用姓名山西省委原副书记商黎光被逮捕武汉大学樱花即将进入盛花期今日春分张家界的山上“长”满了韩国人?特朗普谈“凯特王妃P图照”王树国3次鞠躬告别西交大师生白宫:哈马斯三号人物被杀代拍被何赛飞拿着魔杖追着打315晚会后胖东来又人满为患了房客欠租失踪 房东直发愁倪萍分享减重40斤方法“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火手机成瘾是影响睡眠质量重要因素考生莫言也上北大硕士复试名单了妈妈回应孩子在校撞护栏坠楼网友洛杉矶偶遇贾玲呼北高速交通事故已致14人死亡西双版纳热带植物园回应蜉蝣大爆发男孩8年未见母亲被告知被遗忘张立群任西安交通大学校长恒大被罚41.75亿到底怎么缴沈阳一轿车冲入人行道致3死2伤奥运男篮美国塞尔维亚同组周杰伦一审败诉网易国标起草人:淀粉肠是低配版火腿肠外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万杨倩无缘巴黎奥运男子被猫抓伤后确诊“猫抓病”春分“立蛋”成功率更高?记者:伊万改变了国足氛围奥巴马现身唐宁街 黑色着装引猜测

4617作文网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化