可以用 ALL 或 ANY 關鍵字修改引入子查詢的比較運算符。SOME 是 SQL-92 標準的 ANY 的等效物。
由帶修改的比較運算符引入的子查詢返回一列零值或更多值,并且可以包括 GROUP BY 或 HAVING 子句。這些子查詢可通過 EXISTS 重新表述。
以 > 比較運算符為例,>ALL 表示大于每一個值;換句話說,大于最大值。例如,>ALL (1, 2, 3) 表示大于 3。>ANY 表示至少大于一個值,也就是大于最小值。因此 >ANY (1, 2, 3) 表示大于 1。
要使帶有 >ALL 的子查詢中的某行滿足外部查詢中指定的條件,引入子查詢的列中的值必須大于由子查詢返回的值的列表中的每個值。
同樣,>ANY 表示要使某一行滿足外部查詢中指定的條件,引入子查詢的列中的值必須至少大于由子查詢返回的值的列表中的一個值。
說明??下例可以用多種方法運行,只要內部查詢只返回一個值即可。
USE pubs -- Option 1 using MAX in the inner query SELECT title FROM titles HAVING MAX(advance) > ALL WHERE advance > ALL ( SELECT MAX(advance) FROM publishers INNER JOIN titles ON titles.pub_id = publishers.pub_id WHERE pub_name = 'Algodata Infosystems' ) -- Option 2 using GROUP BY and HAVING and no ALL USE pubs SELECT title FROM titles GROUP BY title HAVING MAX(advance) > ( SELECT MAX(advance) FROM publishers INNER JOIN titles ON titles.pub_id = publishers.pub_id WHERE pub_name = 'Algodata Infosystems' )
下面的查詢提供一個由 ANY 修改的比較運算符引入的子查詢的示例。它將查找收到的預付款大于 Algodata Infosystems 支付的最低預付款金額的書名。
USE pubs SELECT title FROM titles WHERE advance > ANY (SELECT advance FROM publishers INNER JOIN titles ON titles.pub_id = publishers.pub_id AND pub_name = 'Algodata Infosystems')
下面是結果集:
title --------------------------------------------------------------- You Can Combat Computer Stress! The Gourmet Microwave But Is It User Friendly? Secrets of Silicon Valley Computer Phobic and Non-Phobic Individuals: Behavior Variations Life Without Fear Onions, Leeks, and Garlic: Cooking Secrets of the Mediterranean Sushi, Anyone? (8 row(s) affected)
對于每種書名,內部查詢查找一列由 Algodata 支付的預付款金額。外部查詢查看列表中的所有值,并確定當前考慮的書名是否已收到大于任何其它金額的預付款。換句話說,將查找預付款等于或大于 Algodata 支付的最低金額的書名。
如果子查詢不返回任何值,那么整個查詢將不會返回任何值。
=ANY 運算符與 IN 等效。例如,要查找與出版商住在同一個城市的作者,可以使用 IN 或 =ANY。
USE pubs SELECT au_lname, au_fname FROM authors WHERE city IN (SELECT city FROM publishers) USE pubs SELECT au_lname, au_fname FROM authors WHERE city = ANY (SELECT city FROM publishers)
下面是任一查詢的結果集:
au_lname au_fname -------- --------- Carson Cheryl Bennet Abraham (2 row(s) affected)
但是,< >ANY 運算符與 NOT IN 有所不同:< >ANY 表示不等于 a,或不等于 b,或不等于 c。而 NOT IN 表示不等于 a,且不等于 b,且不等于 c。但 <>ALL 與 NOT IN 意義相同。
例如,下面的查詢查找在沒有出版商的城市中居住的作者。
USE pubs SELECT au_lname, au_fname FROM authors WHERE city <> ANY (SELECT city FROM publishers)
下面是結果集:
au_lname au_fname ---------------------------------------- -------------------- White Johnson Green Marjorie Carson Cheryl O'Leary Michael Straight Dean Smith Meander Bennet Abraham Della Buena Ann Gringlesby Burt Locksley Charlene Greene Morningstar Blotchet-Halls Reginald Yokomoto Akiko del Covello Innes DeFrance Michel Stringer Dirk MacFeather Stearns Karsen Livia Panteley Sylvia Hunter Sheryl McBadden Heather Ringer Anne Ringer Albert (23 row(s) affected)
因為每個作者所在的城市中都有一個或多個出版商不在那里居住,所以結果包括所有 23 個作者。內部查詢找出所有住有出版商的城市,然后對于每個城市,外部查詢查找不住在該城市的作者。
但是,如果在該查詢中使用 NOT IN,那么結果將包括除了 Cheryl Carson 和 Abraham Bennet 以外的所有作者,因為他們住在 Algodata Infosystems 所處的 Berkeley。
USE pubs SELECT au_lname, au_fname FROM authors WHERE city NOT IN (SELECT city FROM publishers)
下面是結果集:
au_lname au_fname ---------------------------------------- -------------------- White Johnson Green Marjorie O'Leary Michael Straight Dean Smith Meander Della Buena Ann Gringlesby Burt Locksley Charlene Greene Morningstar Blotchet-Halls Reginald Yokomoto Akiko del Covello Innes DeFrance Michel Stringer Dirk MacFeather Stearns Karsen Livia Panteley Sylvia Hunter Sheryl McBadden Heather Ringer Anne Ringer Albert (21 row(s) affected)
還可以通過使用 < >ALL 運算符獲得相同的結果,該運算符與 NOT IN 等效。
USE pubs SELECT au_lname, au_fname FROM authors WHERE city <> ALL (SELECT city FROM publishers)