淺談SQL語句的執行過程

jopen 9年前發布 | 13K 次閱讀 SQL

寫在前面的話:有時不理解SQL語句各個部分執行順序,導致理解上出現偏差,或者是書寫SQL語句時隨心所欲,所以有必要了解一下sql語句的執行順序。可以有時間自己寫一個簡單的數據庫,理解會更加深入。下面就寫寫我的一些理解,以SQL SERVER2008為例,進行說明。

先看下面這條簡單SQL語句:

1 select 
2 top 10 *
3 from Student
4 where age>20

這條SQL語句是否可以有下面兩種理解呢

(1)先從Student表中選出age>20的數據,然后從這些數據中選擇前面的10條數據。

(2)先從Student表中選出前10條數據,然后從這些數據中選擇age>20的數據。

那么到底哪個是正確的呢?你可能會說,這還不容易,肯定是(1)是正確的。沒錯,對于這樣的簡單的語句,一眼就能看出來,可是對于稍微復雜一些的 SQL語句或者更加復雜的SQL語句,有時我們一眼就看不出來了,為了能夠正確分析SQL語句以及寫出正確的SQL語句,有必要了解一下SQL語句各部分 的執行順序。

好了,我們再看下面的一條SQL語句:

select 
distinct 
top 1
Table1.id,COUNT(Table1.name) as nameCount 
from Table1
inner join Table2
on Table1.id=Table2.id
where Table1.id<4 group by Table1.id having Table1.id<3 order by Table1.id desc

其中Table1和Table2就是我隨便建立的兩個非常簡單的表,為了講解方便,我也沒有弄一些跟實際相結合的表,要不還要理解業務邏輯,干脆越簡單越好,畢竟目的是為了說明SQL語句的執行順序,Table1和Table2如下:

淺談SQL語句的執行過程 淺談SQL語句的執行過程

Table1                                Table2

下面先給出上面的SQL語句的執行順序,然后進行講解:

(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

紅色序號給出了執行的順序:

(1)from:對Table1和Table2執行笛卡爾積,也就是兩個表的行的各種組合,共5*5=25行,生成虛擬表VT1

(2)on:選擇VT1中的那些Table1.id=Table2.id的所有行,生成虛擬表VT2。

(3)inner join:這里是內部連接,直接就是VT2,如果是outer join,如left join、right join、full join,那么還需要按照外部連接的規則,把VT1中沒有匹配的行添加到VT2,生成VT3.

(4)where:選出VT3中Table1.id<4的表格,給虛擬表VT4.

(5)group by:按照Table1.id進行分組。

(6)COUNT:執行聚合函數,選出對應Table1.id的行數,生成的結果給虛擬表VT5

(7)having:選擇VT5中Table1.id<3的所有結果,給虛擬表VT6

(8)select:選擇VT6中相應的列,給虛擬表VT7

(9)distinct:將VT7中重復的行去除,生成VT8

(10)order by:將VT8的結果按照Table1.id進行排序,這里沒有生成一個新的表VT9,而是生成游標VC9。

(11)top:從游標VC9的開始處選擇指定的行數,這里是1行,生成虛擬表VT10.

經過上面的過程,最終的SQL語句將VT10返回給用戶使用。

所以以后再寫SQL語句的時候,可以按照上面的順序寫SQL語句了,讀SQL語句也可以按照上面的順序去讀,做到心里明白。

好了,啰啰嗦嗦說了這么多,上個圖吧(真是奇丑無比),一圖勝千言,自己做個總結,也希望對大家有所幫助。

淺談SQL語句的執行過程
來源:吳廣磊的博客

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!