自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

不要再犯SQL的這些常見(jiàn)錯(cuò)誤了!

數(shù)據(jù)庫(kù) SQL Server
SQL上手特別簡(jiǎn)單,在所有語(yǔ)言里算是簡(jiǎn)單的一種,甚至很多人不認(rèn)為它算得上編程語(yǔ)言。但是,不要被SQL的簡(jiǎn)單外表迷惑了,如果我們問(wèn)自己:多少次我嘗試從大數(shù)據(jù)抓取數(shù)據(jù),但是獲得了不完整或者錯(cuò)誤的數(shù)據(jù)?答案是:太多次了,連自己都數(shù)不清!

 SQL上手特別簡(jiǎn)單,在所有語(yǔ)言里算是簡(jiǎn)單的一種,甚至很多人不認(rèn)為它算得上編程語(yǔ)言。但是,不要被SQL的簡(jiǎn)單外表迷惑了,如果我們問(wèn)自己:多少次我嘗試從大數(shù)據(jù)抓取數(shù)據(jù),但是獲得了不完整或者錯(cuò)誤的數(shù)據(jù)?答案是:太多次了,連自己都數(shù)不清! 

[[358361]]

而正是因?yàn)镾QL代碼不輕易報(bào)錯(cuò)(通常只要語(yǔ)法正確,都會(huì)返回一些數(shù)據(jù),但未必是你本來(lái)想要的),我們反而需要花更多的精力去校對(duì),確保數(shù)據(jù)的準(zhǔn)確性。

以下,我們總結(jié)了最關(guān)鍵的5個(gè)SQL常見(jiàn)錯(cuò)誤,以儆效尤:

1. Queries語(yǔ)句的執(zhí)行順序

 

SQL的入門(mén)門(mén)檻很低。很多人認(rèn)為會(huì)使用Join, Group By 語(yǔ)句就可以自詡專(zhuān)家了。但是“磚家”們真的知道SQL語(yǔ)句的執(zhí)行順序嗎?

SQL查詢(xún)不是以SELECT開(kāi)始的,雖然我們編寫(xiě)代碼時(shí),它們?cè)诰庉嬈髦惺菑腟elect開(kāi)始編寫(xiě)的,但是實(shí)際執(zhí)行卻并不是從SELECT開(kāi)始的。

數(shù)據(jù)庫(kù)首先使用FROM和JOIN執(zhí)行查詢(xún),這就是為什么我們可以在WHERE中使用合并表中的值。

為什么我們不能在WHERE語(yǔ)句中篩選分組(GROUP BY) 的結(jié)果?因?yàn)镚ROUP BY在WHERE之后才會(huì)被執(zhí)行。因此,我們需要通過(guò)HAVING進(jìn)行更進(jìn)一步的條件篩選。

常規(guī)情況下,SELECT是最后執(zhí)行語(yǔ)句。它決定了查詢(xún)結(jié)果需要輸出哪些列,并進(jìn)行何種聚合運(yùn)算。此外,WINDOW FUNCTION 在這一步被執(zhí)行。

這就是為什么當(dāng)我們嘗試在WHERE中篩選WINDOW FUNCTION的結(jié)果時(shí)會(huì)出現(xiàn)錯(cuò)誤。

注意:數(shù)據(jù)庫(kù)使用查詢(xún)優(yōu)化器來(lái)優(yōu)化查詢(xún)語(yǔ)句執(zhí)行。優(yōu)化器可能會(huì)更改某些操作的順序,以便查詢(xún)運(yùn)行得更快。以上的介紹是正對(duì)常見(jiàn)情況下,對(duì)SQL執(zhí)行幕后所發(fā)生事情的籠統(tǒng)的概述。

2. WINDOW FUNCTION 是做什么的?

 

很多人第一次遇到WINDOW FUNCTION時(shí)都覺(jué)得它似乎很神秘。為什么使用Window function作為分組可以聚合數(shù)據(jù)?

Window Function (WF) 通過(guò)特定語(yǔ)句簡(jiǎn)化了許多操作步驟以方便語(yǔ)句運(yùn)行:

  • WF允許直接訪(fǎng)問(wèn)當(dāng)前記錄前后的數(shù)據(jù)。參見(jiàn)LEAD和LAG函數(shù)。
  • WF可以使用GROUP BY對(duì)已經(jīng)聚合的數(shù)據(jù)執(zhí)行額外的聚合。見(jiàn)上圖中的示例:使用WF計(jì)算移動(dòng)累計(jì)銷(xiāo)售額。
  • ROW_NUMBER 可以遍歷每一行。還可以用來(lái)刪除重復(fù)的記錄?;蛘呷∫粋€(gè)隨機(jī)樣本。
  • 顧名思義,WF可以計(jì)算給定窗口的統(tǒng)計(jì)信息:

 

上面的WF計(jì)算的就是從第一個(gè)記錄到當(dāng)前記錄的累計(jì)總和。

Window Function值得你去專(zhuān)門(mén)花時(shí)間學(xué)習(xí)一下基本原理,不然很可能會(huì)把查詢(xún)語(yǔ)句寫(xiě)得過(guò)于復(fù)雜以至于程序報(bào)錯(cuò)。

3. 利用CASE WHEN 計(jì)算平均值

CASE WHEN類(lèi)似于編程語(yǔ)言中的IF條件語(yǔ)句。當(dāng)我們需要對(duì)數(shù)據(jù)的某個(gè)子集計(jì)算統(tǒng)計(jì)信息時(shí),它的作用就顯現(xiàn)出來(lái)了。

 

上面的代碼計(jì)算了在美國(guó)銷(xiāo)售的產(chǎn)品的平均價(jià)格,但是這段代碼有一點(diǎn)小問(wèn)題,也就是對(duì)于Else的編寫(xiě)是有問(wèn)題的。

在第一個(gè)個(gè)語(yǔ)句中,這段代碼將所有非美國(guó)產(chǎn)品價(jià)格設(shè)為0,這降低了總體平均價(jià)格。如果有很多非美國(guó)產(chǎn)品,平均價(jià)格可能接近于0。

 

在第二個(gè)例子中,它只計(jì)算了在美國(guó)銷(xiāo)售的產(chǎn)品的平均價(jià)格,這才是我需要的結(jié)果。請(qǐng)注意在這里使用CASE時(shí)不需要包括ELSE,因?yàn)樗J(rèn)為NULL。

 

請(qǐng)注意在使用CASE語(yǔ)句時(shí),一定要小心使用“else 0”。它對(duì)SUM沒(méi)有任何影響,但是會(huì)對(duì)AVG平均計(jì)算產(chǎn)生巨大影響。

4. 對(duì)存在缺失值的列執(zhí)行JOIN語(yǔ)句

SQL中有4種不同的JOIN: Inner, Outer, Left和Right。當(dāng)我們?cè)诓樵?xún)中使用JOIN時(shí),它默認(rèn)為INNER JOIN。

 

雖然我對(duì)JOIN有一些研究學(xué)習(xí),但是我還是會(huì)犯一些小錯(cuò)誤。

如上圖所示執(zhí)行JOIN語(yǔ)句,結(jié)果顯示許多記錄都丟失了。為什么會(huì)這樣?明明是很簡(jiǎn)單的JOIN語(yǔ)句。

真是的原因其實(shí)是表1和表2中string_field列存在許多NULL值。通常人們會(huì)認(rèn)為JOIN會(huì)保留NULL的記錄因?yàn)镹ULL等于NULL,難道不是嗎?

然后我運(yùn)行如下語(yǔ)句:

 

 

 

 

結(jié)果返回的是NULL。

對(duì)于這種情況,為了不丟失有NULL的記錄,解決方法應(yīng)該是利用COALESCE,將string_field中的NULL轉(zhuǎn)換為空字符串。

 

但需要注意的是,這樣做會(huì)將表1中每個(gè)包含NULL的記錄與表2中每個(gè)包含NULL的記錄全部匹配起來(lái)。

通過(guò)使用ROW_NUMBER() 的 WINDOW FUNCTION,我們可以移除這些重復(fù)的匹配:

  • 假設(shè)該數(shù)據(jù)表對(duì)每一行都有唯一的標(biāo)識(shí)符“某某某ID”和一個(gè)時(shí)間戳字段。
  • 只需保留每個(gè)標(biāo)識(shí)符的第一行,這樣就可以刪除重復(fù)項(xiàng)。

 

5. 對(duì)于復(fù)雜的查詢(xún)語(yǔ)句不會(huì)使用臨時(shí)表

SQL另外一大優(yōu)點(diǎn)就是能夠調(diào)試糾錯(cuò)。

 

我們可以拆分復(fù)雜的查詢(xún)語(yǔ)句并創(chuàng)建多個(gè)臨時(shí)表。然后可以對(duì)這些表運(yùn)行“完整性檢查”,以確保它們包含正確的記錄。在設(shè)計(jì)一個(gè)全新且重要的查詢(xún)或報(bào)告時(shí),強(qiáng)烈推薦使用這種方法。

 

臨時(shí)表的唯一缺點(diǎn)是數(shù)據(jù)庫(kù)中的查詢(xún)優(yōu)化器無(wú)法優(yōu)化該查詢(xún)。

當(dāng)需要保證執(zhí)行效率時(shí),可以將創(chuàng)建臨時(shí)表的語(yǔ)句用with語(yǔ)句重新定義、查詢(xún)。

 

 

責(zé)任編輯:華軒 來(lái)源: MarTechCareer
相關(guān)推薦

2021-01-01 14:37:51

SQL數(shù)據(jù)庫(kù)語(yǔ)言

2024-07-05 08:37:33

2020-08-21 08:12:56

人工智能技術(shù)互聯(lián)網(wǎng)

2018-10-17 11:20:55

SQL數(shù)據(jù)庫(kù)程序員

2020-07-01 07:38:38

SQL數(shù)據(jù)庫(kù)程序員

2023-07-12 09:52:57

自動(dòng)駕駛模式

2017-11-02 15:42:32

開(kāi)發(fā)錯(cuò)誤代碼

2015-04-28 10:35:01

設(shè)計(jì)

2010-07-09 15:04:25

SQL Server

2011-03-28 14:59:53

SQL Server

2016-10-21 10:00:01

HTML標(biāo)簽WEB

2023-01-09 15:16:17

2019-05-31 15:10:33

SQL數(shù)據(jù)庫(kù)MySQL

2011-07-04 15:04:04

SQL Server

2018-08-28 10:36:01

5G高通華為

2015-08-19 14:11:56

SQL Server錯(cuò)誤處理

2024-09-24 07:57:55

SQL錯(cuò)誤??EXPLAIN?

2017-06-07 15:37:51

MySQLSQL性能優(yōu)化

2020-04-30 13:41:59

用戶(hù)輸入錯(cuò)誤Pythonkeyerror

2017-03-16 14:30:52

5G4G聯(lián)通
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)