25、Sql语句执行顺序
sql語句定義和執(zhí)行順序
摘自《MySQL技術(shù)內(nèi)幕:SQL編程》
sql語句定義的順序
(1) SELECT (2)DISTINCT<select_list> (3) FROM <left_table> (4) <join_type> JOIN <right_table> (5) ON <join_condition> (6) WHERE <where_condition> (7) GROUP BY <group_by_list> (8) WITH {CUBE|ROLLUP} (9) HAVING <having_condition> (10) ORDER BY <order_by_condition> (11) LIMIT <limit_number>sql語句執(zhí)行順序
(8) SELECT (9)DISTINCT<select_list> (1) FROM <left_table> (3) <join_type> JOIN <right_table> (2) ON <join_condition> (4) WHERE <where_condition> (5) GROUP BY <group_by_list> (6) WITH {CUBE|ROLLUP} (7) HAVING <having_condition> (10) ORDER BY <order_by_list> (11) LIMIT <limit_number>可以看到,一共有十一個(gè)步驟,最先執(zhí)行的是FROM操作,最后執(zhí)行的是LIMIT操作。每個(gè)操作都會(huì)產(chǎn)生一個(gè)虛擬表,該虛擬表作為一個(gè)處理的輸入,看下執(zhí)行順序:
(1) FROM:對(duì)FROM子句中的左表<left_table>和右表<right_table>執(zhí)行笛卡兒積,產(chǎn)生虛擬表VT1;
(2) ON: 對(duì)虛擬表VT1進(jìn)行ON篩選,只有那些符合<join_condition>的行才被插入虛擬表VT2;
(3) JOIN: 如果指定了OUTER JOIN(如LEFT OUTER JOIN、RIGHT OUTER JOIN),那么保留表中未匹配的行作為外部行添加到虛擬表VT2,產(chǎn)生虛擬表VT3。如果FROM子句包含兩個(gè)以上的表,則對(duì)上一個(gè)連接生成的結(jié)果表VT3和下一個(gè)表重復(fù)執(zhí)行步驟1~步驟3,直到處理完所有的表;
(4) WHERE: 對(duì)虛擬表VT3應(yīng)用WHERE過濾條件,只有符合<where_condition>的記錄才會(huì)被插入虛擬表VT4;
(5) GROUP By: 根據(jù)GROUP BY子句中的列,對(duì)VT4中的記錄進(jìn)行分組操作,產(chǎn)生VT5;
(6) CUBE|ROllUP: 對(duì)VT5進(jìn)行CUBE或ROLLUP操作,產(chǎn)生表VT6;
(7) HAVING: 對(duì)虛擬表VT6應(yīng)用HAVING過濾器,只有符合<having_condition>的記錄才會(huì)被插入到VT7;
(8) SELECT: 第二次執(zhí)行SELECT操作,選擇指定的列,插入到虛擬表VT8中;
(9) DISTINCT: 去除重復(fù),產(chǎn)生虛擬表VT9;
(10) ORDER BY: 將虛擬表VT9中的記錄按照<order_by_list>進(jìn)行排序操作,產(chǎn)生虛擬表VT10;
(11) LIMIT: 取出指定街行的記錄,產(chǎn)生虛擬表VT11,并返回給查詢用戶
總結(jié)
以上是生活随笔為你收集整理的25、Sql语句执行顺序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 6、删除视图(DORP VIEW)
- 下一篇: 2、创建视图(CREATE VIEW)