(转)用 ANY、SOME 或 ALL 修改的比较运算符

可以用 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)
posted @ 2009-03-23 17:52  -Timothy-  阅读(634)  评论(0编辑  收藏  举报