2 qq 34500543 qq_34500543 于 2017.01.12 14:07 提问

求帮讲解一下这条sql语句,理解不了

已知表SC(sno(学号),cno(课程号),score(成绩))
问题:找出至少选修了101号学生选修过的全部课程的学生号
--不存在这样的课程y,学生2选修了y,而学生x没有选。
SELECT DISTINCT Sno
FROM SC X
WHERE NOT EXISTS
(SELECT *
FROM SC Y
WHERE Y.Sno ='101'AND NOT EXISTS
(SELECT *
FROM SC Z
WHERE Z.Sno=X.Sno AND Z.Cno=Y.Cno))

3个回答

xiaobailian1
xiaobailian1   2017.01.12 15:13

DISTINCT:用于返回唯一不同的值(查询的结果中若是有多个相同的值(两个A),使用DISTINCT会把多余的值去掉,留下一个唯一值(一个A))
NO EXISTS:返回除了条件意外的结果(具体详情可以看他的博客:http://blog.csdn.net/zhiweianran/article/details/7868894)
以上语句可翻译如下(如果有错请谅解小白):
查询SC表中除了(学号为101的学生并且除了(学生101选择的课程))的学号

Tiger_Zhao
Tiger_Zhao   Rxr 2017.01.12 15:26

暂时先别管 NOT EXIST,看剩下的条件:
X 是全体学生
Y 是101号学生的全部课程(下面简称为“相关课程”)
Z 这里不是直接的查询条件,而是:
1) 先用 学生*相关课程 “做”了个二维表;
2) 然后(和 NOT EXIST 相关了),找这些单元对应的 Z 记录,哪些是不存在的。
3) 不存在表示某个学生没有选修相关课程的其一,从最终返回结果中排除。

qq_24972061
qq_24972061   2017.01.12 17:40

SELECT DISTINCT Sno
FROM SC X
WHERE NOT EXISTS
(SELECT *
FROM SC Y
WHERE Y.Sno ='101'AND NOT EXISTS
(SELECT *
FROM SC Z
WHERE Z.Sno=X.Sno AND Z.Cno=Y.Cno))

可以把(SELECT *
FROM SC Y
WHERE Y.Sno ='101'AND NOT EXISTS
(SELECT *
FROM SC Z
WHERE Z.Sno=X.Sno AND Z.Cno=Y.Cno)) 看成为B,就是查找Sno这个字段在SC表中,不在B中。同样一次往下类推。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!