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 代表虛擬表,顯示了在處理查詢時如何生成各種資料

  1. FROM:在 FROM 子句的前兩個表之間執行笛卡爾積(交叉連線),結果生成虛擬表 VT1。

  2. ON:ON 濾波器應用於 VT1。只有 TRUE 的行插入 VT2。

  3. OUTER(join):如果指定了 OUTER JOIN(而不是 CROSS JOIN 或 INNER JOIN),則保留的一個或多個未找到匹配項的表中的行將作為外行新增到 VT2 的行中,從而生成 VT3。如果 FROM 子句中出現兩個以上的表,則在最後一個連線的結果和 FROM 子句中的下一個表之間重複應用步驟 1 到步驟 3,直到處理完所有表。

  4. WHERE:WHERE 過濾器應用於 VT3。只有 TRUE 的行插入 VT4。

  5. GROUP BY:VT4 中的行根據 GROUP BY 子句中指定的列列表進行分組排列。生成 VT5。

  6. CUBE | ROLLUP:超級組(組的組)被新增到 VT5 的行中,生成 VT6。

  7. HAVING:HAVING 過濾器應用於 VT6。只有 TRUE 的組才會插入 VT7。

  8. SELECT:處理 SELECT 列表,生成 VT8。

  9. DISTINCT:從 VT8 中刪除重複的行。生成 VT9。

  10. ORDER BY:VT9 中的行根據 ORDER BY 子句中指定的列列表進行排序。生成遊標(VC10)。

  11. TOP:從 VC10 的開頭選擇指定的行數或百分比。生成表 VT11 並將其返回給呼叫者。LIMIT 在一些 SQL 方言中具有與 TOP 相同的功能,例如 Postgres 和 Netezza。