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.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
第二条的执行结果为空,不知为什么?
not exists 是不存在
第二个NOT EXISTS 返回是布尔值,
没有ID=ID的所以为空
只有是与否的关系
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的用法
以下示例比较了两个语义等同的查询。第一个查询使用 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)
以下示例显示查找以 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
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的条件失效了
not in 是不包含
not exists 是不存在
not exists 是不存在
11楼
*--指定顯示的列
from
(select *,Row=Row_number()over(order by ID) FROM 成绩))t
where Row between 6 and 10
而且你后面一句的SELECT TOP 5 * FROM 成绩 c2 WHERE c1.id = c2.id是有结果的,是个恒成立的句子。查询变成了not exists(true)结果为空那是肯定了的。当not exists(false)时才起作用。
前一句:查询人员中不在前5名的前5名既前十名的后5名(注意这里是所有的行都查询)
后面一句:查询前5名中不是前5名的前5名。(就好像说找出不是冠军的冠军,在这里只查询前5名后面的不管。)
以上是个人理解希望能帮你!如有错误多多包涵。
指定一个子查询,检测行的存在。
语法
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]