`
kevin850115
  • 浏览: 65926 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

exists.not exists的用法及同in,not in的比较

阅读更多
表A
ID NAME
1 A1
2 A2
3 A3

表B
ID AID NAME
1 1 B1
2 2 B2
3 2 B3

表A和表B是一对多的关系 A.ID --> B.AID

Select ID , NAME FROM A Where EXISTS (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
分享到:
评论

相关推荐

    sql case when exists not exists in not in

    在SQL查询中,`CASE WHEN`、`EXISTS`、`NOT EXISTS`以及`IN`和`NOT IN`是常用的操作符,它们用于处理复杂的条件判断和数据筛选。这些概念对于理解和编写高效的SQL语句至关重要,尤其是在数据分析和数据库管理中。 `...

    sql in,exists,not in,not exists区别

    SQL 中 IN、EXISTS、NOT IN、NOT EXISTS 的区别 IN、EXISTS、NOT IN、NOT EXISTS 是 SQL 中四种常用的条件判断运算符,它们之间的区别主要体现在使用场景、执行效率和语法结构上。 IN IN 是一种条件判断运算符,...

    sql exists和not exists用法

    这是因为`IN`和`NOT IN`需要将主查询中的每一行都与子查询结果进行比较,而`EXISTS`和`NOT EXISTS`则只需判断子查询是否返回至少一行数据即可,无需获取所有数据行。 **性能对比:** - **IN 和 NOT IN**:需要将主...

    EXISTS_和_NOT_EXISTS

    - 效率:在某些情况下,`EXISTS` 和 `NOT EXISTS` 可能会提供相似的性能,但通常 `IN` 和 `NOT IN` 比较操作符在处理大量数据时更有效。然而,当涉及到子查询时,`EXISTS` 和 `NOT EXISTS` 可能更合适,因为它们只...

    exists SQL用法详解、exists和not exists的常用示例

    `EXISTS`和`IN`的区别在于,`IN`通常用于比较单个字段值,而`EXISTS`可以处理更复杂的查询,它关心的是子查询是否返回行,而不关心返回的具体值。`IN`通常用于获取特定值列表内的记录,而`EXISTS`则可以用于检查记录...

    exists用法说明.doc

    ### EXISTS与IN/NOT IN的比较 虽然`EXISTS`和`IN`、`NOT IN`在很多情况下可以互换使用,但它们在性能上可能存在差异。`EXISTS`通常在处理大量数据时表现更好,因为它一旦找到匹配的记录就会停止,而`IN`和`NOT IN`...

    MySQL中的in,exists,not in,not exists查询过程对比及结论

    MySQL优化之in,exists,not in,not exists的区别in与existsin查询过程结论:exists查询过程:结论:not in与not existsnot in查询过程:结论:not exists查询过程:结论: 首先我们使用两个用户表作为实例 insert ...

    SQL中exists的用法[借鉴].pdf

    NOT EXISTS 和 NOT IN 都可以用于判断子查询的结果,但是它们的使用场景不同。 NOT EXISTS 子句判断子查询是否不返回记录,而 NOT IN 子句判断子查询的结果是否不在某个集合中。 例如: `SELECT ID, NAME FROM A ...

    sqlserver exists,not exists的用法

    在实际应用中,`EXISTS` 常常与 `IN` 或 `NOT IN` 结合使用,来查询满足特定条件的记录。 例如,在给定的例子中,要查询选修了所有课程的学生,可以使用 `NOT EXISTS`: ```sql SELECT * FROM t_student ts ...

    oracle数据库关于exists使用

    ### Oracle数据库中Exists与In的使用详解 #### 一、Exists 的使用方法 在Oracle数据库中,`EXISTS` 是一种常用的子查询操作符,用于判断子查询是否有结果返回。如果子查询至少返回一行数据,则 `EXISTS` 表达式的...

    sql中exists的用法

    SQL 中 EXISTS 的用法简介 exists 是 SQL 中最常用的子查询操作符之一,用于检测子查询是否返回至少一个记录。exists 的使用场景非常广泛,包括对多表之间的关系进行查询、检测记录的存在性等。 在 SQL 中,exists...

    mysql exists与not exists实例详解

    在比较`NOT IN`和`NOT EXISTS`时,虽然两者都能达到类似的效果,但在某些情况下,`NOT EXISTS`的性能可能会优于`NOT IN`。当子查询返回大量数据或为空时,`NOT EXISTS`通常表现更好。这是因为`NOT EXISTS`通常能更好...

    搞懂mysql的exists

    3. 优先考虑`EXISTS`:在比较多个潜在查询方法时,`EXISTS`往往比其他方法(如`IN`、`NOT IN`)更快,特别是在大型数据集上。 六、实际应用示例 假设我们有两个表,`employees`和`departments`,我们想找出没有部门...

    function_exists函数详解

    ### function_exists() 函数详解 在PHP编程语言中,`function_exists()` 是一个非常实用的内置函数...通过上面的介绍,相信您已经掌握了 `function_exists()` 的基本用法及其应用场景,希望这对您的编程工作有所帮助。

    sql server2005 exists使用方法

    在这个例子中,我们首先定义了一个虚拟的 `contains` 操作,然后将其转换为 `NOT EXISTS` 和 `EXCEPT` 的组合。这种转换可以帮助理解多层嵌套 `EXISTS` 的逻辑,并可能提供更高效的实现方式。 #### 四、注意事项 ...

    mssql和sqlite中关于if not exists 的写法

    在sql语名中,if not exists 即如果不存在,if exists 即如果存在。 下面学习下二者的用法。 a,判断数据库不存在时 代码如下:if not exists(select * from sys.databases where name = ‘database_name’) b,...

    Oracle: minus | in | exists

    总结来说,`MINUS`、`IN` 和 `EXISTS`是Oracle SQL中非常实用的操作符,它们在数据查询和处理中起着关键作用。熟悉和掌握这些操作符能够帮助你编写出更高效、更灵活的SQL查询,从而提高数据库管理的效率。

Global site tag (gtag.js) - Google Analytics