`

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 等效。

 

  1. ALL与ANY的关系就是,AND 与 OR 的关系。
  2. ANY与SOME等价,据说搞这两个不同的词出来是为了迁就英语语法。例如,在用= ANY 的地方在(英语)语法上就应该是= SOME。
  3. IN 与 = ANY 等价,均表示,变量在(子查询)列表之中,即 a IN (table B) 表示 a = ANY B.b
  4. NOT IN 与 <> ALL 等价,而不等于<> ANY,前两者均表示,变量不在(子查询)列表之中,即 a NOT IN (table B) 表示 a <> ALL B.b。而如果a <> ANY B.b,则只要任意一个b<>a就true了。
  5. IN 与 EXISTS 的性能区别主要来自,IN 会编列子查询的每行记录,然后再返回,而EXISTS 则只要遇到第一个满足条件的记录就马上返回。
  6. NOT IN 与 NOT EXISTS 并不能完全等价,只有当子查询中,select 关键字后的字段有not null约束或者有这种暗示时才用NOT IN。

摘抄:http://blog.sina.com.cn/s/blog_4586764e0100mtza.html

分享到:
评论

相关推荐

    SQL语言在透视表中的应用

    嵌套查询部分将展示如何通过不同的SQL子句来提取复杂的数据集,例如通过〔in〕、〔any〕、〔some〕、〔all〕、〔exists〕、〔union〕、〔intersect〕和〔minus〕等关键字。多表查询(关联查询)将强调如何基于特定...

    SQL语句中存在量词的深入剖析和应用探讨.pdf

    在SQL语句中,Exists与其他量词如All、Any和Some不同。All量词用于比较操作,适用于全部的情况;Any和Some用来在子查询结果中进行比较,任何一个条件满足即可。 执行过程方面,当一个带有Exists关键字的SQL语句执行...

    SQL语句培训教材

    =, &lt;, &gt;, , &gt;=)、逻辑运算符(NOT, AND, OR)、连接运算符(||)、空值判断(IS NULL)以及复杂的比较,如IN、ANY、SOME和ALL。LIKE语句用于模式匹配,BETWEEN用于范围查询,EXISTS则用来判断子查询是否存在满足...

    在ADO(sql)中使用SELECT的语法之六-子查询的使用方法

    关键词`ANY`, `SOME` 和 `ALL` 的使用可以帮助我们确定外层查询中字段的值与子查询结果集中值的关系。 - **ANY/SOME**:表示只要子查询中有任何一个值满足条件即可。 - 示例:`SELECT * FROM 产品 WHERE 单价 &gt; ...

    MS-SQL子查询语句集[文].pdf

    MS-SQL中的子查询主要分为几种类型,包括EXISTS、IN、NOT IN以及ANY/SOME。以下是对这些子查询类型的详细解释: 1. EXISTS: EXISTS子查询用于检查子查询是否返回至少一行数据。它的语法结构是`EXISTS (subquery)`...

    sql集合运算符使用方法

    本文将详细介绍几种主要的集合运算符,包括IN、ANY、SOME、ALL以及EXISTS,并通过实例解析它们的用法和特点。 1. **IN运算符**: IN运算符是最常用的集合运算符之一,它允许我们从一组值中筛选出匹配的数据。例如...

    SQL数据的查询和更新实验报告报告.pdf

    - **SOME, ANY, ALL**:比较子查询结果中的任何值或所有值 - **EXISTS**:检查子查询是否存在匹配项 #### 1.4 集合运算 - **UNION**:合并两个或更多查询的结果,去除重复行 - **AND, OR**:用于组合查询,实现...

    SQL优化(oracle)

    - **ANY和SOME操作符优化**:对于`ANY`和`SOME`操作符,优化器会将这些转换为使用等价的`=`和`OR`或`EXISTS`子查询的表达式。 - 示例:`sal &gt; ANY(:first_sal, :second_sal)` 转换为 `sal &gt; :first_sal OR sal &gt; :...

    SQL多层查询[借鉴].pdf

    在SQL查询中,多层查询,也称作嵌套查询,是一种高级的查询技术,它允许在一个查询语句中嵌入另一个查询语句,以实现更复杂的数据筛选和比较。这种技术极大地增强了SQL的能力,使其能够处理更复杂的逻辑和数据关联。...

    程序员的SQL金典.rar

     8.4.2 ANY和SOME运算符  8.4.3 ALL运算符  8.4.4 EXISTS运算符  8.5 在其他类型SQL语句中的子查询应用  8.5.1 子查询在INSERT语句中的应用  8.5.2 子查询在UPDATE语句中的应用  8.5.3 子查询在DELETE语句中...

    课程名称:数据库系统概论仲恺农业技术学院(“查询”文档)共66张.pptx

    在SQL中,IN谓词用于检查某列的值是否存在于子查询返回的结果集中。例如,找出选修了特定课程的所有学生,可以使用如下子查询: ```sql SELECT Sno FROM Student WHERE Cno IN (SELECT Cno FROM Course WHERE Cname...

    Teradata SQL Functions, Operators, Expressions, and Predicates

    2. 常见谓词包括BETWEEN、LIKE、IS NULL、IN、EXISTS、ALL、ANY、SOME等。 3. 使用谓词可以实现复杂的条件筛选,如“列名 IS NULL”来筛选空值,或者“列名 IN (值1, 值2, 值3)”来筛选一组特定值。 此外,Teradata...

    浅析被遗忘的SQLServer比较运算符修饰词

    SQLServer中有三个关键字可以修改比较运算符:All、Any和Some,其中Some和Any等价。官方的参考文档http://technet.microsoft.com/zh-cn/library/ms187074(SQL.90).aspx 他们作用于比较运算符和子查询之间,作用类似...

    SQL语句培训教材--实用

    - `ANY`, `SOME` 和 `ALL`:用于比较一个值与一组值的关系。 - `EXISTS` 和 `NOT EXISTS`:用于检查子查询的结果是否存在。 - `AND` 和 `OR`:逻辑运算符,用于组合多个条件。 - `UNION` 和 `UNION ALL`:用于合并两...

    DB2 SQL 精萃.pdf

    9. EXISTS与IN关键字的使用,以及SOME和ANY的使用区别。 10. EXCEPT、INTERSECT、UNION等集合操作的使用。 11. 使用MERGE语句进行数据操作。 12. 采集样本数据的技术。 13. 如何使用DISTINCT去除结果集中的重复行。 ...

    sqlserver经典学习总结.pdf

    此外,还有IN、BETWEEN、EXISTS、ANY、ALL和SOME等特殊条件运算符,以及LIKE用于模式匹配,配合通配符'_'、%和[]进行文本数据的查找。 T-SQL基础操作是SQL Server日常使用的核心。INSERT语句用于向表中插入新数据,...

    MySQL 子查询(subquery)语法与用法实例.docx

    在 MySQL 中,可以使用多种操作符来对子查询返回的结果进行比较,例如 `=、、&gt;、&lt;、IN、EXISTS、ANY、SOME、ALL` 等。这些操作符可以根据实际情况选择使用。 在上面的例子中,我们使用了 IN 操作符来比较子查询返回...

    s-sql 自学通

    - **EXISTS、ANY、ALL的使用:** EXISTS用于检查子查询是否存在结果;ANY和ALL用于比较子查询的结果。 #### 十一、操作数据 - **数据操作语句:** - `INSERT INTO table_name (column1, column2, ...) VALUES ...

Global site tag (gtag.js) - Google Analytics