带EXISTS测试的子查询
在子查询中,还可以使用EXISTS,它一般用在WHERE子句中,其后紧跟一个SQL子查询,从而构成一个条件,当该子查询至少存在一个返回值时,这个条件为真(.T.),否则为假(.F.)。
注意:使用EXISTS引入的子查询在以下几方面与其它子查询略有不同:
· EXISTS关键字前面没有列名、常量或其它表达式。
· 由EXISTS引入的子查询的选择列表通常几乎都是由星号(*)组成。由于只是测试是否存在符合子查询中指定条件的行,所以不必列出列名。
【例5.30】查询所有任课教师的tname和depart。
SELECT tname,depart
FROM teacher a
WHERE EXISTS
(SELECT *
FROM course b
WHERE a.tno=b.tno)
本例执行结果如下:
tname depart
-------- ----------
李诚 计算机系
王萍 计算机系
张旭 电子工程系
本例也有一个相关子查询,其执行过程是:从头到尾扫描teacher表的行,对于每个行,执行子查询,此时,a.tno是一个常量,子查询便是在course表中查找tno等于该常量的行,如果存在这样的行,EXISTS子句便返回真,主查询屏幕显示teacher表中的当前行;如果子查询未找到这样的行,EXISTS子句返回假,主查询不显示teacher表中的当前行。主查询继续查找teacher表的下一行,其过程与上述相同。
【例5.31】查询所有未讲课的教师的tname和depart。
SELECT tname,depart
FROM teacher a
WHERE NOT EXISTS
(SELECT *
FROM course b
WHERE a.tno=b.tno)
本例执行结果如下:
tname depart
-------- ----------
刘冰 电子工程系
本例的执行过程与上例基本相同,只是将 EXISTS 子句的结果取反,当子查询找到了这样的行, WHERE 条件为假;当子查询未找到这样的行,则 WHERE 条件为真,所示查询结果与上例正好相反。