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