zoukankan      html  css  js  c++  java
  • SQL中 in 、not in 、exists、not exists 用法和差别

    如下:

    A

    ID NAME

    1    A1

    2    A2

    3  A3

     

    B

    ID AID NAME

    1    1 B1

    2    2 B2

    3    2 B3

     

    A和表B是1对多的关系 A.ID => B.AID

    1 SELECT ID,NAME FROM A WHERE EXIST (SELECT*FROM B WHERE A.ID=B.AID) 

     

    执行结果为

     

    1 A1

     

    2 A2

     

     

    原因可以按照如下分析

     

     1 SELECT ID,NAME FROM A WHEREEXISTS (SELECT*FROM B WHERE B.AID=1)
     2 
     3 --->SELECT * FROM B WHERE B.AID=1有值返回真所以有数据
     4 
     5  
     6 
     7 SELECT ID,NAME FROM A WHEREEXISTS (SELECT*FROM B WHERE B.AID=2)
     8 
     9 --->SELECT * FROM B WHERE B.AID=2有值返回真所以有数据
    10 
    11  
    12 
    13 SELECT ID,NAME FROM A WHEREEXISTS (SELECT*FROM B WHERE B.AID=3)
    14 
    15 --->SELECT * FROM B WHERE B.AID=3无值返回真所以没有数据

     

     

     

    NOTEXISTS就是反过来

     

     

    1 SELECT ID,NAME FROM A WHERENOT EXIST (SELECT*FROM B WHERE A.ID=B.AID) 

     

    执行结果为

     

    3 A3

     

     

    ===========================================================================

     

    EXISTS=IN,意思相同不过语法上有点点区别,好像使用IN效率要差点,应该是不会执行索引的原因

     

    SELECT ID,NAME FROM A WHEREID IN (SELECT AID FROM B)

     

     

     

    NOTEXISTS=NOTIN ,意思相同不过语法上有点点区别

     

    SELECT ID,NAME FROM A WHEREIDNOTIN (SELECT AID FROM B)

     

     

     

     

     

    下面是普通的用法:

     

     

     

    SQLIN,NOTIN,EXISTS,NOT EXISTS的用法和差别:

     

    IN:确定给定的值是否与子查询或列表中的值相匹配。

     

    IN关键字使您得以选择与列表中的任意一个值匹配的行。

     

    当要获得居住在 CaliforniaIndiana Maryland 州的所有作者的姓名和州的列表时,就需要下列查询:

     

    SELECT ProductID, ProductName FROM Northwind.dbo.Products WHERE CategoryID =1OR CategoryID =4OR CategoryID =5

     

    然而,如果使用IN,少键入一些字符也可以得到同样的结果:

     

    SELECT ProductID, ProductName FROM Northwind.dbo.Products WHERE CategoryID IN (1, 4, 5)

     

    IN关键字之后的项目必须用逗号隔开,并且括在括号中。

     

    下列查询在 titleauthor 表中查找在任一种书中得到的版税少于50%的所有作者的 au_id,然后从 authors 表中选择 au_id

     

    titleauthor 查询结果匹配的所有作者的姓名:

     

    SELECT au_lname, au_fname FROM authors WHERE au_id IN (SELECT au_id FROM titleauthor WHERE royaltyper <50)

     

    结果显示有一些作者属于少于50%的一类。

     

    NOTIN:通过NOTIN关键字引入的子查询也返回一列零值或更多值。

     

    以下查询查找没有出版过商业书籍的出版商的名称。

     

    SELECT pub_name FROM publishers WHERE pub_id NOTIN (SELECT pub_id FROM titles WHERE type ='business')

     

    使用EXISTSNOTEXISTS引入的子查询可用于两种集合原理的操作:交集与差集。

     

          两个集合的交集包含同时属于两个原集合的所有元素。

     

    差集包含只属于两个集合中的第一个集合的元素。

     

    EXISTS:指定一个子查询,检测行的存在。

     

    本示例所示查询查找由位于以字母 B 开头的城市中的任一出版商出版的书名:

     

    SELECTDISTINCT pub_name FROM publishers WHEREEXISTS (SELECT*FROM titles WHERE pub_id = publishers.pub_id AND type =

     

    'business')

     

    SELECTdistinct pub_name FROM publishers WHERE pub_id IN (SELECT pub_id FROM titles WHERE type ='business')

     

    两者的区别:

     

    EXISTS:后面可以是整句的查询语句如:SELECT*FROM titles

     

    IN:后面只能是对单列:SELECT pub_id FROM titles

     

    NOTEXISTS:

     

    例如,要查找不出版商业书籍的出版商的名称:

     

    SELECT pub_name FROM publishers WHERENOTEXISTS (SELECT*FROM titles WHERE pub_id = publishers.pub_id AND type =

     

    'business')

     

    下面的查询查找已经不销售的书的名称:

     

    SELECT title FROM titles WHERENOTEXISTS (SELECT title_id FROM sales WHERE title_id = titles.title_id)

     

     

     

    语法

     

     

     

    EXISTS subquery

     

    参数

     

    subquery:是一个受限的SELECT语句 (不允许有COMPUTE子句和INTO关键字)。有关更多信息,请参见SELECT中有关子查询的讨论。

     

     

     

    结果类型:Boolean

     

     

     

     

     

    结果值:如果子查询包含行,则返回 TRUE

     

     

     

     

     

    示例

     

    A. 在子查询中使用NULL仍然返回结果集

     

     

     

    这个例子在子查询中指定NULL,并返回结果集,通过使用EXISTS仍取值为 TRUE

     

     

     

    USE Northwind

     

    GO

     

    SELECT CategoryName

     

    FROM Categories

     

    WHEREEXISTS (SELECTNULL)

     

    ORDERBY CategoryName ASC

     

    GO

     

     

     

    B. 比较使用EXISTSIN的查询

     

     

     

    这个例子比较了两个语义类似的查询。第一个查询使用EXISTS而第二个查询使用IN。注意两个查询返回相同的信息。

     

     

     

    USE pubs

     

    GO

     

    SELECTDISTINCT pub_name

     

    FROM publishers

     

    WHEREEXISTS

     

        (SELECT*

     

        FROM titles

     

        WHERE pub_id = publishers.pub_id

     

        AND type = /'business/')

     

    GO

     

     

     

    -- Or, using the IN clause:

     

     

     

    USE pubs

     

    GO

     

    SELECTdistinct pub_name

     

    FROM publishers

     

    WHERE pub_id IN

     

        (SELECT pub_id

     

        FROM titles

     

        WHERE type = /'business/')

     

    GO

     

     

     

     

     

    下面是任一查询的结果集:

     

     

     

    pub_name                               

     

    ----------------------------------------

     

    Algodata Infosystems                   

     

    New Moon Books                         

     

     

     

    C.比较使用EXISTS=ANY的查询

     

     

     

    本示例显示查找与出版商住在同一城市中的作者的两种查询方法:第一种方法使用=ANY,第二种方法使用EXISTS。注意这两种方法返回相同的信息。

     

     

     

    USE pubs

     

    GO

     

    SELECT au_lname, au_fname

     

    FROM authors

     

    WHEREexists

     

        (SELECT*

     

        FROM publishers

     

        WHERE authors.city = publishers.city)

     

    GO

     

     

     

    -- Or, using = ANY

     

     

     

    USE pubs

     

    GO

     

    SELECT au_lname, au_fname

     

    FROM authors

     

    WHERE city =ANY

     

        (SELECT city

     

        FROM publishers)

     

    GO

     

     

     

     

     

    D.比较使用EXISTSIN的查询

     

     

     

    本示例所示查询查找由位于以字母 B 开头的城市中的任一出版商出版的书名:

     

     

     

    USE pubs

     

    GO

     

    SELECT title

     

    FROM titles

     

    WHEREEXISTS

     

        (SELECT*

     

        FROM publishers

     

        WHERE pub_id = titles.pub_id

     

        AND city LIKE /'B%/')

     

    GO

     

     

     

    -- Or, using IN:

     

     

     

    USE pubs

     

    GO

     

    SELECT title

     

    FROM titles

     

    WHERE pub_id IN

     

        (SELECT pub_id

     

        FROM publishers

     

        WHERE city LIKE /'B%/')

     

    GO

     

     

     

     

     

    E. 使用NOTEXISTS

     

     

     

    NOTEXISTS的作用与EXISTS正相反。如果子查询没有返回行,则满足NOTEXISTS中的WHERE子句。本示例查找不出版商业书籍的出版商的名称:

     

     

     

    USE pubs

     

    GO

     

    SELECT pub_name

     

    FROM publishers

     

    WHERENOTEXISTS

     

        (SELECT*

     

        FROM titles

     

        WHERE pub_id = publishers.pub_id

     

        AND type = /'business/')

     

    ORDERBY pub_name

     

    GO

     

  • 相关阅读:
    移动前端webApp开发点滴积累20140524
    做业务系统与公众产品的区别
    浅谈浏览器兼容性问题-(4)工具及调试
    浅谈浏览器兼容性问题-(3)他山之石整理
    浅谈浏览器兼容性问题-(2)本人解决方案理解与积累
    使用Using的注意事项
    [转]VMPlayer的Briged网络配置
    [转]移动互联网应用技术架构简介-Restful服务
    理解WCF中的Contracts
    [翻译]在ASP.NET Web API中通过OData支持查询和分页
  • 原文地址:https://www.cnblogs.com/smart9595/p/3712523.html
Copyright © 2011-2022 走看看