[转]SQL中exists,any,all,some,in
时 间:2014-03-05 14:18:41
作 者:zhaoyoulong ID:7492 城市:南京
摘 要:[转]SQL中exists,any,all,some,in
正 文:
Select * FROM orDERS
Where EXISTS(Select *FORM orDERS
Where NAME#='SB')
这样会返回orders里面所有的值,而不是只有NAME#='SB'的值
改成
Select * FROM orDERS O1
Where EXISTS(Select *FORM orDERS O2
Where O1.NAME# = O2.NAME# and O2.NAME# = 'SB') 即可得到NAME#='SB'的记录.
可以用 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 等效。
Where EXISTS(Select *FORM orDERS
Where NAME#='SB')
这样会返回orders里面所有的值,而不是只有NAME#='SB'的值
改成
Select * FROM orDERS O1
Where EXISTS(Select *FORM orDERS O2
Where O1.NAME# = O2.NAME# and O2.NAME# = 'SB') 即可得到NAME#='SB'的记录.
可以用 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的关系就是,AND 与 or 的关系。
- ANY与SOME等价,据说搞这两个不同的词出来是为了迁就英语语法。例如,在用= ANY 的地方在(英语)语法上就应该是= SOME。
- IN 与 = ANY 等价,均表示,变量在(子查询)列表之中,即 a IN (table B) 表示 a = ANY B.b
- NOT IN 与 <> ALL 等价,而不等于<> ANY,前两者均表示,变量不在(子查询)列表之中,即 a NOT IN (table B) 表示 a <> ALL B.b。而如果a <> ANY B.b,则只要任意一个b<>a就true了。
- IN 与 EXISTS 的性能区别主要来自,IN 会编列子查询的每行记录,然后再返回,而EXISTS 则只要遇到第一个满足条件的记录就马上返回。
- NOT IN 与 NOT EXISTS 并不能完全等价,只有当子查询中,select 关键字后的字段有not null约束或者有这种暗示时才用NOT IN。
Access软件网QQ交流群 (群号:54525238) Access源码网店
常见问答:
技术分类:
源码示例
- 【源码QQ群号19834647...(12.17)
- Access对子窗体数据进行批...(10.30)
- 最精简的组合框行来源数据快速输...(10.25)
- Access仿平台的多值选择器...(10.24)
- 【Access日期区间段查询】...(10.22)
- 【Access源码示例】VBA...(10.12)
- Access累乘示例,Acce...(10.09)
- 数值8.88,把整数8去掉,转...(10.08)
- 【Access自定义函数】一个...(09.30)
- 【Access选项卡示例】Ac...(09.09)
学习心得
最新文章
- Access快速开发平台--对上传...(11.22)
- Access快速开发平台企业版--...(11.18)
- 不会用多表联合查询,多表查询没结果...(11.16)
- 【案例分享】主键字段值含有不间断空...(11.16)
- Access快速开发平台--后台D...(11.14)
- 微软Access邀测新Monaco...(11.12)
- Access列表框左右互选、列表框...(11.11)
- 高效率在导入数据前删除记录(11.10)
- Access报价单转订单示例代码(11.08)
- Access系统自带的日期选择器不...(11.08)