MySQL 面試題:SQL
阿新 • • 發佈:2022-04-05
SQL 的邏輯執行順序
每個操作都會產生一張虛擬表,該虛擬表作為一個處理的輸入。這些虛擬表對使用者是透明的,只有最後一步生成的虛擬表才會返回給使用者。如果沒有在查詢中指定某一子句,則將跳過相應的步驟
具體分析查詢處理的各個階段:
- FROM:對 FROM 子句中的左表<left_table>和右表<right_table>執行笛卡兒積(Cartesianproduct),產生虛擬表 VT1
- ON:對虛擬表 VT1 應用 ON 篩選,只有那些符合<join_condition>的行才被插入虛擬表 VT2 中
- JOIN:如果指定了 OUTER JOIN(如 LEFT OUTER JOIN、RIGHT OUTER JOIN),那麼保留表中未匹配的行作為外部行新增到虛擬表 VT2 中,產生虛擬表 VT3。如果 FROM 子句包含兩個以上表,則對上一個連線生成的結果表 VT3 和下一個表重複執行步驟 1)~步驟 3),直到處理完所有的表為止
- WHERE:對虛擬表 VT3 應用 WHERE 過濾條件,只有符合<where_condition>的記錄才被插入虛擬表 VT4 中
- GROUP BY:根據 GROUP BY 子句中的列,對 VT4 中的記錄進行分組操作,產生 VT5
- CUBE|ROLLUP:對錶 VT5 進行 CUBE 或 ROLLUP 操作,產生表 VT6HAVING:對虛擬表 VT6 應用
- HAVING 過濾器,只有符合<having_condition>的記錄才被插入虛擬表 VT7 中。
- SELECT:第二次執行 SELECT 操作,選擇指定的列,插入到虛擬表 VT8 中
- DISTINCT:去除重複資料,產生虛擬表 VT9
- ORDER BY:將虛擬表 VT9 中的記錄按照<order_by_list>進行排序操作,產生虛擬表 VT10。11)11.
- LIMIT:取出指定行的記錄,產生虛擬表 VT11,並返回給查詢使用者