谁能帮忙解释下all,any,some等谓词的用法,有事例就更好哦.

解决方案 »

  1.   

    jinjazz:被遗忘的SQLServer比较运算符谓词
      

  2.   

    ALL
    用标量值与单列集中的值进行比较。 语法
    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。
      

  3.   

    SOME | ANY
    用标量值与单列集中的值进行比较。 语法
    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。
      

  4.   

    用 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)
      

  5.   


    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一样
     
      

  6.   

    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)
      

  7.   

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

  8.   

    http://www.fuhainet.cn/Database/SqlServer/2009/1004/3746.html
      

  9.   

    用 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。查联机帮助吧,
      

  10.   

    some,any,all在进行子查询的时候还是有用处的。JJ的那个讲的很清楚了。
      

  11.   

    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.
      

  12.   

    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而无法查询到数据。