SQL 中查詢處理的邏輯順序
/*(8)*/ SELECT /*9*/ DISTINCT /*11*/ TOP
/*(1)*/ FROM
/*(3)*/ JOIN
/*(2)*/ ON
/*(4)*/ WHERE
/*(5)*/ GROUP BY
/*(6)*/ WITH {CUBE | ROLLUP}
/*(7)*/ HAVING
/*(10)*/ ORDER BY
/*(11)*/ LIMIT
處理查詢的順序和每個部分的描述。
VT 代表虛擬表,顯示了在處理查詢時如何生成各種資料
-
FROM:在 FROM 子句的前兩個表之間執行笛卡爾積(交叉連線),結果生成虛擬表 VT1。
-
ON:ON 濾波器應用於 VT1。只有 TRUE 的行插入 VT2。
-
OUTER(join)
:如果指定了 OUTER JOIN(而不是 CROSS JOIN 或 INNER JOIN),則保留的一個或多個未找到匹配項的表中的行將作為外行新增到 VT2 的行中,從而生成 VT3。如果 FROM 子句中出現兩個以上的表,則在最後一個連線的結果和 FROM 子句中的下一個表之間重複應用步驟 1 到步驟 3,直到處理完所有表。 -
WHERE:WHERE 過濾器應用於 VT3。只有 TRUE 的行插入 VT4。
-
GROUP BY:VT4 中的行根據 GROUP BY 子句中指定的列列表進行分組排列。生成 VT5。
-
CUBE | ROLLUP:超級組(組的組)被新增到 VT5 的行中,生成 VT6。
-
HAVING:HAVING 過濾器應用於 VT6。只有 TRUE 的組才會插入 VT7。
-
SELECT:處理 SELECT 列表,生成 VT8。
-
DISTINCT:從 VT8 中刪除重複的行。生成 VT9。
-
ORDER BY:VT9 中的行根據 ORDER BY 子句中指定的列列表進行排序。生成遊標(VC10)。
-
TOP:從 VC10 的開頭選擇指定的行數或百分比。生成表 VT11 並將其返回給呼叫者。LIMIT 在一些 SQL 方言中具有與 TOP 相同的功能,例如 Postgres 和 Netezza。