一文搞懂SQL執行順序

--

本文將揭示SQL查詢的執行過程,從解析查詢語句到實際資料關聯過程,逐步解讀每個步驟的作用與影響。

來源:Python大數據分析

這是一條標準的查詢語句:

這是我們實際上SQL執行順序:

  • 我們先執行from,join來確定表之間的連線關係,得到初步的資料
  • where對資料進行普通的初步的篩選
  • group by 分組
  • 各組分別執行having中的普通篩選或者聚合函式篩選。
  • 然後把再根據我們要的資料進行select,可以是普通欄位查詢也可以是獲取聚合函式的查詢結果,如果是集合函式,select的查詢結果會新增一條欄位
  • 將查詢結果去重distinct
  • 最後合併各組的查詢結果,按照order by的條件進行排序

資料的關聯過程

資料庫中的兩張表

from&join&where

用於確定我們要查詢的表的範圍,涉及哪些表。

選擇一張表,然後用join連線

from table1 join table2 on table1.id=table2.id

選擇多張表,用where做關聯條件

from table1,table2 where table1.id=table2.id

我們會得到滿足關聯條件的兩張表的資料,不加關聯條件會出現笛卡爾積。

group by

按照我們的分組條件,將資料進行分組,但是不會篩選資料。

比如我們按照即id的奇偶分組

having&where

having中可以是普通條件的篩選,也能是聚合函式。而where只能是普通函式,一般情況下,有having可以不寫where,把where的篩選放在having裡,SQL語句看上去更絲滑。

使用where再group by

先把不滿足where條件的資料刪除,再去分組

使用group by再having

先分組再刪除不滿足having條件的資料,這兩種方法有區別嗎,幾乎沒有!

舉個例子:

100/2=50,此時我們把100拆分 (10+10+10+10+10…)/2=5+5+5+…+5=50,只要篩選條件沒變,即便是分組了也得滿足篩選條件,所以where後group by 和group by再having是不影響結果的!

不同的是,having語法支援聚合函式,其實having的意思就是針對每組的條件進行篩選。我們之前看到了普通的篩選條件是不影響的,但是having還支援聚合函式,這是where無法實現的。

當前資料分組情況

執行having的篩選條件,可以使用聚合函式。篩選掉工資小於各組平均工資的 having salary<avg(salary)

select

分組結束之後,我們再執行select語句,因為聚合函式是依賴於分組的,聚合函式會單獨新增一個查詢出來的欄位,這裡用紫色表示,這裡我們兩個id重複了,我們就保留一個id,重複欄位名需要指向來自哪張表,否則會出現唯一性問題。最後按照使用者名稱去重。

select employee.id,distinct name,salary, avg(salary)

將各組having之後的資料再合併資料。

order by

最後我們執行order by 將資料按照一定順序排序,比如這裡按照id排序。如果此時有limit那麼查詢到相應的我們需要的記錄數時,就不繼續往下查了。

limit

記住limit是最後查詢的,為什麼呢?假如我們要查詢年級最小的三個資料,如果在排序之前就擷取到3個資料。實際上查詢出來的不是最小的三個資料而是前三個資料了,記住這一點。

我們如果limit 0,3竊取前三個資料再排序,實際上最少工資的是2000,3000,4000。你這裡只能是4000,5000,8000了。

※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※

我是「數據分析那些事」。常年分享數據分析乾貨,不定期分享好用的職場技能工具。各位也可以關注我的Facebook,按讚我的臉書並私訊「10」,送你十週入門數據分析電子書唷!期待你與我互動起來~

文章推薦

常用的幾個經典Python模組

都2023年了,為什麼資料孤島問題還沒解決!

MySQL常用指令碼

商業分析應該怎麼做?一篇文章把思維和工具說清楚了!

會員流入流出視覺化的最佳選擇,桑基圖!

回顧十週入門數據分析系列文:

關注數據君的臉書:

我是「數據分析那些事」。常年分享數據分析乾貨,不定期分享好用的職場技能工具。按贊我的臉書,會有豐富資料包贈送唷!

--

--

數據分析那些事
數據分析那些事

Written by 數據分析那些事

這是一個專注於數據分析職場的內容部落格,聚焦一批數據分析愛好者,在這裡,我會分享數據分析相關知識點推送、(工具/書籍)等推薦、職場心得、熱點資訊剖析以及資源大盤點,希望同樣熱愛數據的我們一同進步! 臉書會有更多互動喔:https://www.facebook.com/shujvfenxi/

No responses yet