经常看见有人用这个exists 关键字,
select * from tb where exists (...)
这个关键字怎么用啊,什么时候用?哪位大大给举2例子讲下吧。
详细点,感激不尽。(最好是别发链接)

解决方案 »

  1.   

    exist表示存在
    not exists 表示不存在
      

  2.   

    EXISTS结构是一个TSQL函数,这个函数会就圆括号中的子查询返回一个布尔变量。如果子查询返回了任意行的话,这个结构就返回真;否则,它就返回假。这个结构特别适用于查询表中是否存在某些记录。它也非常适合来决定是否在表中运行更新或者插入语句(在这篇文章中,随后我将向大家介绍)。 Listing A中创建了一个表并插入了一些数据,这样你就可以利用这张表来看看EXISTS结构是如何工作的了。Listing B中的脚本使用EXISTS结构在SalesHistory表中检查每一行,并根据已存在的行得到一个变量。这个脚本将返回1(真),这意味着SalesHistory表包含你所要查询的行。在这种情况下,一旦在SalesHistory表中找到了一条记录,EXISTS结构就不会继续查找,并马上返回1。使用EXISTS结构额外的好处就是,一旦它找到满足条件的记录,就会立即返回。Listing C与上面的脚本类似,但是它的返回值是0,因为在这个条件下,EXISTS条件不满足。由于EXISTS结构的工作原理,所以下面的语句所实现的功能是一样的。SELECT * FROM SalesHistoryWHERE EXISTS(SELECT NULL)SELECT * FROM SalesHistoryWHERE 1 = 1SELECT * FROM SalesHistoryWHERE EXISTS(SELECT 1)在刚才的脚本中,你可能会对下面的语句感到迷惑:SELECT * FROM SalesHistoryWHERE EXISTS(SELECT NULL)因为NULL在数据库中是一个值(它是一个未知的值),在出现NULL值的地方EXISTS结构都将返回真。开发者很少使用EXISTS对子查询进行操作。下面的查询将返回同样的结果集,虽然它们的结构不同。第一个查询使用了EXISTS的相关子查询,第二查询在SalesHistory表中,将SalePrice字段与该字段的总平均值进行比较。SELECT * FROM SalesHistory shWHERE EXISTS(      SELECT AVG(SalePrice)      FROM SalesHistory shi      HAVING AVG(SalePrice) > sh.SalePrice) SELECT * FROM SalesHistory shWHERE SalePrice <(      SELECT AVG(SalePrice)      FROM SalesHistory shi)你可以使用EXISTS操作来决定,是否对某一个单独的记录使用UPDATE或者INSERT语句,就像下面的例子一样:IF EXISTS(      SELECT * FROM SalesHistory      WHERE SaleDate = '1/1/2001' AND            Product = 'Computer' AND             SalePrice = 1000)      UPDATE TOP(1) SalesHistory      SET SalePrice = 1100      WHERE SaleDate = '1/1/2001' AND            Product = 'Computer' AND             SalePrice = 1000ELSE      INSERT INTO SalesHistory      (Product, SaleDate, SalePrice)      VALUES      ('Computer', '1/1/2001', 1100)虽然在实际的环境中,你可能不会用到这里所介绍的例子,但是它们给你演示了如何利用EXISTS结构来决定使用哪种DML类型。给它一个机会下次,当你写查询语句的时候,请记住要使用EXISTS结构。它很容易掌握,使用也很方便,并且能在程序中给你提供很多便利。********************************************************
    列表A
    IF OBJECT_ID('SalesHistory','U')>0      DROP TABLE SalesHistory
    GO
    CREATE TABLE SalesHistory
    (                  SaleID INT IDENTITY(1,1),                        Product VARCHAR(30),                   SaleDate DATETIME,                   SalePrice MONEY
    )DECLARE @i SMALLINT
    SET @i = 1WHILE (@i <= 100)BEGIN                  INSERT INTO SalesHistory                  (Product, SaleDate, SalePrice)                  VALUES                  ('Computer', DATEADD(mm, @i, '3/10/2006'), DATEPART(ms, GETDATE()) + (@i + 57) )
          INSERT INTO SalesHistory                  (Product, SaleDate, SalePrice)                  VALUES                  ('BigScreen', DATEADD(mm, @i, '3/2/2006'), DATEPART(ms, GETDATE()) + (@i + 13) )
          INSERT INTO SalesHistory                  (Product, SaleDate, SalePrice)                  VALUES            ('PoolTable', DATEADD(mm, @i, '2/11/2007'), DATEPART(ms, GETDATE()) + (@i + 29) )
          SET @i = @i + 1END
    GO×××××××××××××××××××××××××××××××××××××××××××列表BDECLARE @TablePopulated BIT
    SET @TablePopulated = CASE WHEN EXISTS(SELECT * FROM SalesHistory) THEN 1 ELSE 0 END
    SELECT @TablePopulated
     
    ×××××××××××××××××××××××××××××××××××××××××××××××××
    列表C 
    DECLARE @TablePopulated BIT
    SET @TablePopulated = CASE WHEN EXISTS(SELECT * FROM SalesHistory WHERE Product = 'Chair') THEN 1 ELSE 0 END
    SELECT @TablePopulated
      

  3.   

    IN:确定给定的值是否与子查询或列表中的值相匹配。
      IN 关键字使您得以选择与列表中的任意一个值匹配的行。
      当要获得居住在 California、Indiana 或 Maryland 州的所有作者的姓名和州的列表时,就需要下列查询:
      SELECT ProductID, ProductName FROM Northwind.dbo.Products WHERE CategoryID = 1 OR CategoryID = 4 OR 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% 的一类。
      NOT IN:通过 NOT IN 关键字引入的子查询也返回一列零值或更多值。
      以下查询查找没有出版过商业书籍的出版商的名称。
      SELECT pub_name FROM publishers WHERE pub_id NOT IN (SELECT pub_id FROM titles WHERE type = 'business')
      使用 EXISTS 和 NOT EXISTS 引入的子查询可用于两种集合原理的操作:交集与差集。两个集合的交集包含同时属于两个原集合的所有元素。
      差集包含只属于两个集合中的第一个集合的元素。
      EXISTS:指定一个子查询,检测行的存在。
      本示例所示查询查找由位于以字母 B 开头的城市中的任一出版商出版的书名:
      SELECT DISTINCT pub_name FROM publishers WHERE EXISTS (SELECT * FROM titles WHERE pub_id = publishers.pub_id AND type =
      'business')
      SELECT distinct 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
      NOT EXISTS:
      例如,要查找不出版商业书籍的出版商的名称:
      SELECT pub_name FROM publishers WHERE NOT EXISTS (SELECT * FROM titles WHERE pub_id = publishers.pub_id AND type =
      'business')
      下面的查询查找已经不销售的书的名称:
      SELECT title FROM titles WHERE NOT EXISTS (SELECT title_id FROM sales WHERE title_id = titles.title_id)
      

  4.   


    select *
    from t1 
    where exists (select 1 from t2 where id=t1.id);
    刚看别的帖子里发的连2表的语句;
    为啥不写成select *
    from t1,t2 
    where t1.id=t2.id);还有就是 select 1 这样写是什么意思?
      

  5.   

    exists 是用来判断的,跟它子查询输出没任何关系
      

  6.   


    那select *
    from t1 
    where exists (select 1 from t2 where id=t1.id);
    不就相当于与select * from t1 where true/false 
    那个这个语句是啥意思
      

  7.   

    exists 表示结果集存在。
    not exists 子查询不存在。
      

  8.   

    select 1 from table;与select anycol(目的表集合中的任意一行) from table;与select * from table 从作用上来说是没有差别的,都是查看是否有记录,一般是作条件查询用的。select 1 from 中的1是一常量(可以为任意数值),查到的所有行的值都是它,但从效率上来说,1>anycol>*,因为不用查字典表。
      

  9.   

    exists (sql 返回结果集为真)
    not exists (sql 不返回结果集为真)
    如下:
    表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
    SELECT ID,NAME FROM A WHERE EXIST (SELECT * FROM B WHERE A.ID=B.AID)
    执行结果为
    1 A1
    2 A2
    原因可以按照如下分析
    SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=1)
    --->SELECT * FROM B WHERE B.AID=1有值返回真所以有数据
    SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=2)
    --->SELECT * FROM B WHERE B.AID=2有值返回真所以有数据
    SELECT ID,NAME FROM A WHERE EXISTS (SELECT * FROM B WHERE B.AID=3)
    --->SELECT * FROM B WHERE B.AID=3无值返回真所以没有数据
    NOT EXISTS 就是反过来
    SELECT ID,NAME FROM A WHERE NOT EXIST (SELECT * FROM B WHERE
    A.ID=B.AID)
    执行结果为
    3 A3
    ======================================================================
    =====
    EXISTS = IN,意思相同不过语法上有点点区别,好像使用IN 效率要差点,应该是不会执行
    索引的原因
    SELECT ID,NAME FROM A WHERE ID IN (SELECT AID FROM B)
    NOT EXISTS = NOT IN ,意思相同不过语法上有点点区别
    SELECT ID,NAME FROM A WHERE ID NOT IN (SELECT AID FROM B)
    下面是普通的用法:
    SQL 中IN,NOT IN,EXISTS,NOT EXISTS 的用法和差别:
    IN:确定给定的值是否与子查询或列表中的值相匹配。
    IN 关键字使您得以选择与列表中的任意一个值匹配的行。
    当要获得居住在California、Indiana 或Maryland 州的所有作者的姓名和州的列表时,
    就需要下列查询:
    SELECT ProductID, ProductName FROM Northwind.dbo.Products WHERE CategoryID = 1
    OR CategoryID = 4 OR 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% 的一类。
    NOT IN:通过NOT IN 关键字引入的子查询也返回一列零值或更多值。
    以下查询查找没有出版过商业书籍的出版商的名称。
    SELECT pub_name FROM publishers WHERE pub_id NOT IN (SELECT pub_id FROM
    titles WHERE type = 'business')
    使用EXISTS 和NOT EXISTS 引入的子查询可用于两种集合原理的操作:交集与差
    集。
    两个集合的交集包含同时属于两个原集合的所有元素。
    差集包含只属于两个集合中的第一个集合的元素。
    EXISTS:指定一个子查询,检测行的存在。
    本示例所示查询查找由位于以字母B 开头的城市中的任一出版商出版的书名:
    SELECT DISTINCT pub_name FROM publishers WHERE EXISTS (SELECT * FROM
    titles WHERE pub_id = publishers.pub_id AND type =
    'business')
    SELECT distinct 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
    NOT EXISTS:
    例如,要查找不出版商业书籍的出版商的名称:
    SELECT pub_name FROM publishers WHERE NOT EXISTS (SELECT * FROM titles
    WHERE pub_id = publishers.pub_id AND type =
    'business')
    下面的查询查找已经不销售的书的名称:
    SELECT title FROM titles WHERE NOT EXISTS (SELECT title_id FROM sales WHERE
    title_id = titles.title_id)
    语法
    EXISTS subquery
    参数
    subquery:是一个受限的SELECT 语句(不允许有COMPUTE 子句和INTO 关键字)。有关
    更多信息,请参见SELECT 中有关子查询的讨论。
    结果类型:Boole an
    结果值:如果子查询包含行,则返回TRUE。
    示例
    A. 在子查询中使用NULL 仍然返回结果集
    这个例子在子查询中指定NULL,并返回结果集,通过使用EXISTS 仍取值为TRUE。
    USE Northwind
    GO
    SELECT CategoryName
    FROM Categories
    WHERE EXISTS (SELECT NULL)
    ORDER BY CategoryName ASC
    GO
    B. 比较使用EXISTS 和IN 的查询
    这个例子比较了两个语义类似的查询。第一个查询使用EXISTS 而第二个查询使用IN。注
    意两个查询返回相同的信息。
    USE pubs
    GO
    SELECT DISTINCT pub_name
    FROM publishers
    WHERE EXISTS
    (SELECT *
    FROM titles
    WHERE pub_id = publishers.pub_id
    AND type = \'business\')
    GO
    -- Or, using the IN clause:
    USE pubs
    GO
    SELECT distinct 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
    WHERE exists
    (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.比较使用EXISTS 和IN 的查询
    本示例所示查询查找由位于以字母B 开头的城市中的任一出版商出版的书名:
    USE pubs
    GO
    SELECT title
    FROM titles
    WHERE EXISTS
    (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. 使用NOT EXISTS
    NOT EXISTS 的作用与EXISTS 正相反。如果子查询没有返回行,则满足NOT EXISTS 中
    的WHERE 子句。本示例查找不出版商业书籍的出版商的名称:
    USE pubs
    GO
    SELECT pub_name
    FROM publishers
    WHERE NOT EXISTS
    (SELECT *
    FROM titles
    WHERE pub_id = publishers.pub_id
    AND type = \'business\')
    ORDER BY pub_name
    GO
      

  10.   

    先读N遍《数据库系统概论(第四版)》 王珊 萨师煊   高等教育出版社 (掌握基础知识和概念) 然后再粗略浏览一遍SQL的官方手册。(方便以后查找,避免类似于考试的时候,给你本政治书也不知道答案在第几章,第几页)