当前位置:   article > 正文

数据库NOT EXISTS的理解

数据库not exists

数据库有查询有四种运算:选择、投影、连接、除运算;而NOT EXISTS关键字则是基于除运算的查询。


例如:

SC表(Sno是学生号,Cno是课程号)

  1. +-----------+-----+-------+
  2. | Sno | Cno | Grade |
  3. +-----------+-----+-------+
  4. | 201215121 | 1 | 92 |
  5. | 201215121 | 2 | 85 |
  6. | 201215121 | 3 | 88 |
  7. | 201215122 | 2 | 90 |
  8. | 201215122 | 3 | 80 |
  9. +-----------+-----+-------+

Student表

  1. +-----------+--------+------+------+-------+
  2. | Sno | Sname | Ssex | Sage | Sdept |
  3. +-----------+--------+------+------+-------+
  4. | 201215121 | 李勇 | 男 | 20 | CS |
  5. | 201215122 | 刘晨 | 女 | 19 | CS |
  6. | 201215123 | 王敏 | 女 | 18 | MA |
  7. | 201215125 | 张立 | 男 | 19 | IS |
  8. +-----------+--------+------+------+-------+

Course表

  1. +-----+--------------+------+---------+
  2. | Cno | Cname | Cpno | Ccredit |
  3. +-----+--------------+------+---------+
  4. | 1 | 数据库 | 5 | 4 |
  5. | 2 | 数学 | NULL | 2 |
  6. | 3 | 信息系统 | 1 | 4 |
  7. | 4 | 操作系统 | 6 | 3 |
  8. | 5 | 数据结构 | 7 | 4 |
  9. | 6 | 数据处理 | NULL | 2 |
  10. | 7 | PASCAL语言 | 6 | 4 |
  11. +-----+--------------+------+---------+

一. 查询选修了全部课程的学生的姓名。

此时,查询涉及到三个表。查询方式如下:

  1. select Sname
  2. from Student
  3. where not exists // (1)没有一门课程他没选的 (对于某个Sname)
  4. (
  5. select *
  6. from Course
  7. where not exists // (2)一门课程他没选的。(对于某个Cno)
  8. (
  9. select *
  10. from SC
  11. where Sno=Student.Sno and Cno=Course.Cno
  12. )
  13. );
因为,题目的意思也就是: 没有 一门课程他没有选的

可以将这个句子看成两部分,所以:

最外层查询:

没有 就是代表不存在,也就是说,对于Student,就是为了寻找符合 <没有> 这个条件的Sname;好的,这个语句的一部分工作完成了,接下来写子语句的时候就不再考虑 <没有> 条件。

第一层子查询:

现在开始考虑 <一门课程他没选的> , 也就是说,现在的工作是:子查询试图努力找出一门他没选的课程;即是,对于某个Cno ,不存在 .... (然后开始第二层子查询)。

第二层子查询:

这个时候,又是对第一层查询的否定了,这时候意思是:

对于从第二层查询迭代来的Cno , 看有没有与内层Cno相等的;且,Sno=Student.Sno

Sno=Student.Sno作用:

图.1 Sno=Student.Sno作用



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

此时,查询只涉及SC表。

即是:对于符合条件的y,不存在一门课程,201215122选了,而y学生没有选。

  1. select DISTINCT Sno
  2. from SC s1
  3. where not exists // 不存在
  4. (
  5. select *
  6. from SC s2
  7. where s2.Sno='201215122' and not exists // 201215122选了,y学生没有选(对于被20121522选了的Cno)
  8. (
  9. select *
  10. from SC s3
  11. where s1.Sno=s3.Sno and s3.Cno=s2.Cno
  12. )
  13. );

此处的s1.Sno=s3.Sno 的作用和图.1一样。







声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/447809
推荐阅读
相关标签
  

闽ICP备14008679号