七、SQL –子查詢⑨(EXISTS運(yùn)算符)

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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。