用 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)
sql some any all用法2008-03-24 15:56create table #A(id int) go insert into #A s(1) insert into #A s(2) insert into #A s(3) insert into #A s(4) go--All:对所有数据都满足条件,整个条件才成立,例如:5大于所有返回的id select * from #A where 5>All(select id from #A) go--Any:只要有一条数据满足条件,整个条件成立,例如:3大于1,2 select * from #A where 3>any(select id from #A) go --Some和Any一样
sql中all,any,some.. --All:对所有数据都满足条件,整个条件才成立,例如:5大于所有返回的id select * from #A where 5>All(select id from #A) go--Any:只要有一条数据满足条件,整个条件成立,例如:3大于1,2 select * from #A where 3>any(select id from #A)
SQL Server 2005 联机丛书(2008 年 11 月) 用 ANY、SOME 或 ALL 修改的比较运算符可以用 ALL 或 ANY 关键字修改引入子查询的比较运算符。SOME 是与 ANY 等效的 SQL-92 标准。通过修改的比较运算符引入的子查询返回零个值或多个值的列表,并且可以包括 GROUP BY 或 HAVING 子句。这些子查询可以用 EXISTS 重新表述。以 > 比较运算符为例,>ALL 表示大于每一个值。换句话说,它表示大于最大值。例如,>ALL (1, 2, 3) 表示大于 3。>ANY 表示至少大于一个值,即大于最小值。因此 >ANY (1, 2, 3) 表示大于 1。若要使带有 >ALL 的子查询中的行满足外部查询中指定的条件,引入子查询的列中的值必须大于子查询返回的值列表中的每个值。同样,>ANY 表示要使某一行满足外部查询中指定的条件,引入子查询的列中的值必须至少大于子查询返回的值列表中的一个值。下面的查询提供一个由 ANY 修改的比较运算符引入的子查询的示例。它查找定价高于或等于任何产品子类别的最高定价的产品。复制代码 USE AdventureWorks; GO SELECT Name FROM Production.Product WHERE ListPrice >= ANY (SELECT MAX (ListPrice) FROM Production.Product GROUP BY ProductSubcategoryID) 对于每个产品子类别,内部查询查找最高定价。外部查询查看所有这些值,并确定定价高于或等于任何产品子类别的最高定价的单个产品。如果 ANY 更改为 ALL,查询将只返回定价高于或等于内部查询返回的所有定价的那些产品。如果子查询不返回任何值,那么整个查询将不会返回任何值。=ANY 运算符与 IN 等效。例如,若要查找 Adventure Works Cycles 生产的所有轮子产品的名称,可以使用 IN 或 =ANY。复制代码 --Using =ANY USE AdventureWorks; GO SELECT Name FROM Production.Product WHERE ProductSubcategoryID =ANY (SELECT ProductSubcategoryID FROM Production.ProductSubcategory WHERE Name = 'Wheels')--Using IN USE AdventureWorks; GO SELECT Name FROM Production.Product WHERE ProductSubcategoryID IN (SELECT ProductSubcategoryID FROM Production.ProductSubcategory WHERE Name = 'Wheels') 下面是任一查询的结果集:复制代码 Name -------------------------------------------------- LL Mountain Front Wheel ML Mountain Front Wheel HL Mountain Front Wheel LL Road Front Wheel ML Road Front Wheel HL Road Front Wheel Touring Front Wheel LL Mountain Rear Wheel ML Mountain Rear Wheel HL Mountain Rear Wheel LL Road Rear Wheel ML Road Rear Wheel HL Road Rear Wheel Touring Rear Wheel(14 row(s) affected) 但是,< >ANY 运算符则不同于 NOT IN:< >ANY 表示不等于 a,或者不等于 b,或者不等于 c。NOT IN 表示不等于 a、不等于 b 并且不等于 c。<>ALL 与 NOT IN 表示的意思相同。例如,以下查询查找位于任何销售人员都不负责的地区的客户。复制代码 Use AdventureWorks; GO SELECT CustomerID FROM Sales.Customer WHERE TerritoryID <> ANY (SELECT TerritoryID FROM Sales.SalesPerson) 结果包含除销售地区为 NULL 的客户以外的所有客户,因为分配给客户的每个地区都由一个销售人员负责。内部查询查找销售人员负责的所有销售地区,然后对于每个地区,外部查询查找不在任一地区的客户。由于同一原因,当在此查询中使用 NOT IN 时,结果将不包含任何客户。还可以使用 < >ALL 运算符获得相同的结果,该运算符与 NOT IN 等效。
用 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。查联机帮助吧,
some,any,all在进行子查询的时候还是有用处的。JJ的那个讲的很清楚了。
all谓词的使用方法和any或者some谓词一样,也是把列值与子查询的结果进行比较,但是它不要求任意结果值,而是要求所有列的查询结果都为真。否则就不返回行。 实例(eg):all: */查询成绩不大于90分的课程 use student select * from course where 课程代号<>all(select 课程代号 from grade where 课程成绩>90)实例:any: */查询年龄不小于平均年龄的所有学生信息 use student select * from student wher 年龄<>any (select avy(年龄) from student)实例:some */查询年龄小于平均年龄的所有学生信息 use student select * from student where 年龄<some(select avg(年龄) from student)顺便说下,any属于SQL支持的3种定量谓词之一。它和some完全等价,即能用some的地方完全可以使用any.
set nocount onuse tempdb goif (object_id ('t1' ) is not null ) drop table t1 create table t1 (n int ) insert into t1 select 2 union select 3 if (object_id ('t2' ) is not null ) drop table t2 create table t2 (n int ) insert into t2 select 1 union select 2 union select 3 union select 4select * from t2 where n> all (select n from t1 ) --4 select * from t2 where n> any (select n from t1 ) --3,4 --select * from t2 where n>some(select n from t1) --3,4select * from t2 where n= all (select n from t1 ) --无数据 select * from t2 where n= any (select n from t1 ) --2,3 --select * from t2 where n=some(select n from t1) --2,3select * from t2 where n< all (select n from t1 ) --1 select * from t2 where n< any (select n from t1 ) --1,2 --select * from t2 where n<some(select n from t1) --1,2select * from t2 where n<> all (select n from t1 ) --1,4 select * from t2 where n<> any (select n from t1 ) --1,2,3,4 --select * from t2 where n<>some(select n from t1)--1,2,3,4 set nocount off 注意,如果t1中包含null数据,那么所有All相关的比较运算将不会返回任何结果,原因就不用多解释了。而因为t1和t2表的null的存在他们和not exists之类的比较符会有一些区别。 比如下面两句 select * from t2 a where not exists(select 1 from t1 where n>=a.n) select * from t2 where n >all(select n from t1) 他们逻辑上意义很像但是对于null的处理却是恰恰相反,第一句会忽略子查询的null而把t2的null同时查出来,第二句却是忽略了t2的null同时会因为t1中的null而无法查询到数据。
用标量值与单列集中的值进行比较。 语法
scalar_expression { = | <> | != | > | >= | !>| < | <= | !< } ALL ( subquery )参数
scalar_expression是任何有效的 Microsoft® SQL Server™ 表达式。{ = | <> | != | > | >= | !> | < | <= | !< }是比较运算符。subquery是返回单列结果集的子查询。返回列的数据类型必须与 scalar_expression 的数据类型相同。是受限的 SELECT 语句(不允许使用 ORDER BY 子句、COMPUTE 子句和 INTO 关键字)。返回类型
Boolean结果值
如果所有给定的比较对(scalar_expression, x)均为 TRUE,其中 x 是单列集中的值,则返回 TRUE;否则返回 FALSE。GROUP BY 子句和 ALL 关键字
Transact-SQL 在 GROUP BY 子句中提供 ALL 关键字。只有在 SELECT 语句还包括 WHERE 子句时,ALL 关键字才有意义。如果使用 ALL 关键字,那么查询结果将包括由 GROUP BY 子句产生的所有组,即使某些组没有符合搜索条件的行。没有 ALL 关键字,包含 GROUP BY 子句的 SELECT 语句将不显示没有符合条件的行的组。下面是一些示例:USE pubs
SELECT type, AVG(price)
FROM titles
WHERE royalty = 10
GROUP BY type下面是结果集:type
------------ --------------------------
business 17.31
popular_comp 20.00
psychology 14.14
trad_cook 17.97 (4 row(s) affected)USE pubs
SELECT type, AVG(price)
FROM titles
WHERE royalty = 10
GROUP BY ALL type下面是结果集:type
------------ --------------------------
business 17.31
mod_cook (null)
popular_comp 20.00
psychology 14.14
trad_cook 17.97
UNDECIDED (null) (6 row(s) affected)第一个查询只为取得 %10 版税的那些书籍产生组。由于没有含 10% 版税的现代烹调书籍,因此结果中没有 mod_cook 类型的组。第二个查询为所有类型均生成组,包括现代烹调书籍和 UNDECIDED,即使现代烹调书籍组不包含任何符合 WHERE 子句中指定的条件的行。对于没有符合条件的行的组,容纳聚合值的列(平均价格)为 NULL。
用标量值与单列集中的值进行比较。 语法
scalar_expression { = | < > | != | > | > = | ! > | < | < = | ! < }
{ SOME | ANY } ( subquery ) 参数
scalar_expression是任何有效的 Microsoft® SQL Server™ 表达式。{ = | <> | != | > | >= | !> | < | <= | !< }是任何有效的比较运算符。 SOME | ANY指定应进行比较。subquery是包含某列结果集的子查询。所返回列的数据类型必须是与 scalar_expression 相同的数据类型。结果类型
Boolean结果值
对于 ANY 对 (scalar_expression, x)(其中 x 是单列集中的值),当指定的比较是 TRUE时,SOME 或 ANY 返回 TRUE。否则返回 FALSE。
可以用 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)
sql some any all用法2008-03-24 15:56create table #A(id int)
go
insert into #A s(1)
insert into #A s(2)
insert into #A s(3)
insert into #A s(4)
go--All:对所有数据都满足条件,整个条件才成立,例如:5大于所有返回的id
select *
from #A
where 5>All(select id from #A)
go--Any:只要有一条数据满足条件,整个条件成立,例如:3大于1,2
select *
from #A
where 3>any(select id from #A)
go
--Some和Any一样
--All:对所有数据都满足条件,整个条件才成立,例如:5大于所有返回的id
select *
from #A
where 5>All(select id from #A)
go--Any:只要有一条数据满足条件,整个条件成立,例如:3大于1,2
select *
from #A
where 3>any(select id from #A)
用 ANY、SOME 或 ALL 修改的比较运算符可以用 ALL 或 ANY 关键字修改引入子查询的比较运算符。SOME 是与 ANY 等效的 SQL-92 标准。通过修改的比较运算符引入的子查询返回零个值或多个值的列表,并且可以包括 GROUP BY 或 HAVING 子句。这些子查询可以用 EXISTS 重新表述。以 > 比较运算符为例,>ALL 表示大于每一个值。换句话说,它表示大于最大值。例如,>ALL (1, 2, 3) 表示大于 3。>ANY 表示至少大于一个值,即大于最小值。因此 >ANY (1, 2, 3) 表示大于 1。若要使带有 >ALL 的子查询中的行满足外部查询中指定的条件,引入子查询的列中的值必须大于子查询返回的值列表中的每个值。同样,>ANY 表示要使某一行满足外部查询中指定的条件,引入子查询的列中的值必须至少大于子查询返回的值列表中的一个值。下面的查询提供一个由 ANY 修改的比较运算符引入的子查询的示例。它查找定价高于或等于任何产品子类别的最高定价的产品。复制代码
USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE ListPrice >= ANY
(SELECT MAX (ListPrice)
FROM Production.Product
GROUP BY ProductSubcategoryID)
对于每个产品子类别,内部查询查找最高定价。外部查询查看所有这些值,并确定定价高于或等于任何产品子类别的最高定价的单个产品。如果 ANY 更改为 ALL,查询将只返回定价高于或等于内部查询返回的所有定价的那些产品。如果子查询不返回任何值,那么整个查询将不会返回任何值。=ANY 运算符与 IN 等效。例如,若要查找 Adventure Works Cycles 生产的所有轮子产品的名称,可以使用 IN 或 =ANY。复制代码
--Using =ANY
USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE ProductSubcategoryID =ANY
(SELECT ProductSubcategoryID
FROM Production.ProductSubcategory
WHERE Name = 'Wheels')--Using IN
USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE ProductSubcategoryID IN
(SELECT ProductSubcategoryID
FROM Production.ProductSubcategory
WHERE Name = 'Wheels')
下面是任一查询的结果集:复制代码
Name
--------------------------------------------------
LL Mountain Front Wheel
ML Mountain Front Wheel
HL Mountain Front Wheel
LL Road Front Wheel
ML Road Front Wheel
HL Road Front Wheel
Touring Front Wheel
LL Mountain Rear Wheel
ML Mountain Rear Wheel
HL Mountain Rear Wheel
LL Road Rear Wheel
ML Road Rear Wheel
HL Road Rear Wheel
Touring Rear Wheel(14 row(s) affected)
但是,< >ANY 运算符则不同于 NOT IN:< >ANY 表示不等于 a,或者不等于 b,或者不等于 c。NOT IN 表示不等于 a、不等于 b 并且不等于 c。<>ALL 与 NOT IN 表示的意思相同。例如,以下查询查找位于任何销售人员都不负责的地区的客户。复制代码
Use AdventureWorks;
GO
SELECT CustomerID
FROM Sales.Customer
WHERE TerritoryID <> ANY
(SELECT TerritoryID
FROM Sales.SalesPerson)
结果包含除销售地区为 NULL 的客户以外的所有客户,因为分配给客户的每个地区都由一个销售人员负责。内部查询查找销售人员负责的所有销售地区,然后对于每个地区,外部查询查找不在任一地区的客户。由于同一原因,当在此查询中使用 NOT IN 时,结果将不包含任何客户。还可以使用 < >ALL 运算符获得相同的结果,该运算符与 NOT IN 等效。
可以用 ALL 或 ANY 关键字修改引入子查询的比较运算符。SOME 是 SQL-92 标准的 ANY 的等效物。由带修改的比较运算符引入的子查询返回一列零值或更多值,并且可以包括 GROUP BY 或 HAVING 子句。这些子查询可通过 EXISTS 重新表述。以 > 比较运算符为例,>ALL 表示大于每一个值;换句话说,大于最大值。例如,>ALL (1, 2, 3) 表示大于 3。>ANY 表示至少大于一个值,也就是大于最小值。因此 >ANY (1, 2, 3) 表示大于 1。查联机帮助吧,
实例(eg):all:
*/查询成绩不大于90分的课程
use student
select *
from course
where 课程代号<>all(select 课程代号 from grade where 课程成绩>90)实例:any:
*/查询年龄不小于平均年龄的所有学生信息
use student
select * from student wher 年龄<>any (select avy(年龄) from student)实例:some
*/查询年龄小于平均年龄的所有学生信息
use student
select * from student where 年龄<some(select avg(年龄) from student)顺便说下,any属于SQL支持的3种定量谓词之一。它和some完全等价,即能用some的地方完全可以使用any.
goif (object_id ('t1' ) is not null ) drop table t1
create table t1 (n int )
insert into t1 select 2 union select 3 if (object_id ('t2' ) is not null ) drop table t2
create table t2 (n int )
insert into t2 select 1 union select 2 union select 3 union select 4select * from t2 where n> all (select n from t1 ) --4
select * from t2 where n> any (select n from t1 ) --3,4
--select * from t2 where n>some(select n from t1) --3,4select * from t2 where n= all (select n from t1 ) --无数据
select * from t2 where n= any (select n from t1 ) --2,3
--select * from t2 where n=some(select n from t1) --2,3select * from t2 where n< all (select n from t1 ) --1
select * from t2 where n< any (select n from t1 ) --1,2
--select * from t2 where n<some(select n from t1) --1,2select * from t2 where n<> all (select n from t1 ) --1,4
select * from t2 where n<> any (select n from t1 ) --1,2,3,4
--select * from t2 where n<>some(select n from t1)--1,2,3,4
set nocount off
注意,如果t1中包含null数据,那么所有All相关的比较运算将不会返回任何结果,原因就不用多解释了。而因为t1和t2表的null的存在他们和not exists之类的比较符会有一些区别。 比如下面两句 select * from t2 a where not exists(select 1 from t1 where n>=a.n) select * from t2 where n >all(select n from t1) 他们逻辑上意义很像但是对于null的处理却是恰恰相反,第一句会忽略子查询的null而把t2的null同时查出来,第二句却是忽略了t2的null同时会因为t1中的null而无法查询到数据。