检索所有课程都选修的的学生的学号与姓名
这是SHU数据库原理上机题目中的一道。全部题目:http://www.docin.com/p-739281393.html
代码网上有:
select xh,xm
from s
where not exists
(select * from c
where not exists
(select * from e
where xh=s.xh and kh=c.kh
)
)
其中s是学生表,c是课程表,e是选课表
上课没注意听,实验验收前看了很久没看懂。网上的讲解没看明白,并且还有错的讲解(该页的最后会有)。直接跟老师说这个不懂,老师让我中午去找他。花了20多分钟,我懂了。老师说上课还是要听,我深以为然。
这代码有三种方式去理解:
1、离散数学中的谓词逻辑演算系统
先来复习一下
∃x∀yR(xy) :存在x对于任意的y满足关系R(xy)。
﹁∀yW(y):不是所有的y都满足关系W(y),那么就是存在y不满足关系R,即∃y﹁W(y)
令f(x):x是学生;g(y):y是课程;r(xy):学生x选修了课程y。
“所有课程都选修的学生”可以表示为∃x∈f(x)∧∀y∈g(y)∧r(xy) ,就是存在学生任意一门课都选了。
SQL语言中没有全称量词,所以通过双重否定来实现
﹁﹁((∃x∈f(x)∧∀y∈g(y))∧r(xy)) => ∃x∈f(x)∧﹁(∃y∈g(y)∧﹁r(xy))
对于﹁∀yR(xy),理解为不是所有的y都满足关系R,那么就是存在y不满足关系R,∃y﹁R(xy)
然后用这个式子与上面的代码对照。
﹁就相当于一个not exists,∃其实相当于是select。
select xh,xm from s 等价于∃x∈f(x)
select * from c 等价于 ∃y∈g(y)
where not exists(select * from ewhere xh=s.xh and kh=c.kh) 等价于 ﹁r(xy)
2、用C++的编程思想来理解
for(int i=0;i<s.length;i++)
{
for(int j=0;j<c.length;j++)
{
if(学生i没有选修j课程) break;
}
if(j==c.length) i就是选修了所有课程的学生;
}
两个not exists可以这样解释,依次从学生表里找一个学生,让这个学生去选课表里找课程。如果遍历到某课程该学生没有选修,就结束,然后开始遍历下一个学生。如果是遍历完课表的话,就代表着该学生学修了所有的课程。
也就是说我们不去用语言来翻译代码,换种思维来理解它。
3、纯粹记忆
如果查询“全部”内容,需用到全称量词,但SQL语言只提供存在量词,我们用存在量词双重否定来解决
SELECT <查询内容> FROM 表1 WHERE
NOT EXISTS(SELECT * FROM 表2 WHERE
NOT EXISTS(SELEST * FROM 表3 WHERE
表3与表1联接条件 AND 表3与表2联接条件))
表1是查询结果所需要的表
表2是全部内容所在的表
表3是将联接上述两表的表
例:1.查询使用了全部零件的工程名称(理解为没有零件是不用的)
2.查询至少用了供应商S1所供应的的全部零件的工程号
这种方法是不去理解no exists的原理,记住格式就好了。应付考试专用。
关于上面提到的错误的讲解:
有人说代码可以这样写:
select xh,xm
from s
where xh in
(
select xh from e group by xh
having count(*) = (select count(*) from c)
)
这样理解的,统计课程的数量,记为n,假如某学生所修的课程的数量为n。那么该学生就是选修所有课程的人。
刚开始我也以为这样可以的。因为逻辑上是正确的。
我在课程表c中添加了几组数据,使得有人选修了所有课号的课。但是运行最上面的代码(代码1)和这条代码(代码2)的运行结果是不同。
那么导致结果不同的原因是什么呢?课程表c里有重修课程,也就是有课程虽然是相同的课程号,但是由于开课的时间不同,所以它们不算一门课。
那么上面的代码有可取的地方么?有,特殊的情况是可以用的,就是事件是唯一的的时候。
转载于:https://www.cnblogs.com/Potato-lover/p/4172461.html
检索所有课程都选修的的学生的学号与姓名相关推荐
- 现有关系数据库如下: 学生(学号,姓名,性别,专业) 课程(课程号,课程名,学分) 学习(学号,课程号,分数) 分别用关系代数表达式和 SQL 语句实现下列 1—5 小题(注意:每小题都要分别 写出关
现有关系数据库如下: 学生(学号,姓名,性别,专业) 课程(课程号,课程名,学分) 学习(学号,课程号,分数) 分别用关系代数表达式和 SQL 语句实现下列 1-5 小题(注意:每小题都要分别 写出关 ...
- mysql查询学号和姓名_数据库SQL语句中 查询选修了全部课程的学生的学号和姓名...
一.SQL语言查询选修了全部课程的学生的学号和姓名. 两种解决途径: 第一种: 我们可以表示为在SC表中某个学生选修的课程数等于C表中课程总数.相应的SQL语言如下: selectS#,SNAMEfr ...
- mysql查询选课程的学生学号和姓名_数据库SQL语句中查询选修了全部课程的学生的学号和姓名理解...
首先头脑中有三点概念: 1.EXISTS子查询找到的提交 NOTEXISTS子查询中找不到的提交 说明:不要去翻译为存在和不存在,把脑袋搞晕. 2.建立程序循环的概念,这是一个动态的查询过程.如FOR ...
- mysql查询选课程的学生学号和姓名_数据库SQL语句中 查询选修了全部课程的学生的学号和姓名...
一.SQL语言查询选修了全部课程的学生的学号和姓名. 两种解决途径: 第一种: 我们可以表示为在SC表中某个学生选修的课程数等于C表中课程总数.相应的SQL语言如下: select S#,SNAME ...
- -- 27、 查询出只有两门课程的全部学生的学号和姓名(不重点)(自己做出)
-- 27. 查询出只有两门课程的全部学生的学号和姓名(不重点) SELECT st.s_id,st.s_name,count(sc.c_id)'选修课程数两门'FROM student as st ...
- 查询计算机科学系的学生,查询“计算机系”学生的学号、姓名、学生所选课程名和成绩,正确的命令是( ..._考试资料网...
单项选择题第31-35题使用如下三个数据库表: 学生表:student(学号,姓名,性别,出生日期,院系) 课程表:course(课程号,课程名,学时) 选课成绩表:score(学号,课程号,成绩) ...
- 计算机学院的学生起个昵称,查询“计算机系”学生的学号、姓名、学生所选课程的课程名和成绩,正确的命令是(..._考试资料网...
单项选择题使用如下三个数据库表: 学生表:student (学号,姓名,性别,出生日期,院系) 课程表:course (课程号,课程名,学时) 选课成绩表:score (学号,课程号,成绩) 其中出生 ...
- SQL数据库经典题型(1)查询“001“课程比“002“课程成绩高的所有学生的学号
题目: 学生表:Student(S#,Sname,Sage,Ssex) ,学号:S#,学生姓名:Sname,学生年龄:Sage,学生性别:Ssex 课程表:Course(C#,Cname,T#),课程 ...
- 查询课程编号为“01”的课程比“02”的课程成绩高的所有学生的学号
查询课程编号为"01"的课程比"02"的课程成绩高的所有学生的学号 方法一. select s1.s_id from (select * from score ...
最新文章
- 1、使用库函数计算两个向量的夹角
- 《Spark大数据分析:核心概念、技术及实践》一3.6 惰性操作
- handler post r 同一个线程的疑惑
- Linux挂载共享文件
- k8s(1)-使用kubeadm安装Kubernetes
- flutter - 如何在Dart/Flutter中将某些元素从一个Map复制到新Map中?
- hdu 2196(树的最长链)
- 为什么要用TypeScript - 肉猪 - 博客园
- bootstrapt 表格自适应_一起聊B端设计 - 如何设计表格?
- python控制步进电机驱动器_树莓派操作案例1-使用python GPIO+TB6612驱动步进电机
- oracle to char trim,to_char前面多出空格
- 2017.6.27 树上操作 思考记录
- Python机器学习:评价分类结果008ROC曲线
- B端+C端“两条腿走路”,左手医生欲建立医疗信息服务平台
- mac安装rstudio_在Windows / Linux / Mac OS上安装R和RStudio入门
- 搭建Open××× Server路由模式、证书认证
- 标准IO的fseek函数,ftell函数与Linux文件IO的lseek函数
- Unity开发手游的实用插件
- 基于PaddleX实现电梯电瓶车检测
- 设计一个自然数类,该类的对象能表示一个自然数
热门文章
- 网站排名好却没流量到底是什么环节出了问题?
- 企业网站标题优化要学会运用技巧和方法
- 计算机学院陈宇,为了纯粹的追求———记计算机学院“物联网”工作室-湖北第二师范学院电子版《湖北第二师范学院报》...
- php动态网页简书,LAMP架构部署和动态网站环境的配置
- php汉字的截取,php汉字截取
- 服务器传感器不显示,服务器传感器不显示
- 开发日记-20190603 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》
- spark出现task不能序列化错误的解决方法 org.apache.spark.SparkException: Task not serializable...
- centos7 docker 安装 otter 注意事项
- Iphone 安装 ppsspp