EXISTS運(yùn)算符
和IN、ANY、ALL等運(yùn)算符不同,EXISTS運(yùn)算符是單目運(yùn)算符,它不與列匹配,因此它也不要求待匹配的集合是單列的。
EXISTS運(yùn)算符用來(lái)檢查每一行是否匹配子查詢,即用來(lái)測(cè)試子查詢的結(jié)果是否為空,如果結(jié)果集為空則匹配結(jié)果為false,否則匹配結(jié)果為true。
先來(lái)看一個(gè)簡(jiǎn)單的SQL語(yǔ)句:
SELECT * FROM T_Book WHERE EXISTS(SELECT * FROM T_Reader WHERE FProvince="ShanDong")
這句SQL語(yǔ)句對(duì)T_Book表中的每行數(shù)據(jù)進(jìn)行匹配,測(cè)試是否存在山東省的讀者,因?yàn)橄到y(tǒng)中存在山東省的讀者,所以這個(gè)SQL語(yǔ)句將檢索出所有的圖書。
執(zhí)行結(jié)果如下:
FId FName FYearPublished FCategoryId
1 About J2EE 2005 4
2 Learning Hibernate 2003 4
3 Two Cites 1999 1
4 Jane Eyre 2001 1
5 Oliver Twist 2002 1
6 History of China 1982 2
7 History of England 1860 2
8 History of America 1700 2
9 History of TheWorld 2008 2
10 Atom 1930 3
11 RELATIVITY 1945 3
12 Computer 1970 3
13 Astronomy 1971 3
14 How To Singing 1771 5
15 DaoDeJing 2001 6
16 Obedience toAuthority 1995 6
再來(lái)看另外一個(gè)SQL語(yǔ)句:
SELECT * FROM T_Book WHERE
EXISTS(SELECT * FROM T_Reader WHERE FProvince="YunNan")
這句SQL語(yǔ)句對(duì)T_Book表中的每行數(shù)據(jù)進(jìn)行匹配,測(cè)試是否存在云南省的讀者,因?yàn)橄到y(tǒng)中不存在云南省的讀者,所以這個(gè)SQL語(yǔ)句的執(zhí)行結(jié)果為空。
從前面的例子來(lái)看,使用EXISTS運(yùn)算符要么就是匹配返回表中所有數(shù)據(jù),要么就是不匹配不返回任何數(shù)據(jù),好像EXISTS運(yùn)算符并沒(méi)有太大意義,其實(shí)上面這兩個(gè)例子在實(shí)際中并不常用,EXISTS運(yùn)算符的真正意義只有和相關(guān)子查詢一起使用才更有意義。相關(guān)子查詢中引用外部查詢中的這個(gè)字段,這樣在匹配外部子查詢中的每行數(shù)據(jù)的時(shí)候相關(guān)子查詢就會(huì)根據(jù)當(dāng)前行的信息來(lái)進(jìn)行匹配判斷了,這樣就可以完成非常豐富的功能。
如:檢索存在1950 年以前出版的圖書的圖書類別:
SELECT * FROM T_Category WHERE
EXISTS(SELECT * FROM T_Book
WHERE T_Book. FCategoryId = T_Category.FId AND T_Book.FYearPublished<1950)
在EXISTS后的子查詢中,SQL對(duì)T_Category表中的每一行數(shù)據(jù)到子查詢中進(jìn)行匹配,測(cè)試T_Book 表中是否存在FCategoryId 字段值等于當(dāng)前類別主鍵值且出版年份在1950年之前的書籍。
執(zhí)行結(jié)果:
FId FName
2 History
3 Theory
5 Art