只想知道 发表于 2015-1-16 22:38:07

MSSQL网页设计懂得一下NULLs如何影响IN和EXISTS

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也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的..

老尸 发表于 2015-2-13 01:45:55

不过话说回来了,绝大多数的性能优化准则与对sqlserver存储的结构理解息息相关

小妖女 发表于 2015-3-3 12:41:16

可以动态传入参数,省却了动态SQL的拼写。

海妖 发表于 2015-3-11 11:03:04

从底层原理到表层引用,书籍多的很。个人认为没有什么那本书好?这样的说法。主要看和个人的学习方法是否适合。

山那边是海 发表于 2015-3-18 07:34:03

可能有的朋友会抱怨集成的orderby,其实如果使用ranking函数,Orderby是少不了的。如果担心Orderby会影响效率,可以为orderby的字段建立聚集索引,查询计划会忽略orderby操作(因为本来就是排序的嘛)。

冷月葬花魂 发表于 2015-3-25 13:22:31

至于淘汰的问题,只能说在你的项目周期之内,微软应该都不会倒闭。
页: [1]
查看完整版本: MSSQL网页设计懂得一下NULLs如何影响IN和EXISTS