仓酷云

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

[学习教程] MSSQL网页设计懂得一下NULLs如何影响IN和EXISTS

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

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

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

x
php本地模拟的prepare底层就是mysql_real_escape_string,所以必须得用mysql_set_character_set去设置mysql->charset,否则就存在字符集问题。假如你的数据库计划在任何一栏中都同意NULL值的话,你必要懂得一下,在你的查询语句中,分歧的子句是如何看待这一成绩的。
  
  从外表上看,大概显现出如许的情况,即SQL子句IN与EXISTS能够交换。但是,在处置NULL值时,它们的体现一模一样,并且失掉的了局也极可能分歧。成绩源于如许一个现实,即在一个Oracle数据库中,一个NULL值意味着未知,因而,对一个NULL值的任何对照或操纵也都是有效的,而任何前往NULL的测试也都被无视了。比方,以下这些查询语句都不会前往任何行:
  
  selecttruefromdualwhere1=null;
  
  selecttruefromdualwhere1!=null;
  
  值1既不克不及说是即是NULL,也不克不及说是不即是NULL。只要是NULL的时分才会前往一个真实的NULL值并前往一行。
  
  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管帐算行数,却无视子查询中的值,就算你前往NULL也一样。
  
  selecttruefromdualwhereexists(selectnullfromdual);
  
  selecttruefromdualwhereexists(select0fromdualwherenullisnull);
  
  从逻辑上看,IN与EXISTS是一样的。IN子句在内部查询中对照子查询前往的值,并过滤失落行;EXISTS子句在子查询外部对照那些值并过滤失落行。在呈现NULL值的情形下,作为了局而呈现的那些行是不异的。
  
  selectenamefromempwhereempnoin(selectmgrfromemp);
  
  selectenamefromempewhereexists(select0fromempwheremgr=e.empno);
  
  不外,当逻辑被变化成利用NOT IN和NOT EXISTS时,成绩就呈现了,这两个语句会前往分歧的行(第一个查询会前往0行;第二个前往意想的数据-它们是分歧的查询):
  
  selectenamefromempwhereempnonotin(selectmgrfromemp);
  
  selectenamefromempewherenotexists(select0fromempwheremgr=e.empno);
  
  NOT IN子句实践上与用=对照每个值不异,假如任何一个测试为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是NULL,因而对全部WHERE前提来讲都是毛病的。它们会如许运转:
  
  selecttruefromdualwhere1notin(2,3);
  
  selecttruefromdualwhere1!=2and1!=3;
  
  只需你在了局中制止体系前往NULL,在这之前你仍是可使用NOT IN查询(一样,这些都能运转,不外我假定empno不是NULL,在我们这个案例中,这是一个很好的假定):
  
  selectenamefromempwhereempnonotin(selectmgrfromempwheremgrisnotnull);
  
  selectenamefromempwhereempnonotin(selectnvl(mgr,0)fromemp);
  
  因为懂得了IN,EXISTS,NOT IN,和NOT EXISTS之间的不同,当一个子查询的数据中呈现NULL时,你就能够制止一个十分广泛的成绩了。这章描述如何检查和处理在MySQL数据库中的数据损坏。如果你的表损坏很多,你应该尝试找出其原因!见G.1调试一个MySQL服务器。
再见西城 该用户已被删除
沙发
发表于 2015-1-19 19:50:24 | 只看该作者
至于淘汰的问题,只能说在你的项目周期之内,微软应该都不会倒闭。
若天明 该用户已被删除
板凳
发表于 2015-1-28 10:13:35 | 只看该作者
如果你是从“学习某一种数据库应用软件,从而获得应聘的资本和工作机会”的角度来问的话。
飘灵儿 该用户已被删除
地板
发表于 2015-2-5 17:17:31 | 只看该作者
财务软件要用SQL也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的..
老尸 该用户已被删除
5#
发表于 2015-2-13 01:45:55 | 只看该作者
不过话说回来了,绝大多数的性能优化准则与对sqlserver存储的结构理解息息相关
小妖女 该用户已被删除
6#
发表于 2015-3-3 12:41:16 | 只看该作者
可以动态传入参数,省却了动态SQL的拼写。
海妖 该用户已被删除
7#
发表于 2015-3-11 11:03:04 | 只看该作者
从底层原理到表层引用,书籍多的很。个人认为没有什么那本书好?这样的说法。主要看和个人的学习方法是否适合。
山那边是海 该用户已被删除
8#
发表于 2015-3-18 07:34:03 | 只看该作者
可能有的朋友会抱怨集成的orderby,其实如果使用ranking函数,Orderby是少不了的。如果担心Orderby会影响效率,可以为orderby的字段建立聚集索引,查询计划会忽略orderby操作(因为本来就是排序的嘛)。
冷月葬花魂 该用户已被删除
9#
发表于 2015-3-25 13:22:31 | 只看该作者
至于淘汰的问题,只能说在你的项目周期之内,微软应该都不会倒闭。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-16 01:12

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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