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執行過程.
查詢執行順序
-
FROM 和 JOINs
FROM 或 JOIN會第一個執行,確定一個整體的資料範圍. 如果要JOIN不同表,可能會生成一個臨時Table來用於 下面的過程。總之第一步可以簡單理解為確定一個數據源表(含臨時表) -
WHERE
我們確定了資料來源 WHERE 語句就將在這個資料來源中按要求進行資料篩選,並丟棄不符合要求的資料行,所有的篩選col屬性 只能來自FROM圈定的表. AS別名還不能在這個階段使用,因為可能別名是一個還沒執行的表示式 -
GROUP BY
如果你用了 GROUP BY 分組,那GROUP BY 將對之前的資料進行分組,統計等,並將是結果集縮小為分組數.這意味著 其他的資料在分組後丟棄. -
HAVING
如果你用了 GROUP BY 分組, HAVING 會在分組完成後對結果集再次篩選。AS別名也不能在這個階段使用. -
SELECT
確定結果之後,SELECT用來對結果col簡單篩選或計算,決定輸出什麼資料. -
DISTINCT
如果資料行有重複DISTINCT 將負責排重. -
ORDER BY
在結果集確定的情況下,ORDER BY 對結果做排序。因為SELECT中的表示式已經執行完了。此時可以用AS別名. -
LIMIT / OFFSET
最後 LIMIT 和 OFFSET 從排序的結果中擷取部分資料.
結論
不是每一個SQL語句都要用到所有的句法,但靈活運用以上的句法組合和深刻理解SQL執行原理將能在SQL層面更好的解決資料問題,而不用把問題 都拋給程式邏輯.