http://www.tuicool.com/articles/fERNv2
下面先給出上面的SQL語(yǔ)句的執(zhí)行順序查描,然后進(jìn)行講解:
(8) select
(9) distinct
(11) top 1
(6) Table1.id,COUNT(Table1.name) as nameCount
(1) from Table1
(3) inner join Table2
(2) on Table1.id=Table2.id
(4) where Table1.id<4
(5) group by Table1.id
(7) having Table1.id<3
(10) order by Table1.id desc
前方序號(hào)給出了執(zhí)行的順序:
(1)from:對(duì)Table1和Table2執(zhí)行笛卡爾積丹诀,也就是兩個(gè)表的行的各種組合尺棋,共5*5=25行,生成虛擬表VT1
(2)on:選擇VT1中的那些Table1.id=Table2.id的所有行莽使,生成虛擬表VT2锐极。
(3)inner join:這里是內(nèi)部連接,直接就是VT2芳肌,如果是outer join灵再,如left join、right join亿笤、full join翎迁,那么還需要按照外部連接的規(guī)則,把VT1中沒有匹配的行添加到VT2净薛,生成VT3.
(4)where:選出VT3中Table1.id<4的表格汪榔,給虛擬表VT4.
(5)group by:按照Table1.id進(jìn)行分組。
(6)COUNT:執(zhí)行聚合函數(shù)肃拜,選出對(duì)應(yīng)Table1.id的行數(shù)痴腌,生成的結(jié)果給虛擬表VT5
(7)having:選擇VT5中Table1.id<3的所有結(jié)果,給虛擬表VT6
(8)select:選擇VT6中相應(yīng)的列爆班,給虛擬表VT7
(9)distinct:將VT7中重復(fù)的行去除衷掷,生成VT8
(10)order by:將VT8的結(jié)果按照Table1.id進(jìn)行排序, 這里沒有生成一個(gè)新的表VT9 柿菩,而是生成游標(biāo)VC9戚嗅。
(11)top:從游標(biāo)VC9的開始處選擇指定的行數(shù),這里是1行枢舶,生成虛擬表VT10.
經(jīng)過上面的過程懦胞,最終的SQL語(yǔ)句將VT10返回給用戶使用。