1. 程式人生 > 資料庫 >SQL 查詢執行順序

SQL 查詢執行順序

轉自:

完整的SELECT查詢:

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的執行總是先從資料裡按條件選出資料,然後對這些資料再次做一些整理處理,按要求返回成結果,讓結果儘可能是簡單直接的。因為一個 查詢SQL由很多部分組成,所以搞清楚這些部分的執行順序還挺重要的,這有助於我們更深刻的理解SQL執行過程.

查詢執行順序

  1. FROM 和 JOINs
    FROM 或 JOIN會第一個執行,確定一個整體的資料範圍. 如果要JOIN不同表,可能會生成一個臨時Table來用於 下面的過程。總之第一步可以簡單理解為確定一個數據源表(含臨時表)

  2. WHERE
    我們確定了資料來源 WHERE 語句就將在這個資料來源中按要求進行資料篩選,並丟棄不符合要求的資料行,所有的篩選col屬性 只能來自FROM圈定的表. AS別名還不能在這個階段使用,因為可能別名是一個還沒執行的表示式

  3. GROUP BY
    如果你用了 GROUP BY 分組,那GROUP BY 將對之前的資料進行分組,統計等,並將是結果集縮小為分組數.這意味著 其他的資料在分組後丟棄.

  4. HAVING
    如果你用了 GROUP BY 分組, HAVING 會在分組完成後對結果集再次篩選。AS別名也不能在這個階段使用.

  5. SELECT
    確定結果之後,SELECT用來對結果col簡單篩選或計算,決定輸出什麼資料.

  6. DISTINCT
    如果資料行有重複DISTINCT 將負責排重.

  7. ORDER BY
    在結果集確定的情況下,ORDER BY 對結果做排序。因為SELECT中的表示式已經執行完了。此時可以用AS別名.

  8. LIMIT / OFFSET
    最後 LIMIT 和 OFFSET 從排序的結果中擷取部分資料.

結論
不是每一個SQL語句都要用到所有的句法,但靈活運用以上的句法組合和深刻理解SQL執行原理將能在SQL層面更好的解決資料問題,而不用把問題 都拋給程式邏輯.