可以用 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)