SQL Select 撈取順序

資料庫 Database: SQL Select 撈取順序,要提升 SQL 撈取資料庫的效率,就要先理解 SQL 撈取的架構原理,再從原理去優化撈取的 SQL

基本 SQL 語法

SELECT DISTINCT column, AGG_FUNC(column_or_expression), 
FROM mytable
    JOIN another_table
      ON mytable.column = another_table.column
    WHERE constraint_expression
    GROUP BY column
    HAVING constraint_expression
    ORDER BY column ASC/DESC
    LIMIT count OFFSET COUNT;

SQL 執行順序

1 . FROM and JOINs

FROM 跟 JOIN 會有先執行,決定所有的資料集有哪些必須要查詢,包含所有的 Sub Query 及其產生的 暫存表(temporary tables)

2. WHERE

決定完所有資料範圍後,首先過濾 WHERE 限制的條件,判斷哪些欄位的資料符合限制條件,在請求執行 FROM 條件時,會直接透過 WHERE 條件限制去過濾請求的資料

有 Alias 的查詢子條件的 WHERE 限制條件無法馬上執行,因為子條件的資料必須要先撈出來才能夠在做外部的 WHERE 條件過濾

3. GROUP BY

在透過 WHERE 限制條件過濾完資料後,會將這些資料做 GROUP BY 群組運算,僅會留下唯一的欄位數值,當你需要整合這些資訊時,可以使用 GROUP BY 用在你的查詢 Query 中

4. HAVING

假如 Query 有 GROUP BY 的條件,可以使用 HAVING 條件去對 GROUP BY 後的資料去做查詢,使用 HAVING 條件過濾後將不符合條件的欄位資料丟棄,就像 WHERE 條件一樣

5. SELECT

任何的 SELECT 欄位會在這個步驟去執行

6. DISTINCT

剩餘的欄位資料,如果資料列的資料值有重複時,會被使用 DISTINCT 進行過濾,相同的資料將會被丟棄

7. ORDER BY

若有使用 ORDER BY 條件,資料列會透過指定欄位去進行排序,可以順向或逆向排序,因為要撈出的欄位已經被 SELECT 撈出來了,所以可以透過這些欄位去進行排序

8. LIMIT / OFFSET

最後,資料列會透過 LIMIT 及 OFFSET 條件撈出指定的資料範圍,然後將最後的資料列回傳輸出

Reference