SQL中IN和EXISTS用法的区别啊?

kelly7717169 2009-07-15 10:34:28
请问2者具体有什么区别啊?要给出具体的例子和结果(说法已经晓得,但是没例子和结果还不是很明白,麻烦了),
不要说扫描方法不一样了,这个已经明白了~!!
麻烦各位大大了~!
...全文
28401 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
light_power 2011-12-24
  • 打赏
  • 举报
回复
原来是刷分的。feixianxxx有点悲剧
骑驴快跑 2011-09-08
  • 打赏
  • 举报
回复
帮顶 这个我也容易搞晕
WU-ZhiLe 2010-06-14
  • 打赏
  • 举报
回复
exists 还回的是一个Boolean 如果在后面的语句中有一条就返回一个TRUE.
i
CyberLogix 2010-05-19
  • 打赏
  • 举报
回复
不错,学习了

richardchar 2010-04-06
  • 打赏
  • 举报
回复
把用in 的地方都换成exist是不是性能会好
这样的话in 函数不是没有必要存在了么~
kelly7717169 2009-07-17
  • 打赏
  • 举报
回复
辛苦feixianxxx了,但njclsc的结果才是我最后想要的~!!
njclsc 2009-07-17
  • 打赏
  • 举报
回复
select DISTINCT MD001 from BOMMD WHERE NOT EXISTS (SELECT MC001 FROM BOMMC where BOMMC.MC001 = BOMMD.MD001)
Mr_Nice 2009-07-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 feixianxxx 的回复:]
SQL codein和existsin 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。
如果查询的两个表大小相当,那么用in和exists差别不大。

全文:
in和existsin 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。
如果查询的两个表大小相当,那么用in和exists差别不大。
如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:
例如:表A(小表),表B(大表)1:select*from Awhere ccin (select ccfrom B)
效率低,用到了A表上cc列的索引;select*from Awhereexists(select ccfrom Bwhere cc=A.cc)
效率高,用到了B表上cc列的索引。
相反的2:select*from Bwhere ccin (select ccfrom A)
效率高,用到了B表上cc列的索引;select*from Bwhereexists(select ccfrom Awhere cc=B.cc)
效率低,用到了A表上cc列的索引。notin 和not exists如果查询语句使用了notin 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。in 与=的区别select namefrom studentwhere namein ('zhang','wang','li','zhao');
与select namefrom studentwhere name='zhang'or name='li'or name='wang'or name='zhao'
的结果是相同的。
这是2着效率问题
[/Quote]


上述说的很棒了!
你要的是这个吧!
SELECT DISTINCT MD001 FROM BOMMD WHERE  NOT EXISTS (SELECT MC001 FROM BOMMC) 
playwarcraft 2009-07-17
  • 打赏
  • 举报
回复
理解为
in (一个结果集)

where ID in (1,2,3,4)

where ID in (select ID from T)

---------------------------
exists(true or false)
等待戈多12 2009-07-15
  • 打赏
  • 举报
回复
哦,语法上的区别就是:用IN后面的查询语句中,只能有一个表达式。
而EXISTS引入的子查询可以有多个表达式
fwacky 2009-07-15
  • 打赏
  • 举报
回复

/**上面的理论,挺好!
但是一般,是小数据就用,in
大数据量 用 exists

**/
feixianxxx 2009-07-15
  • 打赏
  • 举报
回复
in和exists
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。
如果查询的两个表大小相当,那么用in和exists差别不大。

全文:
in和exists
in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。
如果查询的两个表大小相当,那么用in和exists差别不大。
如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:
例如:表A(小表),表B(大表)1:select * from A where cc in (select cc from B)
效率低,用到了A表上cc列的索引;select * from A where exists(select cc from B where cc=A.cc)
效率高,用到了B表上cc列的索引。
相反的2:select * from B where cc in (select cc from A)
效率高,用到了B表上cc列的索引;select * from B where exists(select cc from A where cc=B.cc)
效率低,用到了A表上cc列的索引。
not in 和not exists如果查询语句使用了not in 那么内外表都进行全表扫描,没有用到索引;而not extsts 的子查询依然能用到表上的索引。所以无论那个表大,用not exists都比not in要快。
in 与 =的区别
select name from student where name in ('zhang','wang','li','zhao');

select name from student where name='zhang' or name='li' or name='wang' or name='zhao'
的结果是相同的。

这是2着效率问题
feixianxxx 2009-07-15
  • 打赏
  • 举报
回复
比较使用 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
appleller 2009-07-15
  • 打赏
  • 举报
回复
以前都习惯用IN,看来EXISTS也不错

34,836

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧