當前位置: 妍妍網 > 碼農

圖解 SQL 執行順序,通俗易懂!

2024-04-25碼農

點選關註公眾號,Java幹貨 及時送達 👇

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

這是我們實際上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了。

    來源:blog.csdn.net/weixin_44141495/
    article/details/108744720/


    END


    看完本文有收獲?請轉發分享給更多人

    關註「Java編程鴨」,提升Java技能

    關註Java編程鴨微信公眾號,後台回復:碼農大禮包可以獲取最新整理的技術資料一份。涵蓋Java 框架學習、架構師學習等!

    文章有幫助的話,在看,轉發吧。

    謝謝支持喲 (*^__^*)