1、exists谓词
exist代表存在,带有exists的子语句不返回任何数据,只产生逻辑true/false。
2、查询选修了81001课程的学生姓名
select sname from student where exists \
(select * from sc where sno=student.sno and cno='81001');
查询的执行逻辑:外层student表的行数据依次带入内层sc表进行遍历,返回满足条件student的名称。
exist与in的使用效率的问题,通常情况下采用exists
要比in
效率高,但要看实际情况具体使用:IN
适合于外表大而内表小的情况;EXISTS
适合于外表小而内表大的情况。
3.查询选修了全部课程的学生姓名
SELECT sname FROM student WHERE NOT EXISTS
(SELECT * FROM course WHERE NOT EXISTS
(SELECT * FROM sc WHERE sc.sno=student.sno AND sc.cno=course.cno));
该题目可以转化成:不存在一门课程学生没有选修
下述语句查询出来没有被学生选修的课程,如果为空,表示学生都选修了课程。
SELECT * FROM course WHERE NOT EXISTS
(SELECT * FROM sc WHERE sc.sno=student.sno AND sc.cno=course.cno)
因此在外层只要判断这个为空,就可查出选修了全部课程的学生
SELECT sname FROM student WHERE NOT EXISTS (this is empty);