(转)用 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)