这是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

检索所有课程都选修的的学生的学号与姓名相关推荐

  1. 现有关系数据库如下: 学生(学号,姓名,性别,专业) 课程(课程号,课程名,学分) 学习(学号,课程号,分数) 分别用关系代数表达式和 SQL 语句实现下列 1—5 小题(注意:每小题都要分别 写出关

    现有关系数据库如下: 学生(学号,姓名,性别,专业) 课程(课程号,课程名,学分) 学习(学号,课程号,分数) 分别用关系代数表达式和 SQL 语句实现下列 1-5 小题(注意:每小题都要分别 写出关 ...

  2. mysql查询学号和姓名_数据库SQL语句中 查询选修了全部课程的学生的学号和姓名...

    一.SQL语言查询选修了全部课程的学生的学号和姓名. 两种解决途径: 第一种: 我们可以表示为在SC表中某个学生选修的课程数等于C表中课程总数.相应的SQL语言如下: selectS#,SNAMEfr ...

  3. mysql查询选课程的学生学号和姓名_数据库SQL语句中查询选修了全部课程的学生的学号和姓名理解...

    首先头脑中有三点概念: 1.EXISTS子查询找到的提交 NOTEXISTS子查询中找不到的提交 说明:不要去翻译为存在和不存在,把脑袋搞晕. 2.建立程序循环的概念,这是一个动态的查询过程.如FOR ...

  4. mysql查询选课程的学生学号和姓名_数据库SQL语句中 查询选修了全部课程的学生的学号和姓名...

    一.SQL语言查询选修了全部课程的学生的学号和姓名. 两种解决途径: 第一种: 我们可以表示为在SC表中某个学生选修的课程数等于C表中课程总数.相应的SQL语言如下: select S#,SNAME ...

  5. -- 27、 查询出只有两门课程的全部学生的学号和姓名(不重点)(自己做出)

    -- 27. 查询出只有两门课程的全部学生的学号和姓名(不重点) SELECT st.s_id,st.s_name,count(sc.c_id)'选修课程数两门'FROM student as st ...

  6. 查询计算机科学系的学生,查询“计算机系”学生的学号、姓名、学生所选课程名和成绩,正确的命令是( ..._考试资料网...

    单项选择题第31-35题使用如下三个数据库表: 学生表:student(学号,姓名,性别,出生日期,院系) 课程表:course(课程号,课程名,学时) 选课成绩表:score(学号,课程号,成绩) ...

  7. 计算机学院的学生起个昵称,查询“计算机系”学生的学号、姓名、学生所选课程的课程名和成绩,正确的命令是(..._考试资料网...

    单项选择题使用如下三个数据库表: 学生表:student (学号,姓名,性别,出生日期,院系) 课程表:course (课程号,课程名,学时) 选课成绩表:score (学号,课程号,成绩) 其中出生 ...

  8. SQL数据库经典题型(1)查询“001“课程比“002“课程成绩高的所有学生的学号

    题目: 学生表:Student(S#,Sname,Sage,Ssex) ,学号:S#,学生姓名:Sname,学生年龄:Sage,学生性别:Ssex 课程表:Course(C#,Cname,T#),课程 ...

  9. 查询课程编号为“01”的课程比“02”的课程成绩高的所有学生的学号

    查询课程编号为"01"的课程比"02"的课程成绩高的所有学生的学号 方法一. select s1.s_id from (select * from score ...

最新文章

  1. 1、使用库函数计算两个向量的夹角
  2. 《Spark大数据分析:核心概念、技术及实践》一3.6 惰性操作
  3. handler post r 同一个线程的疑惑
  4. Linux挂载共享文件
  5. k8s(1)-使用kubeadm安装Kubernetes
  6. flutter - 如何在Dart/Flutter中将某些元素从一个Map复制到新Map中?
  7. hdu 2196(树的最长链)
  8. 为什么要用TypeScript - 肉猪 - 博客园
  9. bootstrapt 表格自适应_一起聊B端设计 - 如何设计表格?
  10. python控制步进电机驱动器_树莓派操作案例1-使用python GPIO+TB6612驱动步进电机
  11. oracle to char trim,to_char前面多出空格
  12. 2017.6.27 树上操作 思考记录
  13. Python机器学习:评价分类结果008ROC曲线
  14. B端+C端“两条腿走路”,左手医生欲建立医疗信息服务平台
  15. mac安装rstudio_在Windows / Linux / Mac OS上安装R和RStudio入门
  16. 搭建Open××× Server路由模式、证书认证
  17. 标准IO的fseek函数,ftell函数与Linux文件IO的lseek函数
  18. Unity开发手游的实用插件
  19. 基于PaddleX实现电梯电瓶车检测
  20. 设计一个自然数类,该类的对象能表示一个自然数

热门文章

  1. 网站排名好却没流量到底是什么环节出了问题?
  2. 企业网站标题优化要学会运用技巧和方法
  3. 计算机学院陈宇,为了纯粹的追求———记计算机学院“物联网”工作室-湖北第二师范学院电子版《湖北第二师范学院报》...
  4. php动态网页简书,LAMP架构部署和动态网站环境的配置
  5. php汉字的截取,php汉字截取
  6. 服务器传感器不显示,服务器传感器不显示
  7. 开发日记-20190603 关键词 读书笔记《鸟哥的Linux私房菜-基础学习篇》
  8. spark出现task不能序列化错误的解决方法 org.apache.spark.SparkException: Task not serializable...
  9. centos7 docker 安装 otter 注意事项
  10. Iphone 安装 ppsspp