仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 661|回复: 8
打印 上一主题 下一主题

[学习教程] MSSQL网站制作之了解NULL怎样影响IN和EXITS语句

[复制链接]
莫相离 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:36:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
根据Ambrose所说,Sakila来自一种叫SiSwati的斯威士兰方言,也是在Ambrose的家乡乌干达附近的坦桑尼亚的Arusha的一个小镇的名字。语句
从外表上看,IN和EXITS的SQL语句是可交换和等效的。但是,它们在处置UULL数据时会有很年夜的不同,并招致分歧的了局。成绩的本源是在一个Oracle数据库中,一个NULL值意味着未知变量,以是操纵NULL值的对照函数的了局也是一个未知变量,并且任何前往NULL的值一般也被疏忽。比方,以下查询都不会前往一行的值:

selecttruefromdualwhere1=null;

selecttruefromdualwhere1!=null;



只要ISNULL才干前往true,并前往一行:

selecttruefromdualwhere1isnull;

selecttruefromdualwherenullisnull;



当你选择利用IN,你将会告知SQL选择一个值并与别的每值比拟较。假如NULL值存在,将不会前往一行,即便两个都为NULL。

selecttruefromdualwherenullin(null);

selecttruefromdualwhere(null,null)in((null,null));

selecttruefromdualwhere(1,null)in((1,null));


一个IN语句在功效上相称于=ANY语句:

selecttruefromdualwherenull=ANY(null);

selecttruefromdualwhere(null,null)=ANY((null,null));

selecttruefromdualwhere(1,null)=ANY((1,null));



当你利用一个EXISTS等效情势的语句,SQL将管帐算一切行,并疏忽子查询中的值。


selecttruefromdualwhereexists(selectnullfromdual);

selecttruefromdualwhereexists(select0fromdualwherenullisnull);



IN和EXISTS在逻辑上是不异的。IN语句对照由子查询前往的值,并在输入查询中过滤某些行。EXISTS语句对照行的值,并在子查询中过滤某些行。关于NULL值的情形,行的了局是不异的。

selectenamefromempwhereempnoin(selectmgrfromemp);

selectenamefromempewhereexists(select0fromempwheremgr=e.empno);



但是当逻辑被逆向利用,即NOTIN及NOTEXISTS时,成绩就会发生:

selectenamefromempwhereempnonotin(selectmgrfromemp);

selectenamefromempewherenotexists(select0fromempwheremgr=

e.empno);



NOTIN语句本色上同等于利用=对照每值,假如测试为FALSE大概NULL,了局为对照失利。比方:

selecttruefromdualwhere1notin(null,2);

selecttruefromdualwhere1!=nulland1!=2;

selecttruefromdualwhere(1,2)notin((2,3),(2,null));

selecttruefromdualwhere(1,null)notin((1,2),(2,3));


这些查询不会前往任何一行。第二个查询语句更加分明,即1!=null,以是全部WHERE都为false。但是这些查询语句可变成:

selecttruefromdualwhere1notin(2,3);

selecttruefromdualwhere1!=2and1!=3;



你也能够利用NOTIN查询,只需你包管前往的值不会呈现NULL值:

selectenamefromempwhereempnonotin(selectmgrfromempwheremgrisnot

null);

selectenamefromempwhereempnonotin(selectnvl(mgr,0)fromemp);



经由过程了解IN,EXISTS,NOTIN,和NOTEXISTS之间的不同,当NULL呈现在任一子查询中时,你能够制止一些罕见的成绩。



ScottStephens已在Oracle公司事情年夜于13年之久,他的事情范畴包含手艺撑持,电子商务,市场开辟,和软件开辟。
因此我们的保存数据方法就是:在删除的动作开始之前,把表数据备份起来,然后留一个空表,在空表上执行“删除”操作。
因胸联盟 该用户已被删除
沙发
发表于 2015-1-19 18:14:12 | 只看该作者
对于数据库来说,查询是数据库的灵魂,那么SQL查询效率究竟效率如何呢?下文将带对SQL查询的相关问题进行讨论,供您参考。
admin 该用户已被删除
板凳
发表于 2015-1-24 15:26:02 | 只看该作者
你可以简单地认为适合的就是好,不适合就是不好。
爱飞 该用户已被删除
地板
发表于 2015-2-1 19:31:23 | 只看该作者
个人感觉没有case直观。而且默认的第三字段(还可能更多)作为groupby字段很容易造成新手的错误。
活着的死人 该用户已被删除
5#
发表于 2015-2-7 14:38:42 | 只看该作者
同样会为索引视图等应用带来麻烦。看看行级和事务级的快照数据放在tempdb中,就能感觉到目前架构的尴尬。
愤怒的大鸟 该用户已被删除
6#
发表于 2015-2-22 08:20:52 | 只看该作者
所以你总能得到相应的升级版本,来满足你的需求。
莫相离 该用户已被删除
7#
 楼主| 发表于 2015-3-6 23:44:31 | 只看该作者
如安全管理、备份恢复、性能监控和调优等,SQL只要熟悉基本操作就可以,只要程序设计部分只要稍加了解即可(如存储过程、触发器等)。
飘灵儿 该用户已被删除
8#
发表于 2015-3-13 22:43:22 | 只看该作者
发几份SQL课件,以飨阅者
精灵巫婆 该用户已被删除
9#
发表于 2015-3-20 21:02:18 | 只看该作者
多加的系统视图和实时系统信息这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 04:26

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表