Any、All与>、<、=、组合和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 表示小于集合或列表中任何值,也就是等价表示小于为最大值;
若要使带有 >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 F