仓酷云

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

[学习教程] MSSQL网站制作之SQL Story摘录(六)――――不成能的错...

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

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

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

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选项的任何一个。
飘飘悠悠 该用户已被删除
沙发
发表于 2015-1-18 18:09:45 | 只看该作者
呵呵,这就是偶想说的
兰色精灵 该用户已被删除
板凳
发表于 2015-1-22 20:22:00 | 只看该作者
比如,MicrosoftSQLServer2008的某一个版本可以满足现在的这个业务的需要,而且价格还比Oracle11g要便宜,那么这一产品就是适合的。
莫相离 该用户已被删除
地板
发表于 2015-1-31 11:31:12 | 只看该作者
只能告诉你,学好数据库语言和原理,多见识几种数据库软件,比一棵树上吊死要好。
冷月葬花魂 该用户已被删除
5#
发表于 2015-2-6 19:14:45 | 只看该作者
我是新手,正在学习数据库和操作系统,深感理论的泛广,唯有一步一步来,但是又感觉时间不够,收集了很多资料却总是没能认真的看完,希望有一个讨论板块,大家共同解决,共同分享,共同努力
分手快乐 该用户已被删除
6#
发表于 2015-2-18 09:02:03 | 只看该作者
对一张百万级别的表建游标,同时又没有什么过滤条件,取得游标效率是如果直接SQL查询百万条数据;如果再对每条记录做处理,耗时将更长。
若相依 该用户已被删除
7#
发表于 2015-3-6 04:01:09 | 只看该作者
如果我们从集合论(关系代数)的角度来看,一张数据库的表就是一组数据元的关系,而每个SQL语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表)。
山那边是海 该用户已被删除
8#
发表于 2015-3-12 20:20:48 | 只看该作者
光写几个SQL实在叫无知。
只想知道 该用户已被删除
9#
发表于 2015-3-20 02:27:36 | 只看该作者
比如,MicrosoftSQLServer2008的某一个版本可以满足现在的这个业务的需要,而且价格还比Oracle11g要便宜,那么这一产品就是适合的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-3-13 17:33

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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