SQL--两个exists嵌套使用的执行过程

- 题目

- 答案

SELECT S#,Sname
FROM Student
WHERE NOT EXISTS(SELECT * FROM Course,Teacher
		 WHERE Course.T#=Teacher.T#
		 AND Tname='张小龙'    -----张小龙老师所所教授的所有课
		 AND NOT EXISTS (SELECT * FROM SC
		                 WHERE S#=student.S#
		                 AND C#=Course.C#)) ----选了张老师所有课的同学
		                  -------大括号里是找到选了张老师的课但不是张老师所有课的同学
 

- 执行过程解释

  • 对于EXISTS的说明:
    EXISTS(包括 NOT EXISTS )子句的返回值是一个BOOL值。 EXISTS内部有一个子查询语句(SELECT … FROM…), 我将其称为EXIST的内查询语句。其内查询语句返回一个结果集。 EXISTS子句根据其内查询语句的结果集空或者非空,返回一个布尔值。
  • 对于单个EXISTS的执行过程的理解:
    将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果取非空值,则EXISTS子句返回TRUE,这一行可作为外查询的结果行,否则不能作为结果。
  • 对于上述例题中两个NOT EXISTS嵌套的执行过程的理解:
    两个NOT EXISTS嵌套的执行过程相当于一个二重循环,第一重是将Student表中的每个元组代入内查询(即每个同学),第二重是将(SELECT * FROM Course,Teacher WHERE Course.T#=Teacher.T# AND Tname=‘张小龙’)的结果集(即张小龙老师的每门课)代入内查询,总的循环次数是 学生数量*张小龙老师所教授课程数量。如果第二重循环里的结果都是该同学过了张老师的课才可以将该同学放入最外层查询的结果表里。
    下面用一段伪代码(python语句与sql语句结合着来写的)来表示这个执行过程:
For Sno in Student.Sno:  #表示从Student表中选出某个同学
n=0                      #记录该同学学过张小龙老师所教授课程的数量
   For Cno in 张Cno:   #表示从张小龙老师所教授课程中选出某门课程
       If Cno in Sno’s_cno: #如果该学生学过该课程
           n=n+1   
   if n==3:            #在这里假设张小龙老师所教授课程的数量为3
       print(‘学过张小龙老师教授的全部课程的同学:,Sno) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值