in 和 exists 已经成为我们日常查询时候的常客了。很多时候他们2个都是可以互通实现的,但是,无论兄弟怎么亲,还是会有那么一些差别的。

先搞个测试表

CREATE TABLE #Tmp1(ID INT,Col1 NVARCHAR(50))

CREATE TABLE #Tmp2(ID INT,T1ID INT,Col1 NVARCHAR(50),Col2 NVARCHAR(50))

INSERT INTO #Tmp1
( ID, Col1 )
VALUES ( 1, N'AAA'),( 2, N'BBB'),( 3, N'CCC'),( 4, N'DDD') INSERT INTO #Tmp2
( ID, T1ID, Col1, Col2 )
VALUES  ( 1, 1, N'aa1',N'aa!!'),( 5, 1, N'aa2',N'vv!!'),( 6, 3, N'cc3',N'VV!!')

然后一般来说,查#Tmp1 的ID存在于#Tmp2里面的数据,以下2个语句都是等价的~

SELECT * FROM #Tmp1 a
WHERE EXISTS(SELECT * FROM #Tmp2 WHERE a.ID = T1ID) SELECT * FROM #Tmp1
WHERE ID IN (SELECT T1ID FROM #Tmp2) ID Col1
----------- --------------------------------------------------
1 AAA
3 CCC ID Col1
----------- --------------------------------------------------
1 AAA
3 CCC

看~查到的是一样的。然后现在要给点注意一点的地方了~

1、 使用exists 的时候因为exists后面跟的只是一个bool ,所以在exists() 括号里面跟在 select 和from之间,其实写什么都不重要,只要条件有结果返回,就OK。比方说

SELECT * FROM #Tmp1 a
WHERE EXISTS(SELECT NULL FROM #Tmp2 WHERE a.ID = T1ID) SELECT * FROM #Tmp1 a
WHERE EXISTS(SELECT * FROM #Tmp2 WHERE 1=0) ID Col1
----------- --------------------------------------------------
1 AAA
3 CCC ID Col1
----------- --------------------------------------------------

先看第二句,因为子查询里面是一个恒假的表达式,并不返回任何行数,所以,外部的查询结果一行都不会出来。这个好理解。

第一句即使你填的是select null 也没所谓,因为只要有结果集返回,就OK了,甚至改成

SELECT * FROM #Tmp1 a
WHERE EXISTS(SELECT null) ID Col1
----------- --------------------------------------------------
1 AAA
2 BBB
3 CCC
4 DDD
也全部返回了。为什么,因为子查询里面每一个都有一行 null 返回出来,那 exists()的判定就是真。所以每一行都会被返回。这个是要注意的。

2 使用 in 的注意事项。
使用 in 的注意事项最主要是在相关子查询上面,非相关子查询倒是没有什么要特别注意的。但是有一个原则

比方说将上面一个语句改成一个相关子查询,在子查询里面引用了#Tmp1 的ID,然后就变成以下的结果

SELECT * FROM #Tmp1 a
WHERE ID IN (SELECT T1ID FROM #Tmp2 WHERE a.ID = T1ID) ID Col1
----------- --------------------------------------------------
1 AAA
3 CCC

感知不明显是吧,再改动一下,以下这句在实际中并大部分情况并没有任何的意义,只是用于示例。

SELECT * FROM #Tmp1 a
WHERE ID IN (SELECT ID FROM #Tmp2 ) ID Col1
----------- --------------------------------------------------
1 AAA

看看这个语句,从执行结果来看,你可以知道是#Tmp2里面的ID,但有没有怀疑过是#Tmp1 自身的ID呢?能够引用吗?可以!!所以如以下栗子,有时候真会出现这种情况的哟~小心小心再小心哦~

SELECT * FROM #Tmp1 a
WHERE ID IN (SELECT a.ID FROM #Tmp2 ) ID Col1
----------- --------------------------------------------------
1 AAA
2 BBB
3 CCC
4 DDD

3、 使用 in  的时候,尤其注意一个值 Null  ! 可能在 in (select ID from XXX) 的时候感知不明显,然而在 not in (select ID from XXX) 的时候!假如 ID 有一个是 Null ~恭喜你~整个结果集都不会返回值啦~~这就是任何值和Null比对都会是unknow 的结果撸~~╮(╯_╰)╭ ~知道会出问题才要小心哦~

4、 效率与性能 ——很多文章都有说这个,在XXX地方用exists 比较好,在ZZZ地方用 in 比较好~我的观点是。即使是 XXX 的场景,也有 in 比 exists 效果好的地方!!一切要看实际哦~一定要测试~

额~大家应该都上班了~大家洗楼愉快~

今天说一下where 中 exists 和 in 里面的一些区别的更多相关文章

  1. SQL中EXISTS怎么用[转]

    SQL中EXISTS怎么用 1 2 3 4 分步阅读 EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False 方法/步骤 1 EXISTS用于 ...

  2. SQL中EXISTS和IN用法

    SQL中EXISTS的用法  指定一个子查询,检测行的存在. 语法:EXISTS subquery 参数:subquery 是一个受限的 SELECT 语句 (不允许有 COMPUTE 子句和 INT ...

  3. sql中exists和not exists的用法

    该文转载自:http://www.cnblogs.com/mytechblog/articles/2105785.html sql中exists,not exists的用法 exists : 强调的是 ...

  4. SQLServer中exists和except用法

    一.exists 1.1 说明 EXISTS(包括 NOT EXISTS)子句的返回值是一个BOOL值.EXISTS内部有一个子查询语句(SELECT ... FROM...),我将其称为EXIST的 ...

  5. 十、SQL中EXISTS的用法 十三、sql server not exists

    十.SQL中EXISTS的用法 EXISTS用于检查子查询是否至少会返回一行数据,该子查询实际上并不返回任何数据,而是返回值True或False EXISTS 指定一个子查询,检测 行 的存在. 语法 ...

  6. Mysql中EXISTS关键字用法、总结

    在做教务系统的时候,一个学生(alumni_info)有多个教育经历(alumni_education),使用的数据库是mysql,之前使用左链接查询的,发现数据量才只有几万条时,查询就很慢了,早上想 ...

  7. MySQL 中 EXISTS 的用法

    在MySQL中 EXISTS 和 IN 的用法有什么关系和区别呢? 假定数据库中有两个表 分别为 表 a 和表 b create table a ( a_id int, a_name varchar( ...

  8. 关于MySQL 中 EXISTS 的用法

    在MySQL中 EXISTS 和 IN 的用法有什么关系和区别呢? 假定数据库中有两个表 分别为 表 a 和表 b create table a ( a_id int, a_name varchar( ...

  9. sql 中 exists用法

    SQL中EXISTS的用法   比如在Northwind数据库中有一个查询为SELECT c.CustomerId,CompanyName FROM Customers cWHERE EXISTS(S ...

随机推荐

  1. Spring MVC静态资源处理(转)

    优雅REST风格的资源URL不希望带 .html 或 .do 等后缀.由于早期的Spring MVC不能很好地处理静态资源,所以在web.xml中配置DispatcherServlet的请求映射,往往 ...

  2. Scalaz(17)- Monad:泛函状态类型-State Monad

    我们经常提到函数式编程就是F[T].这个F可以被视为一种运算模式.我们是在F运算模式的壳子内对T进行计算.理论上来讲,函数式程序的运行状态也应该是在这个运算模式壳子内的,也是在F[]内更新的.那么我们 ...

  3. 《Java4Android》视频学习笔记——抽象类和抽象函数

    抽象函数的语法特征 1.类是抽象的,对象是具体的.面向对象里面有个非常重要的特征:先抽象,后具体. 2.只有函数的定义,而没有函数体的函数叫做抽象函数. abstract void fun(); ( ...

  4. MOSOS基础(转自树人云)

      发现 话题 · · · 登录 注册 MesosDocker 回顾Java 发展,看 Docker 与Mesos 演讲嘉宾数人云COO 谢乐冰在德国工作十年,回国后加入惠普电信运营商部门,拥有多年项 ...

  5. 常见.NET功能代码汇总

    1,在Web上修改指定文件位置的Web.config 这里需要使用 WebConfigurationManager 类,但必须使用WebConfigurationFileMap类来指定文件位置,看代码 ...

  6. imagesLoaded – 检测网页中的图片是否加载

    imagesLoaded 是一个用于来检测网页中的图片是否载入完成的 JavaScript 工具库.支持回调的获取图片加载的进度,还可以绑定自定义事件.可以结合 jQuery.RequireJS 使用 ...

  7. [js开源组件开发]localStorage-cache本地存储的缓存管理

    localStorage-cache本地存储的缓存管理 距离上次的组件开发有近三个月的时间了,最近一直在做一些杂事,无法静下心来写写代码,也是在学习emberjs,在emberjs中有一个很重要的东西 ...

  8. (转)高性能JavaScript:加载和运行(动态加载JS代码)

    浏览器是如何加载JS的 当浏览器遇到一个<script>标签时,浏览器首先根据标签src属性下载JavaScript代码,然后运行JavaScript代码,继而继续解析和翻译页面.如果需要 ...

  9. Web前端开发工具总结

    前端开发工具: web前端开发乃及其它的相关开发, 推荐sublime text, webstorm(jetbrains公司系列产品)这两个的原因在于,有个技术叫emmet, http://docs. ...

  10. Linux学习心得之 jnlp的文件和java应用程序安全设置

    作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 jnlp的文件和java应用程序安全设置 1.前言2. jnlp的文件打开3.java应用程 ...