成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

不要再犯SQL的這些常見錯誤了!

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

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

[[358361]]

而正是因為SQL代碼不輕易報錯(通常只要語法正確,都會返回一些數據,但未必是你本來想要的),我們反而需要花更多的精力去校對,確保數據的準確性。

以下,我們總結了最關鍵的5個SQL常見錯誤,以儆效尤:

1. Queries語句的執行順序

 

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

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

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

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

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

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

注意:數據庫使用查詢優化器來優化查詢語句執行。優化器可能會更改某些操作的順序,以便查詢運行得更快。以上的介紹是正對常見情況下,對SQL執行幕后所發生事情的籠統的概述。

2. WINDOW FUNCTION 是做什么的?

 

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

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

  • WF允許直接訪問當前記錄前后的數據。參見LEAD和LAG函數。
  • WF可以使用GROUP BY對已經聚合的數據執行額外的聚合。見上圖中的示例:使用WF計算移動累計銷售額。
  • ROW_NUMBER 可以遍歷每一行。還可以用來刪除重復的記錄。或者取一個隨機樣本。
  • 顧名思義,WF可以計算給定窗口的統計信息:

 

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

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

3. 利用CASE WHEN 計算平均值

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

 

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

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

 

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

 

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

4. 對存在缺失值的列執行JOIN語句

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

 

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

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

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

然后我運行如下語句:

 

 

 

 

結果返回的是NULL。

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

 

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

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

  • 假設該數據表對每一行都有唯一的標識符“某某某ID”和一個時間戳字段。
  • 只需保留每個標識符的第一行,這樣就可以刪除重復項。

 

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

SQL另外一大優點就是能夠調試糾錯。

 

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

 

臨時表的唯一缺點是數據庫中的查詢優化器無法優化該查詢。

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

 

 

責任編輯:華軒 來源: MarTechCareer
相關推薦

2021-01-01 14:37:51

SQL數據庫語言

2025-06-26 08:12:11

2024-07-05 08:37:33

2020-08-21 08:12:56

人工智能技術互聯網

2018-10-17 11:20:55

SQL數據庫程序員

2020-07-01 07:38:38

SQL數據庫程序員

2017-11-02 15:42:32

開發錯誤代碼

2023-07-12 09:52:57

自動駕駛模式

2015-04-28 10:35:01

設計

2010-07-09 15:04:25

SQL Server

2016-10-21 10:00:01

HTML標簽WEB

2018-08-28 10:36:01

5G高通華為

2019-05-31 15:10:33

SQL數據庫MySQL

2011-07-04 15:04:04

SQL Server

2023-01-09 15:16:17

2011-03-28 14:59:53

SQL Server

2020-04-30 13:41:59

用戶輸入錯誤Pythonkeyerror

2024-09-24 07:57:55

SQL錯誤??EXPLAIN?

2017-06-07 15:37:51

MySQLSQL性能優化

2015-08-19 14:11:56

SQL Server錯誤處理
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 男女下面一进一出网站 | 国产在线一区二区三区 | 成人免费视频观看 | 亚洲欧美日韩国产综合 | 特一级黄色毛片 | 免费观看成人性生生活片 | 亚洲电影第1页 | 1区2区3区视频 | 精品久久久久久久久久 | 中文字幕四虎 | 久久久久久高潮国产精品视 | 毛片软件 | 亚洲视频免费一区 | 亚洲婷婷一区 | 国产精品一区在线播放 | 亚洲成a人片 | 91精品久久| 天天综合网7799精品 | 天堂色 | h视频在线播放 | 欧美精品99 | 日本久久精品视频 | 青青操91 | 日韩欧美大片 | 亚洲精品福利视频 | 日韩免费视频一区二区 | 国产一区二区在线播放 | 特一级毛片 | 91传媒在线观看 | 国产成人在线视频免费观看 | 一区二区视频免费观看 | 日韩免费视频一区二区 | 国产一级免费视频 | 7777在线视频 | 亚洲精品专区 | 国产欧美日韩一区二区三区 | 日韩免费 | 亚洲精品丝袜日韩 | 欧美一级片在线看 | 日韩在线观看精品 | 91小视频在线 |