您的位置:首页 > 数据库

SQL中All, Any, Some的意思

2012-05-21 15:03 459 查看
create table #A(id int)

go

insert into #A values(1)

insert into #A values(2)

insert into #A values(3)

insert into #A values(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一样

/*引用Mcrosoft的官方解释:*/

可以用 ALL 或 ANY 关键字修改引入子查询的比较运算符。SOME 是与 ANY 等效的 ISO 标准。

通过修改的比较运算符引入的子查询返回零个值或多个值的列表,并且可以包括 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】的嵌套查询功能是一样的。早期的SQL仅仅允许使用【any】,后来的版本为了和英语的【any】相区分,引入了【some】,同时还保留了【any】关键词。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: