|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
导致了一个使用几乎和mSQL一样的API接口的用于他们的数据库的新的SQL接口的产生,这样,这个API被设计成允许为用于mSQL而写的第三方代码更容易移植到MySQL。毛病初学SQL的日子,感到就像是刚学走路,步态可掬,跌跌撞撞。摔了很多好笑的跟头。拿出来人人文娱一下,也相互提个醒,如许的错我们能够只管制止的嘛。
先看这个:
例1分歧理的逗号:
SelectField1,Field2,Field3,FromMyTable
一实行就是个语法毛病,甚么意义嘛,这但是从书上抄的哎,你不克不及这么对我……呵呵呵,实在嘛,毛病在于我在最初一个字段名前面加了一个逗号。逗号是分开字段名或表名的嘛,字段名和Form之间加个逗号算甚么事?不要小视它,即便内行,也常出这个错,常常是由于这类情形:我们写了一个
SelectField1,
Field2,
Field3
FromMyTable
……
然后调试过程当中,我们大概会增删一些字段,特别是在From关头字后面增删字段时,常会弄失事来,忘了看是否是字段间都由逗号分开而且没有过剩的逗号,罕见是:
SelectField1,
Field2,
FromMyTable
……
大概
SelectField1,
Field2,
Field3
Field4
FromMyTable
……
Field3和Field4之间应有的逗号不见了,如果你写的是“Select……Field3as“XXX”Field4……”还好,体系会即刻发明这里有错,不让你经由过程语法反省。假如是像后面那样写就惨了,体系会觉得这是你给Field3起的别号哪,它会老厚道实地输入:
Field1Field2Field4
------------------------
…………………………
像我如许的年夜纰漏极可能会由于“没有错”就如许已往了,大概很奇异地找“我的Field3那边往了”?实在不见了的是Field4……
MCDBA课本中的SQL接纳了一种写法,初看很奇异,却能很无效地避免这类毛病:
SelectField1
,Field2
,Field3
FromMyTable
……
第一个字段后面有Select关头字,别的的字段后面全有逗号。这类写法不切合英语的作风,不外伴侣们能够尝尝,当你选中某一个字段(单行),或某几字段(多行),拖动它们,剪切、粘贴,修正,几近不会招致逗号毛病。由于常人的习气,调试过程当中最常改的就是最初几个字段。用这类写法,总能包管From和它后面的字段之间没有逗号,而每一个段之间都有逗号。固然Select和第一个字段之间有逗号这类毛病我也犯过(我犯过的错太多了),不外我的履历是这类毛病很简单就会被发明,不像后面提的那两种那末潜伏。固然它真的看起起来不顺,以是我到如今也总想不起这么写,以是我到如今仍是会偶然犯这个逗号毛病。值不值得,请读者本人选择吧。
例2言语成绩:
看看这一句,竟然也有错?
SelectField1,
Field2,
Field3
FromMyTable
是的,一切的逗号各就列位,并且这个语句云云复杂,其实没甚么可出错的中央啊?实在……Field2前面的谁人逗号是否是有点怪怪的?对了,它是其中文逗号,数据库引擎可不熟悉它。在其余场所里,大概犯这类错的时机还少一点,因为我们在数据库中大批的要和中文信息打交道,就会常常碰到这类事。不但是逗号,偶然我们大概写一些中文的别号,以是用来标识它的双引号也有错写成中文的伤害。在这方面,没甚么出格的技能,假如你只用这台呆板写代码,无妨把中文输出法设成英语标点(我毫不会,由于要写文章),另有就是必定要用半角数字,用全角数字写算式,体系可认不出来。
给人人一个对照太过的中文毛病:
Select Field1,
Field2,
Field3+1,
Field4as“中笔墨段名”
FromMytable
看看,中英文混排是否是挺可骇的?
“Form”毛病
这个对照复杂,就不举例了,就是一个拼写毛病。假如评SQL言语中最简单写错的关头字,From必定位居榜首。For和Form都是英语中很罕见的单词。我信任像我如许一写顺了就把From写成Form的一定另有。假如是在MicrosoftSQLServer的查询剖析器或InterBase的ISQL中,还比简单发明,由于From会被加粗或加蓝。不外我们常常要在客户端程序代码中嵌进SQL(好比Delphi编程),当时就对照简单出这个错了。就在明天日间写程序时,我还在JavaScript剧本中把一个“Form”写成了“From”,这回光想着SQL,又给写反了。对此真的没甚么好举措,当心再当心吧。
影子杀手――NULL值
有一个人为表,员工人为有两种,手艺人为和营业人为,每一个人依据岗亭,发个中一种。如今统计这月公司一共下发几钱,大概你会这么查:
SELECTSUM(手艺人为+营业人为)FROM人为表
而一回,了局是0。老板传闻这事会对照乐意,由于他这个月少了一笔年夜付出,可你却面对被同事围攻的伤害了。实在很复杂,你忘了NULL值。每一个人的人为都有一项是NULL,间接一加起来就是NULL,一统计一分钱没有。
此次不但是仔细的成绩了,NULL值是SQL言语,以致全部干系模子中最诡异的器材之一。它是甚么?它甚么也不是,它代表统统不成知的,未知的,不决义的器材。它不是0,更不是空格或空字符串。它不是信息,由于它不代表任何信息;但它也是信息,它告知我们这里没有信息。它是任何范例的数据,由于任何数据城市有NULL;它不是任何范例的数据,由于用任何数据何它对照都没成心义。《SQL-3参考年夜全》中如许评价:“这是不兴奋并且在数学上是分歧理的,可是是我们所失掉的。”这是一个会让内行也为之发狂的器材。它让我想起很小的时分读到的一本童话,说童话王国下在被“乌有”淹没。“乌有”是甚么?它甚么也不是,它没有色彩,没无形状,没有气息,它就是甚么也没有,在“乌有”中甚么也看不到,对,它没有色彩,可其实不代表它是黑的或通明的,“乌有”就是“乌有”,“乌有”并吞统统,甚么赶上“乌有”城市酿成“乌有”。这本书还神神叨叨地写了别的一年夜堆很认识流很哲学的器材。我事先读了这本书全部人都变得神神叨叨的,每天想一些存在啊,自我本我甚么的(当时我在上小学),乃至于厥后不当心当了程序员。厥后见到NULL值我才分明,本来那本书的作者必定是一个数据库程序员,弄欠好就是E.F.Codd自己。
NULL值是一个很可骇的器材,甚么和它运算城市酿成NULL,以是也别期望谁能和它比出巨细,连NULL值本人也不可,想晓得一个值是否是NULL不克不及用XXX=NULL,只能用XXXISNULL。做连接查询时,特别要当心NULL,连接有内联,有摆布外联,有全连接,有CrossJoin,就是这缘故原由。更不要提写一些数学表达式,必定要当心它,需要时必定要用一些办法制止NULL值,好比在计划数据库时,该有默许值的字段要设默许值,该请求用户必定输出的就设为NotNULL。良多数据库体系有公用的功效来处置NULL值,在这方面MSSQLServer做的还不错,有一些好比ISNULL()之类的函数,功效很周全,用起来也很便利。
关于NULL值,相对能够独自扩大出一个很风趣味的专题,可是它自己切实其实又是最常犯的手艺毛病,以是在这里必定要提。好比下面的毛病,有两种办法能够制止:要末把两项空资的默许值都设为0,要末就用:
SELECTSUM(手艺人为)+(营业人为)FROM人为表
如今,你平安了。
明天先到这里,今后无机会,我们还会持续会商一些更成心思,也更庞大的毛病,弄清它们,对我们的前进也是很有匡助的。
这能找出所有错误的99.99%。它不能找出的是仅仅涉及数据文件的损坏(这很不常见)。如果你想要检查一张表,你通常应该没有选项地运行myisamchk或用-s或--silent选项的任何一个。 |
|