`
v5browser
  • 浏览: 1137377 次
社区版块
存档分类
最新评论

sql中 in 、not in 、exists、not exists 用法和差别

 
阅读更多

原帖不知道是那里出的,本人觉得这文章写得比较好,特转以备忘记

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 = )
-- ->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 in,exists,not in,not exists区别

    里面自己根据网上的资源整理出来的一份sql中in,exists,not in,not exists的使用方法以及注意事项等,有助于初学的朋友们借鉴。

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

    exists: 括号内子查询sql语句返回结果不为空(即:sql返回的结果为真),子查询的结果不为空这条件成立,执行...提醒:文章中提供了exists和not exists的常用示例,已经经过本人测试,文档中附有测试数据sql和用法sql。

    SQL中IN和EXISTS用法的区别

    如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。 SQL中IN和EXISTS用法的区别 NOT IN sql in与exists区别

    sql exists和not exists用法

    使用EXISTS(或NOT EXISTS)关键字引入一个子查询时,子查询实际上不产生任何数据;它只返回TRUE或FALS值。 指定一个子查询,检测行的存在。 如果子查询包含行,则返回 TRUE 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 ...

    sqlserver exists,not exists的用法

    exists,not exists的使用方法示例,需要的朋友可以参考下。

    MySQL中exists关键字和in的区别有那些? SQL语句优化有那些方法? 查询速度很慢应该怎么办?

    一、exists和in有何区别如下?  exists使用循环的方式,由outer表的记录数决定循环的次数,对于exists的影响最大,所以,外表的记录越小,子查询结果集较大时适用于exists; in 先执行子查询,子查询的结果返回去重...

    关于《数据库系统概论》第5版中not exists相关使用的理解及记录

    题目涉及《数据库系统概论》第5版,P130的第4题和P70的第6题,我这篇文章将“P70的第6题”的第5小题改用SQL中not exists来实现。 【题目】 设有一个SPJ数据库,包括S、P、J及SPJ 这4个关系模式: S(SNO, SNAME, ...

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

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

    where_exists:将SQL Exists的功能添加到ActiveRecord

    这个gem确实完成了两件事: 选择每个具有特定关联对象的模型对象选择没有任何关联对象的每个模型对象它使用SQL 来快速完成它,并使用where_exists和where_not_exists方法扩展ActiveRecord,以使其使用变得简单明了。...

    SQL21日自学通

    在选择语句中使用更新和删除275 在执行前测试选择语句276 嵌入型SQL277 静态SQL 与动态SQL277 使用SQL 来编程279 总结280 问与答280 校练场280 练习281 第14 天动态使用SQL 282 目标282 快速入门282 ODBC 282 ...

    mysql insert if not exists防止插入重复记录的方法

    MySQL 当记录不存在时插入(insert if not exists) 在 MySQL 中,插入(insert)一条记录很简单,但是一些特殊应用,在插入记录前,需要检查这条记录是否已经存在,只有当记录不存在时才执行插入操作,本文介绍的...

    经典SQL语句大全

    9、说明:in 的使用方法 select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’) 10、说明:两张关联表,删除主表中已经在副表中没有的信息 delete from table1 where not exists ( select * ...

    SQL语句集锦.rar

    工作中常用的SQL + 超复杂SQL ...not exists用法实例.txt ORACLE编程实用手册.doc patindex的用法.txt rename存储过程.txt replace.txt rowcount.txt rowcount精华.txt stuff.txt substring和rtrim.txt unionall.txt

    oracle的sql优化

    用Exist或Not Exists来代理In。In进行子查询效率很差。 5.SQL语句分析  通过SQLPLUS中的SET TRACE 功能对Sql语句的性能进行分析  通过Toad或PL/SQL Developer对语句的性能进行和索引的使用情况进行分析  对Oracle...

    精通sql结构化查询语句

    10.3.3 使用EXISTS子查询实现两表并集 10.3.4 使用NOT EXISTS的子查询 10.4 相关子查询 10.4.1 使用IN引入相关子查询 10.4.2 使用比较运算符引入相关子查询 10.4.3 在HAVING子句中使用相关子查询 10.5 UNIQUE子查询...

    sql精妙用法,希望能对大家有所帮助

    delete from info where not exists ( select * from infobz where info.infid=infobz.infid ) 说明:-- SQL: SELECT A.NUM, A.NAME, B.UPD_DATE, B.PREV_UPD_DATE FROM TABLE1, (SELECT X.NUM, X.UPD_DATE, Y....

    经典全面的SQL语句大全

     9、说明:in 的使用方法 select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)  10、说明:两张关联表,删除主表中已经在副表中没有的信息 delete from table1 where not exists ( select *...

Global site tag (gtag.js) - Google Analytics