可以用 ALL 或 ANY 關(guān)鍵字修改引入子查詢(xún)的比較運(yùn)算符。SOME 是 SQL-92 標(biāo)準(zhǔn)的 ANY 的等效物。
由帶修改的比較運(yùn)算符引入的子查詢(xún)返回一列零值或更多值,并且可以包括 GROUP BY 或 HAVING 子句。這些子查詢(xún)可通過(guò) EXISTS 重新表述。
以 > 比較運(yùn)算符為例,>ALL 表示大于每一個(gè)值;換句話(huà)說(shuō),大于最大值。例如,>ALL (1, 2, 3) 表示大于 3。>ANY 表示至少大于一個(gè)值,也就是大于最小值。因此 >ANY (1, 2, 3) 表示大于 1。
要使帶有 >ALL 的子查詢(xún)中的某行滿(mǎn)足外部查詢(xún)中指定的條件,引入子查詢(xún)的列中的值必須大于由子查詢(xún)返回的值的列表中的每個(gè)值。
同樣,>ANY 表示要使某一行滿(mǎn)足外部查詢(xún)中指定的條件,引入子查詢(xún)的列中的值必須至少大于由子查詢(xún)返回的值的列表中的一個(gè)值。
說(shuō)明??下例可以用多種方法運(yùn)行,只要內(nèi)部查詢(xún)只返回一個(gè)值即可。
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' )
下面的查詢(xún)提供一個(gè)由 ANY 修改的比較運(yùn)算符引入的子查詢(xún)的示例。它將查找收到的預(yù)付款大于 Algodata Infosystems 支付的最低預(yù)付款金額的書(shū)名。
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')
下面是結(jié)果集:
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)
對(duì)于每種書(shū)名,內(nèi)部查詢(xún)查找一列由 Algodata 支付的預(yù)付款金額。外部查詢(xún)查看列表中的所有值,并確定當(dāng)前考慮的書(shū)名是否已收到大于任何其它金額的預(yù)付款。換句話(huà)說(shuō),將查找預(yù)付款等于或大于 Algodata 支付的最低金額的書(shū)名。
如果子查詢(xún)不返回任何值,那么整個(gè)查詢(xún)將不會(huì)返回任何值。
=ANY 運(yùn)算符與 IN 等效。例如,要查找與出版商住在同一個(gè)城市的作者,可以使用 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)
下面是任一查詢(xún)的結(jié)果集:
au_lname au_fname -------- --------- Carson Cheryl Bennet Abraham (2 row(s) affected)
但是,< >ANY 運(yùn)算符與 NOT IN 有所不同:< >ANY 表示不等于 a,或不等于 b,或不等于 c。而 NOT IN 表示不等于 a,且不等于 b,且不等于 c。但 <>ALL 與 NOT IN 意義相同。
例如,下面的查詢(xún)查找在沒(méi)有出版商的城市中居住的作者。
USE pubs SELECT au_lname, au_fname FROM authors WHERE city <> ANY (SELECT city FROM publishers)
下面是結(jié)果集:
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)
因?yàn)槊總€(gè)作者所在的城市中都有一個(gè)或多個(gè)出版商不在那里居住,所以結(jié)果包括所有 23 個(gè)作者。內(nèi)部查詢(xún)找出所有住有出版商的城市,然后對(duì)于每個(gè)城市,外部查詢(xún)查找不住在該城市的作者。
但是,如果在該查詢(xún)中使用 NOT IN,那么結(jié)果將包括除了 Cheryl Carson 和 Abraham Bennet 以外的所有作者,因?yàn)樗麄冏≡?Algodata Infosystems 所處的 Berkeley。
USE pubs SELECT au_lname, au_fname FROM authors WHERE city NOT IN (SELECT city FROM publishers)
下面是結(jié)果集:
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)
還可以通過(guò)使用 < >ALL 運(yùn)算符獲得相同的結(jié)果,該運(yùn)算符與 NOT IN 等效。
USE pubs SELECT au_lname, au_fname FROM authors WHERE city <> ALL (SELECT city FROM publishers)