下文內(nèi)容主要給大家?guī)鞸QL執(zhí)行順序講析,這里所講到的知識,與書籍略有不同,都是創(chuàng)新互聯(lián)專業(yè)技術(shù)人員在與用戶接觸過程中,總結(jié)出來的,具有一定的經(jīng)驗分享價值,希望給廣大讀者帶來幫助。
創(chuàng)新互聯(lián)專注骨干網(wǎng)絡(luò)服務(wù)器租用十多年,服務(wù)更有保障!服務(wù)器租用,成都聯(lián)通服務(wù)器托管 成都服務(wù)器租用,成都服務(wù)器托管,骨干網(wǎng)絡(luò)帶寬,享受低延遲,高速訪問。靈活、實現(xiàn)低成本的共享或公網(wǎng)數(shù)據(jù)中心高速帶寬的專屬高性能服務(wù)器。
一、手寫SQL順序
selectfrom join on where group by having order by limit
二、MySQL執(zhí)行順序
fromon join where group by having select distinct order by limit
三、MySql執(zhí)行順序理解
第一步:加載from子句的前兩個表計算笛卡爾積,生成虛擬表vt1;
第二步:篩選關(guān)聯(lián)表符合on表達式的數(shù)據(jù),保留主表,生成虛擬表vt2;
第三步:如果使用的是外連接,執(zhí)行on的時候,會將主表中不符合on條件的數(shù)據(jù)也加載進來,做為外部行
第四步:如果from子句中的表數(shù)量大于2,則重復(fù)第一步到第三步,直至所有的表都加載完畢,更新vt3;
第五步:執(zhí)行where表達式,篩選掉不符合條件的數(shù)據(jù)生成vt4;
第六步:執(zhí)行g(shù)roup by子句。group by 子句執(zhí)行過后,會對子句組合成唯一值并且對每個唯一值只包含一行,生成vt5,。一旦執(zhí)行g(shù)roup by,后面的所有步驟只能得到vt5中的列(group by的子句包含的列)和聚合函數(shù)。
第七步:執(zhí)行聚合函數(shù),生成vt6;
第八步:執(zhí)行having表達式,篩選vt6中的數(shù)據(jù)。having是唯一一個在分組后的條件篩選,生成vt7;
第九步:從vt7中篩選列,生成vt8;
第十步:執(zhí)行distinct,對vt8去重,生成vt9。其實執(zhí)行過group by后就沒必要再去執(zhí)行distinct,因為分組后,每組只會有一條數(shù)據(jù),并且每條數(shù)據(jù)都不相同。
第十一步:對vt9進行排序,此處返回的不是一個虛擬表,而是一個游標(biāo),記錄了數(shù)據(jù)的排序順序,此處可以使用別名;
第十二步:執(zhí)行l(wèi)imit語句,將結(jié)果返回給客戶端
四、其他
1、on和where的區(qū)別?
簡單地說,當(dāng)有外關(guān)聯(lián)表時,on主要是針對外關(guān)聯(lián)表進行篩選,主表保留,當(dāng)沒有關(guān)聯(lián)表時,二者作用相同。
例如在左外連時,首先執(zhí)行on,篩選掉外連表中不符合on表達式的數(shù)據(jù),而where的篩選是對主表的篩選。
2、圖解
對于以上關(guān)于SQL執(zhí)行順序講析,如果大家還有更多需要了解的可以持續(xù)關(guān)注我們創(chuàng)新互聯(lián)的行業(yè)推新,如需獲取專業(yè)解答,可在官網(wǎng)聯(lián)系售前售后的,希望該文章可給大家?guī)硪欢ǖ闹R更新。