国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

SQL Story摘錄(六)————不可能的錯誤

2024-07-21 02:09:04
字體:
來源:轉載
供稿:網友
 初學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 工資表

現在,你安全了。

今天先到這里,以后有機會,我們還會繼續討論一些更有意思,也更復雜的錯誤,搞清它們,對我們的進步也是很有幫助的。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 吴桥县| 绩溪县| 分宜县| 商水县| 西吉县| 陵水| 特克斯县| 桐庐县| 苏尼特右旗| 临邑县| 望江县| 曲麻莱县| 平罗县| 大城县| 固安县| 呼和浩特市| 马关县| 太原市| 郧西县| 湖南省| 精河县| 久治县| 古浪县| 县级市| 买车| 会宁县| 盈江县| 民权县| 大安市| 正定县| 新邵县| 洛浦县| 屏南县| 抚宁县| 安阳县| 西畴县| 垫江县| 江源县| 祁连县| 汉阴县| 玉屏|