MS-SQLSERVER 2000 ,有两个SQL语句为何执行结果不同?
1.SELECT TOP 5 * FROM 成绩 c1 WHERE c1.id NOT IN (SELECT TOP 5 c2.id FROM 成绩 c2 ORDER BY c2.id) ORDER BY c1.id2.SELECT TOP 5 * FROM 成绩 c1 WHERE  NOT EXISTS (SELECT TOP 5 * FROM 成绩 c2 WHERE c1.id = c2.id)表结构如下:成绩(表名)id   成绩   学号  课程名称
1     52    001   0011
2     52    002   0011
3     52    003   0011
4     52    004   0011
5     52    005   0011
6     52    006   0011
7     52    007   0011
8     52    008   0011
9     52    009   0011
10     52    0010   0011
11     52    0011   0011第一条执行结果为:
6     52    006   0011
7     52    007   0011
8     52    008   0011
9     52    009   0011
10     52    0010   0011
第二条的执行结果为空,不知为什么?

解决方案 »

  1.   

    not in 是不包含
    not exists 是不存在
      

  2.   

    1.SELECT TOP 5 * FROM 成绩 c1 WHERE c1.id NOT IN (SELECT TOP 5 c2.id FROM 成绩 c2 ORDER BY c2.id) ORDER BY c1.id 2.SELECT TOP 5 * FROM 成绩 c1 WHERE  NOT EXISTS (SELECT TOP 5 * FROM 成绩 c2 WHERE c1.id = c2.id) 第一个是NOT IN 按ID排序,取前五个成绩的ID有
    第二个NOT EXISTS 返回是布尔值,
    没有ID=ID的所以为空
      

  3.   

    NOT EXISTS
    只有是与否的关系
      

  4.   

    表中数据如下: name            id Tom              1 
    Tom              2 
    Jerry            1 
    Jerry            2 
    Jerry            10 
    Jack            23 
    Jack            15 。 我要保留id最小的,Name唯一,如: Tom  1,  Jerry  1, Jack  15
    if object_id('[tb]') is not null drop table [tb] 
     go 
    create table [tb]([name] varchar(10),[id] int)
    insert [tb] select 'Tom',1
    union all select 'Tom',2
    union all select 'Jerry',1
    union all select 'Jerry',2
    union all select 'Jerry',10
    union all select 'Jack',23
    union all select 'Jack',15delete t
    from tb t
    where exists(select 1 from tb where name=t.name and id<t.id)select * from tb/*
    name       id
    ---------- -----------
    Tom        1
    Jerry      1
    Jack       15(3 行受影响)*/
    EXISTS的用法
      

  5.   

     比较使用 EXISTS 和 IN 的查询
    以下示例比较了两个语义等同的查询。第一个查询使用 EXISTS,第二个查询使用 IN。 
    USE AdventureWorks ;
    GO
    SELECT DISTINCT c.FirstName, c.LastName, e.DepartmentID
    FROM Person.Contact c JOIN HumanResources.Employee e
    ON e.ContactID = c.ContactID WHERE EXISTS
    (SELECT *
    FROM HumanResources.Department d
    WHERE e.DepartmentID = d.DepartmentID
    AND d.Name = 'Purchasing') ;
    GO
     下面的查询使用 IN。
     
    USE AdventureWorks ;
    GO
    SELECT DISTINCT c.FirstName, c.LastName, e.DepartmentID
    FROM Person.Contact c JOIN HumanResources.Employee e
    ON e.ContactID = c.ContactID WHERE DepartmentID IN
    (SELECT DepartmentID 
    FROM HumanResources.Department d
    WHERE d.Name = 'Purchasing') ;
    GO
     以下是其中任一查询的结果集。 复制代码 
    FirstName                 LastName                  DepartmentID
    ------------------------- ------------------------- ------------
    Annette                   Hill                      5           
    Arvind                    Rao                       5           
    Ben                       Miller                    5           
    Eric                      Kurjan                    5           
    Erin                      Hagins                    5           
    Frank                     Pellow                    5           
    Fukiko                    Ogisu                     5           
    Gordon                    Hee                       5           
    Linda                     Meisner                   5           
    Mikael                    Sandberg                  5           
    Reinout                   Hillmann                  5           
    Sheela                    Word                      5           (12 row(s) affected)
      

  6.   

    比较使用 EXISTS 和 IN 的查询
    以下示例显示查找以 P 开头的部门员工的查询。USE AdventureWorks;
    GO
    SELECT c.FirstName, c.LastName, e.Title
    FROM Person.Contact c JOIN HumanResources.Employee e
    ON e.ContactID = c.ContactID WHERE EXISTS
    (SELECT *
    FROM HumanResources.Department d
    WHERE e.DepartmentID = d.DepartmentID
    AND d.Name LIKE 'P%');
    GO
     下面的查询使用 IN。
    USE AdventureWorks;
    GO
    SELECT c.FirstName, c.LastName, e.Title
    FROM Person.Contact c JOIN HumanResources.Employee e
    ON e.ContactID = c.ContactID WHERE DepartmentID IN
    (SELECT DepartmentID
    FROM HumanResources.Department
    WHERE Name LIKE 'P%');
    GO
     
      

  7.   

    嘿嘿,明白了
    SELECT TOP 5 * FROM 成绩 c1 WHERE  NOT EXISTS (SELECT TOP 5 * FROM 成绩 c2 WHERE c1.id = c2.id) 
    中的HERE c1.id = c2.id永远为ture,所以exists的条件失效了
      

  8.   


    not in 是不包含 
    not exists 是不存在
      

  9.   

    not in 是不包含 
    not exists 是不存在
      

  10.   

    http://topic.csdn.net/u/20090812/16/ece8acfb-459e-448e-a4fe-86270f9fb063.html
    11楼
      

  11.   

    select
    *--指定顯示的列
    from 
    (select *,Row=Row_number()over(order by ID) FROM 成绩))t
    where Row between 6 and 10
      

  12.   

    not in后面是个结果集,not exists后面是个条件,两者完全不是同一个概念
    而且你后面一句的SELECT TOP 5 * FROM 成绩 c2 WHERE c1.id = c2.id是有结果的,是个恒成立的句子。查询变成了not exists(true)结果为空那是肯定了的。当not exists(false)时才起作用。
    前一句:查询人员中不在前5名的前5名既前十名的后5名(注意这里是所有的行都查询)
    后面一句:查询前5名中不是前5名的前5名。(就好像说找出不是冠军的冠军,在这里只查询前5名后面的不管。)
    以上是个人理解希望能帮你!如有错误多多包涵。
      

  13.   

    1>EXISTS
    指定一个子查询,检测行的存在。
    语法
    EXISTS subquery参数
    subquery是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INTO 关键字)。有关更多信息,请参见 SELECT 中有关子查询的讨论。 结果类型
    Boolean结果值
    如果子查询包含行,则返回 TRUE。
    2>IN
    确定给定的值是否与子查询或列表中的值相匹配。
    A. 在子查询中使用 NULL 仍然返回结果集
    这个例子在子查询中指定 NULL,并返回结果集,通过使用 EXISTS 仍取值为 TRUE。USE Northwind
    GO
    SELECT CategoryName
    FROM Categories
    WHERE EXISTS (SELECT NULL)
    ORDER BY CategoryName ASC
    GOB. 比较使用 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                           
    (2 row(s) affected)
    [b][/b]