完整的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 語句就將在這個數據源中按要求進行數據篩選,并丟棄不符合要求的數據行,所有的篩選column屬性 只能來自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層面更好的解決數據問題,而不用把問題 都拋給程序邏輯。