转载:http://blog.csdn.net/lihan6415151528/archive/2009/08/20/4466914.aspx
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
中有关子查询的讨论。
结果类型:Boolean
结果值:如果子查询包含行,则返回
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
分享到:
相关推荐
IN、EXISTS、NOT IN、NOT EXISTS 是 SQL 中四种常用的条件判断运算符,它们之间的区别主要体现在使用场景、执行效率和语法结构上。 IN IN 是一种条件判断运算符,用于判断某个值是否存在于一个列表中。其基本语法...
在SQL查询中,`CASE WHEN`、`EXISTS`、`NOT EXISTS`以及`IN`和`NOT IN`是常用的操作符,它们用于处理复杂的条件判断和数据筛选。这些概念对于理解和编写高效的SQL语句至关重要,尤其是在数据分析和数据库管理中。 `...
本文将深入探讨 SQL 中 `EXISTS`, `NOT EXISTS`, `IN`, `NOT IN` 的使用场景及效率问题。 #### 一、Exists 和 Not Exists 的效率说明 **Exists** 和 **Not Exists** 子句通常用于检查子查询是否返回任何行,它们...
### SQL EXISTS 和 NOT EXISTS 的用法详解 在SQL查询中,`EXISTS`与`NOT EXISTS`是非常实用的子查询操作符,它们主要用于检测是否存在满足一定条件的数据行。相较于`IN`、`NOT IN`等操作,`EXISTS`与`NOT EXISTS`...
在SQL查询中,`EXISTS`和`NOT EXISTS`是两个非常重要的子查询操作符,它们主要用于判断子查询是否返回结果。本篇文章将详细介绍这两个关键字的用法,并通过实例进行解析。 首先,`EXISTS`的语法是:主查询中的条件...
在查询中,我们可以使用EXISTS和NOT EXISTS来代替IN和NOT IN。例如,我们要查询Sendorder表中的冗余数据(没有和reg_person或worksite相连的数据): ```sql select Sendorder.id, Sendorder.reads, Sendorder....
在 SQL 中,in 和 exists 的使用场景可以互换,但是在某些情况下,exists 的效率可能要高于 in。例如: ```sql SELECT ID, NAME FROM A WHERE ID IN (SELECT AID FROM B); ``` 这个查询将返回表 A 中所有与表 B 相...
在SQL查询中,`EXISTS` 和 `NOT EXISTS` 子句是两个非常重要的条件运算符,用于在数据检索时筛选满足特定条件的记录。它们主要用于子查询,帮助我们检查主查询的结果集是否存在匹配的子查询结果。让我们深入探讨这两...
### SQL Server 2005 EXISTS 使用方法详解 #### 一、EXISTS 子句概述 在 SQL Server 2005 中,`EXISTS` 是一个非常实用的子句,用于检查子查询是否返回至少一行数据。如果子查询返回至少一行数据,则 `EXISTS` ...
SQL EXISTS 的用法详解 EXISTS 是 SQL 中的一个子句,用于判断是否存在满足条件的记录。...EXISTS 和 NOT EXISTS 子句都是 SQL 中重要的查询工具,它们可以帮助我们实现复杂的查询操作和判断子查询的结果。
在SQL查询语言中,`NOT EXISTS`、`NOT IN` 和 `NOT NULL` 是三种用于排除特定条件的数据记录的方法。然而,在实际应用中,这三种语法有着不同的应用场景和执行逻辑,有时初学者可能会误以为它们是等效的,但实际上...
在SQL查询中,`NOT IN` 和 `NOT EXISTS` 是两种常见的用来排除特定记录的条件。虽然它们在很多情况下可以得到相同的结果,但在某些特定场景下,两者的行为可能会有所不同,这也是我们在编写SQL语句时需要注意的细节...
虽然`EXISTS`和`IN`、`NOT IN`在很多情况下可以互换使用,但它们在性能上可能存在差异。`EXISTS`通常在处理大量数据时表现更好,因为它一旦找到匹配的记录就会停止,而`IN`和`NOT IN`则会构建并检查一个值列表。对于...
在SQL Server中,`EXISTS` 和 `NOT EXISTS` 是两个非常重要的子查询操作符,它们用于检查子查询是否返回任何行。理解这两个操作符的用法对于编写高效的查询至关重要。 1. `EXISTS` 操作符: `EXISTS` 用于测试子...
MySQL优化之in,exists,not in,not exists的区别in与existsin查询过程结论:exists查询过程:结论:not in与not existsnot in查询过程:结论:not exists查询过程:结论: 首先我们使用两个用户表作为实例 insert ...
对于`IN`和`NOT IN`,应尽可能使用`JOIN`、`EXISTS`或结合空值判断的替代方法,以充分利用索引并减少不必要的计算步骤,从而提高查询速度和系统整体性能。在编写SQL时,不仅要考虑语句的可读性和简洁性,还要兼顾...
MySQL中的`NOT IN`, `LEFT JOIN`, `IS NULL`, 和 `NOT EXISTS` 是四种不同的SQL查询方式,它们在特定情况下可以实现相似的功能,但实际执行效率可能会有很大差异。本文主要探讨这四种方法在处理大数据量时的性能表现...