久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

SQL的常見錯誤有哪些

148次閱讀
沒有評論

共計 1977 個字符,預計需要花費 5 分鐘才能閱讀完成。

本篇內(nèi)容主要講解“SQL 的常見錯誤有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓丸趣 TV 小編來帶大家學習“SQL 的常見錯誤有哪些”吧!

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

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

SQL 查詢不是以 SELECT 開始的,雖然我們編寫代碼時,它們在編輯器中是從 Select 開始編寫的,但是實際執(zhí)行卻并不是從 SELECT 開始的。

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

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

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

這就是為什么當我們嘗試在 WHERE 中篩選 WINDOW FUNCTION 的結(jié)果時會出現(xiàn)錯誤。

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

2. WINDOW FUNCTION 是做什么的?

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

Window Function (WF) 通過特定語句簡化了許多操作步驟以方便語句運行:

WF 允許直接訪問當前記錄前后的數(shù)據(jù)。參見 LEAD 和 LAG 函數(shù)。

WF 可以使用 GROUP BY 對已經(jīng)聚合的數(shù)據(jù)執(zhí)行額外的聚合。見上圖中的示例:使用 WF 計算移動累計銷售額。

ROW_NUMBER 可以遍歷每一行。還可以用來刪除重復的記錄?;蛘呷∫粋€隨機樣本。

顧名思義,WF 可以計算給定窗口的統(tǒng)計信息:

上面的 WF 計算的就是從第一個記錄到當前記錄的累計總和。

Window Function 值得你去專門花時間學習一下基本原理,不然很可能會把查詢語句寫得過于復雜以至于程序報錯。

3. 利用 CASE WHEN 計算平均值

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

上面的代碼計算了在美國銷售的產(chǎn)品的平均價格,但是這段代碼有一點小問題,也就是對于 Else 的編寫是有問題的。

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

在第二個例子中,它只計算了在美國銷售的產(chǎn)品的平均價格,這才是我需要的結(jié)果。請注意在這里使用 CASE 時不需要包括 ELSE,因為它默認為 NULL。

請注意在使用 CASE 語句時,一定要小心使用“else 0”。它對 SUM 沒有任何影響,但是會對 AVG 平均計算產(chǎn)生巨大影響。

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

SQL 中有 4 種不同的 JOIN: Inner,  Outer, Left 和 Right。當我們在查詢中使用 JOIN 時,它默認為 INNER JOIN。

雖然我對 JOIN 有一些研究學習,但是我還是會犯一些小錯誤。

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

真是的原因其實是表 1 和表 2 中 string_field 列存在許多 NULL 值。通常人們會認為 JOIN 會保留 NULL 的記錄因為 NULL 等于 NULL,難道不是嗎?

然后我運行如下語句:

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

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

但需要注意的是,這樣做會將表 1 中每個包含 NULL 的記錄與表 2 中每個包含 NULL 的記錄全部匹配起來。

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

假設(shè)該數(shù)據(jù)表對每一行都有唯一的標識符“某某某 ID”和一個時間戳字段。

只需保留每個標識符的第一行,這樣就可以刪除重復項。

5. 對于復雜的查詢語句不會使用臨時表

SQL 的常見錯誤有哪些

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

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

SQL 的常見錯誤有哪些

臨時表的唯一缺點是數(shù)據(jù)庫中的查詢優(yōu)化器無法優(yōu)化該查詢。

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

SQL 的常見錯誤有哪些

到此,相信大家對“SQL 的常見錯誤有哪些”有了更深的了解,不妨來實際操作一番吧!這里是丸趣 TV 網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-07-27發(fā)表,共計1977字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 宜君县| 威海市| 南陵县| 旬邑县| 阜城县| 马鞍山市| 鹤山市| 同江市| 霞浦县| 阿巴嘎旗| 松溪县| 平谷区| 蓝山县| 如东县| 增城市| 麦盖提县| 大悟县| 兰州市| 湖口县| 沂水县| 龙州县| 昭苏县| 怀仁县| 乐安县| 广水市| 阳西县| 玉林市| 始兴县| 池州市| 柘城县| 砀山县| 卫辉市| 宣城市| 金华市| 农安县| 大化| 中方县| 广德县| 九龙县| 郧西县| 皋兰县|