SQL Story摘录(六)————不可能的错误

SQL Story 专栏收录该内容
15 篇文章 0 订阅
  初学SQL的日子,感觉就像是刚学走路,步态可掬,跌跌撞撞。摔了不少可笑的跟头。拿出来大家娱乐一下,也互相提个醒,这样的错我们可以尽量避免的嘛。

先看这个:

例1 不合理的逗号:

Select Field1, Field2, Field3, From MyTable

一执行就是个语法错误,什么意思嘛,这可是从书上抄的哎,你不能这么对我……呵呵呵,其实嘛,错误在于我在最后一个字段名后面加了一个逗号。逗号是分隔字段名或表名的嘛,字段名和Form之间加个逗号算什么事?不要小看它,即使老手,也常出这个错,往往是因为这种情况:我们写了一个

Select Field1,

Field2,

Field3

From MyTable

……

然后调试过程中,我们可能会增删一些字段,尤其是在From关键字前面增删字段时,常会搞出事来,忘了看是不是字段间都由逗号分隔并且没有多余的逗号,常见是:

Select Field1,

Field2,

From MyTable

……

或者

Select Field1,

Field2,

Field3

Field4

From MyTable

……

Field3和Field4之间应有的逗号不见了,要是你写的是“Select ……Field3 as “XXX” Field4…… ”还好,系统会马上发现这里有错,不让你通过语法检查。如果是像前面那样写就惨了,系统会以为这是你给Field3起的别名哪,它会老老实实地输出:

Field1 Field2 Field4

------------------------

…………………………

像我这样的大马虎很可能会因为“没有错”就这样过去了,或者很奇怪地找“我的Field3那里去了”?其实不见了的是Field4……

MCDBA教材中的SQL采用了一种写法,初看很奇怪,却能很有效地防止这类错误:

Select Field1

,Field2

,Field3

From MyTable

……

第一个字段前面有Select关键字,其它的字段前面全有逗号。这种写法不符合英语的风格,不过朋友们可以试试,当你选中某一个字段(单行),或某几字段(多行),拖动它们,剪切、粘贴,修改,几乎不会导致逗号错误。因为一般人的习惯,调试过程中最常改的就是最后几个字段。用这种写法,总能保证From和它前面的字段之间没有逗号,而每个段之间都有逗号。当然Select 和第一个字段之间有逗号这种错误我也犯过(我犯过的错太多了),不过我的经验是这种错误很容易就会被发现,不像前面提的那两种那么隐蔽。当然它真的看起起来不顺,所以我到现在也总想不起这么写,所以我到现在还是会有时犯这个逗号错误。值不值得,请读者自己选择吧。

例2 语言问题:

看看这一句,居然也有错?

Select Field1,

Field2,

Field3

From MyTable

是的,所有的逗号各就各位,而且这个语句如此简单,实在没什么可犯错的地方啊?其实……Field2后面的那个逗号是不是有点怪怪的?对了,它是个中文逗号,数据库引擎可不认识它。在别的场合里,可能犯这种错的机会还少一点,由于我们在数据库中大量的要和中文信息打交道,就会经常遇到这种事。不只是逗号,有时我们可能写一些中文的别名,所以用来标识它的双引号也有错写成中文的危险。在这方面,没什么特别的技巧,如果你只用这台机器写代码,不妨把中文输入法设成英语标点(我绝不会,因为要写文章),还有就是一定要用半角数字,用全角数字写算式,系统可认不出来。

给大家一个比较过分的中文错误:

Select  Field1,

Field2,

Field3+1,

    Field4 as “中文字段名”

From Mytable

看看,中英文混排是不是挺可怕的?

“Form”错误

这个比较简单,就不举例了,就是一个拼写错误。如果评SQL语言中最容易写错的关键字,From 一定位居榜首。For和Form 都是英语中很常见的单词。我相信像我这样一写顺了就把From写成Form的肯定还有。如果是在Microsoft SQL Server的查询分析器或InterBase的ISQL中,还比容易发现,因为From会被加粗或加蓝。不过我们经常要在客户端程序代码中嵌入SQL(比如Delphi编程),那时就比较容易出这个错了。就在今天白天写程序时,我还在JavaScript脚本中把一个“Form”写成了“From”,这回光想着SQL,又给写反了。对此真的没什么好办法,小心再小心吧。

影子杀手——NULL值

有一个工资表,员工工资有两种,技术工资和业务工资,每个人根据岗位,发其中一种。现在统计这月公司一共下发多少钱,可能你会这么查:

SELECT SUM(技术工资+业务工资) FROM 工资表

而一回,结果是0。老板听说这事会比较高兴,因为他这个月少了一笔大支出,可你却面临被同事围攻的危险了。其实很简单,你忘了 NULL值。每个人的工资都有一项是NULL,直接一加起来就是NULL,一统计一分钱没有。

这次不只是细心的问题了,NULL值是SQL语言,乃至整个关系模型中最诡异的东西之一。它是什么?它什么也不是,它代表一切不可知的,未知的,未定义的东西。它不是0,更不是空格或空字符串。它不是信息,因为它不代表任何信息;但它也是信息,它告诉我们这里没有信息。它是任何类型的数据,因为任何数据都会有NULL;它不是任何类型的数据,因为用任何数据何它比较都没有意义。《SQL-3 参考大全》中这样评价:“这是不愉快而且在数学上是不合理的,但是是我们所得到的。”这是一个会让老手也为之发疯的东西。它让我想起很小的时候读到的一本童话,说童话王国下在被“乌有”吞没。“乌有”是什么?它什么也不是,它没有颜色,没有形状,没有气味,它就是什么也没有,在“乌有”中什么也看不到,对,它没有颜色,可并不代表它是黑的或透明的,“乌有”就是“乌有”,“乌有”侵吞一切,什么遇上“乌有”都会变成“乌有”。这本书还神神叨叨地写了其它一大堆很意识流很哲学的东西。我当时读了这本书整个人都变得神神叨叨的,天天想一些存在啊,自我本我什么的(那时我在上小学),以致于后来不小心当了程序员。后来见到NULL值我才明白,原来那本书的作者一定是一个数据库程序员,搞不好就是E.F.Codd本人。

NULL值是一个很可怕的东西,什么和它运算都会变成NULL,所以也别指望谁能和它比出大小,连NULL值自己也不行,想知道一个值是不是NULL不能用XXX=NULL,只能用XXX IS NULL。做联接查询时,尤其要小心NULL,联接有内联,有左右外联,有全联接,有Cross Join,就是这原因。更不要提写一些数学表达式,一定要小心它,必要时一定要用一些方法避免NULL值,比如在设计数据库时,该有默认值的字段要设默认值,该要求用户一定输入的就设为Not NULL。很多数据库系统有专用的功能来处理NULL值,在这方面MS SQL Server做的还不错,有一些比如ISNULL()之类的函数,功能很全面,用起来也很方便。

关于NULL值,绝对可以单独扩充出一个很有趣味的专题,但是它本身的确又是最常犯的技术错误,所以在这里一定要提。比如上面的错误,有两种方法可以避免:要么把两项空资的默认值都设为0,要么就用:

SELECT SUM(技术工资)+(业务工资) FROM 工资表

现在,你安全了。

今天先到这里,以后有机会,我们还会继续讨论一些更有意思,也更复杂的错误,搞清它们,对我们的进步也是很有帮助的。

展开阅读全文
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
<p> <span style="font-size:14px;color:#337FE5;">【为什么学爬虫?】</span> </p> <p> <span style="font-size:14px;">       1、爬虫入手容易,但是深入较难,如何写出高效率爬虫,如何写出灵活性高可扩展爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要数据,这门课程,你都能学到!</span> </p> <p> <span style="font-size:14px;">       2、如果是作为一个其他行业开发者,比如app开发,web开发,学习爬虫能让你加强对技术认知,能够开发出更加安全软件和网站</span> </p> <p> <br /> </p> <span style="font-size:14px;color:#337FE5;">【课程设计】</span> <p class="ql-long-10663260"> <span> </span> </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 一个完整爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 网络请求:模拟浏览器行为从网上抓取数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据解析:将请求下来数据进行过滤,提取我们想要数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据存储:将提取到数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 那么本课程也是按照这几个步骤循序渐进进行讲解,带领学生完整掌握每个步骤技术。另外,因为爬虫多样性,在爬取过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序灵活性,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。 </li> <li class="" style="font-size:11pt;color:#494949;"> Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 通过爬虫进阶知识点我们能应付大量反爬网站,而Scrapy框架作为一个专业爬虫框架,使用他可以快速提高我们编写爬虫程序效率和速度。另外如果一台机器能满足你需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。 </p> <p style="font-size:11pt;color:#494949;">   </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 从基础爬虫到商业化应用爬虫,本套课程满足您所有需求! </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> <br /> </p> <p> <br /> </p> <p> <span style="font-size:14px;background-color:#FFFFFF;color:#337FE5;">【课程服务】</span> </p> <p> <span style="font-size:14px;">专属付费社群+定期答疑</span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"><br /> </span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"></span> </p>
<div style="color:rgba(0,0,0,.75);"> <span style="color:#4d4d4d;"> </span> <div style="color:rgba(0,0,0,.75);"> <span style="color:#4d4d4d;"> </span> <div style="color:rgba(0,0,0,.75);"> <div style="color:rgba(0,0,0,.75);"> <span style="color:#4d4d4d;">当前课程中商城项目实战源码是我发布在 GitHub 上开源项目 newbee-mall 新蜂商城,目前已有 6300 多个 star,</span><span style="color:#4d4d4d;">本课程是一个 Spring Boot 技术栈实战类课程,课程共分为 3 大部分,前面两个部分为基础环境准备和相关概念介绍,第三个部分是 Spring Boot 商城项目功能讲解,让大家实际操作并实践上手一个大型线上商城项目,并学习到一定开发经验以及其中开发技巧。<br /> 商城项目所涉及功能结构图整理如下:<br /> </span> </div> <div style="color:rgba(0,0,0,.75);">   </div> <div style="color:rgba(0,0,0,.75);"> <p style="color:#4d4d4d;"> <img alt="modules" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3N0b3JlL25ld2JlZS1tYWxsLXMucG5n?x-oss-process=image/format,png" /> </p> </div> <p style="color:rgba(0,0,0,.75);"> <strong><span style="color:#e53333;">课程特色</span></strong> </p> <p style="color:rgba(0,0,0,.75);">   </p> <div style="color:rgba(0,0,0,.75);">   </div> <div style="color:rgba(0,0,0,.75);"> <ul> <li> 对新手开发者十分友好,无需复杂操作步骤,仅需 2 秒就可以启动这个完整商城项目 </li> <li> 最终实战项目是一个企业级别 Spring Boot 大型项目,对于各个阶段 Java 开发者都是极佳选择 </li> <li> 实践项目页面美观且实用,交互效果完美 </li> <li> 教程详细开发教程详细完整、文档资源齐全 </li> <li> 代码+讲解+演示网站全方位保证,向 Hello World 教程说拜拜 </li> <li> 技术栈新颖且知识点丰富,学习后可以提升大家对于知识理解和掌握,可以进一步提升你市场竞争力 </li> </ul> </div> <p style="color:rgba(0,0,0,.75);">   </p> <p style="color:rgba(0,0,0,.75);"> <span style="color:#e53333;">课程预览</span> </p> <p style="color:rgba(0,0,0,.75);">   </p> <div style="color:rgba(0,0,0,.75);">   </div> <div style="color:rgba(0,0,0,.75);"> <p style="color:#4d4d4d;"> 以下为商城项目页面和功能展示,分别为: </p> </div> <div style="color:rgba(0,0,0,.75);"> <ul> <li> 商城首页 1<br /> <img alt="" src="https://img-bss.csdnimg.cn/202103050347585499.gif" /> </li> <li> 商城首页 2<br /> <img alt="" src="https://img-bss.csdn.net/202005181054413605.png" /> </li> <li>   </li> <li> 购物车<br /> <img alt="cart" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3QvY2FydC5wbmc?x-oss-process=image/format,png" /> </li> <li> 订单结算<br /> <img alt="settle" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3Qvc2V0dGxlLnBuZw?x-oss-process=image/format,png" /> </li> <li> 订单列表<br /> <img alt="orders" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3Qvb3JkZXJzLnBuZw?x-oss-process=image/format,png" /> </li> <li> 支付页面<br /> <img alt="" src="https://img-bss.csdn.net/201909280301493716.jpg" /> </li> <li> 后台管理系统登录页<br /> <img alt="login" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3QvbWFuYWdlLWxvZ2luLnBuZw?x-oss-process=image/format,png" /> </li> <li> 商品管理<br /> <img alt="goods" src="https://imgconvert.csdnimg.cn/aHR0cHM6Ly9uZXdiZWUtbWFsbC5vc3MtY24tYmVpamluZy5hbGl5dW5jcy5jb20vcG9zdGVyL3Byb2R1Y3QvbWFuYWdlLWdvb2RzLnBuZw?x-oss-process=image/format,png" /> </li> <li> 商品编辑<br /> <img alt="" src="https://img-bss.csdnimg.cn/202103050348242799.png" /> </li> </ul> </div> </div> </div> </div>
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值