七、SQL–子查詢⑧(ALL運算符)

ALL運算符

ALL運算符要求比較的值需要匹配子查詢中的所有值。
ALL運算符不能單獨使用,必須和比較運算符共同使用。

如:檢索在所有會員入會之前出版的圖書:

SELECT * FROM T_Book WHERE FYearPublished<ALL(SELECT FYearOfJoin FROM T_Reader)

執行結果:

FId FName FYearPublished FCategoryId
6 History of China 1982 2
7 History of England 1860 2
8 History of America 1700 2
10 Atom 1930 3
11 RELATIVITY 1945 3
12 Computer 1970 3
13 Astronomy 1971 3
14 How To Singing 1771 5

與ANY 運算符相同,ALL 運算符同樣不能與固定的集合相匹配,如:下面的SQL語句是錯誤的:

SELECT * FROM T_Book WHERE FYearPublished<ALL(2001,2003,2005)

不過這個限制并不會妨礙功能的實現,因為沒有對固定的集合進行ALL匹配的必要,因為待匹配的集合是固定的,所以上面的SQL語句完全可以用下面的SQL語句來代替:

SELECT * FROM T_Book WHERE *FYearPublished<2001

注意:當使用ALL運算符時,若帶匹配的集合為空,即子查詢沒有返回任何數據時,不論與什么比較運算符搭配使用,ALL的返回值將永遠是true。
如:檢索在所有江蘇省會員入會之前出版的圖書:

SELECT * FROM T_Book WHERE FYearPublished<ALL(SELECT FYearOfJoin FROM T_Reader WHERE FProvince = "JiangSu")

執行結果:

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

這個查詢結果將所有的會員都檢索出來了,可是根本沒有江蘇省的會員,應該是返回空結果才對的。看起來這是錯誤的,其實這完全符合ALL 運算符的語義,因為沒有江蘇省的會員,所以每本書的出版年份就在所有的江蘇省的會員之前,所以每一本書都符合匹配條件。在使用ALL運算符的時候,這一個問題很容易在系統中造成BUG,因此使用時必須注意。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容