大家好,我是寧一。
今天講解SQL教程第17課:SQL語句書寫順序與執(zhí)行順序。
SQL 語句的書寫順序與執(zhí)行順序不是一致的,我們通過這節(jié)課來搞清楚。
1、書寫順序
語句書寫順序很重要,順序不對會報錯的。
我們前面的課程已經(jīng)學過SELECT、WHERE、ORDER BY、LIMIT、JOIN、UNION、GROUP BY、HAVING語句用法。
如果這些語句在SQL中同時存在,書寫順序是這樣的:
SELECT FROM JOIN ON WHERE GROUP BY HAVING UNIONORDER BY LIMIT ;
看著比較復雜,不過我們不需要特意去背,多進行一些實戰(zhàn)練習,自然而然就記住了。
2、執(zhí)行順序
1.FORM:選擇from后面跟的表,產(chǎn)生虛擬表1。
2.ON:ON是JOIN的連接條件,符合連接條件的行會被記錄在虛擬表2中。
3.JOIN:如果指定了LEFT JOIN,那么保留表中未匹配的行就會作為外部行添加到虛擬表2中,產(chǎn)生虛擬表3。如果有多個JOIN鏈接,會重復執(zhí)行步驟1~3,直到處理完所有表。
4.WHERE:對虛擬表3進行WHERE條件過濾,符合條件的記錄會被插入到虛擬表4中。
5.GROUP BY:根據(jù)GROUP BY子句中的列,對虛擬表2中的記錄進行分組操作,產(chǎn)生虛擬表5。
6.HAVING:對虛擬表5進行HAVING過濾,符合條件的記錄會被插入到虛擬表6中。
7.SELECT:SELECT到一步才執(zhí)行,選擇指定的列,插入到虛擬表7中。
8.UNION:UNION連接的兩個SELECT查詢語句,會重復執(zhí)行步驟1~7,產(chǎn)生兩個虛擬表7,UNION會將這些記錄合并到虛擬表8中。
9.ORDER BY: 將虛擬表8中的記錄進行排序,虛擬表9。
10.LIMIT:取出指定行的記錄,返回結(jié)果集。
3、總結(jié):
書寫順序:SELECT -> FROM -> JOIN -> ON -> WHERE -> GROUP BY -> HAVING -> UNION -> ORDER BY ->LIMIT
執(zhí)行順序:FROM -> ON -> JOIN -> WHERE -> GROUP BY -> HAVING -> SELECT -> UNION -> ORDER BY ->LIMIT
4、需要注意的地方:
1.SELECT語句總是寫在最前面,但在大部分語句之后才執(zhí)行。所以在SQL語句中,我們不能在WHERE、GROUP BY、 HAVING語句中使用在 SELECT 中設定的別名。
但是MYSQL有個特性,在GROUP BY、 HAVING語句中,可以使用 SELECT 中設定的別名。這不是因為MYSQL中會提前執(zhí)行SELECT,而是因為在GROUP BY這一步返回了游標,大家了解一下就好。
2.無論是書寫順序,還是執(zhí)行順序,UNION 都是排在 ORDER BY 前面的。SQL語句會將所有UNION 段合并后,再進行排序。
我們本節(jié)課程總結(jié)了sql語句的書寫順序和執(zhí)行順序,理解這些有助于我們對sql語句進行優(yōu)化,提高我們的數(shù)據(jù)庫理解能力。建立我們后面編寫復雜SQL的基礎。
如果能掌握SQL語句書寫順序和執(zhí)行順序,那么恭喜你,已經(jīng)可以解決大部分的SQL問題了。
下節(jié)課我們會開始講子查詢,理解了這節(jié)課的內(nèi)容,后面編寫更復雜的SQL也就得心應手了~
點擊關注,更新課程第一時間通知哦~