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

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

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

數據的關聯過程

數據庫中的兩張表

from&join&where

用於確定我們要查詢的表的範圍,涉及哪些表。另外,最新最全的 MySQL 面試題整理好了,微信搜索 Java 面試庫小程序在線刷題。

選擇一張表,然後用 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 之後的數據再合併數據。最新面試題整理好了,大家可以在 Java 面試庫小程序在線刷題。

order by

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

limit

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

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

原文鏈接:https://blog.csdn.net/weixin_44141495/article/details/108744720

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/k1Zjr6ucFZzI-w6wC2Hz3Q