淺談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如下:
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語句也可以按照上面的順序去讀,做到心裡明白。
好了,囉囉嗦嗦說了這麼多,上個圖吧(真是奇醜無比),一圖勝千言,自己做個總結,也希望對大家有所幫助。
相關文章
- CoreData執行過程的sql語句SQL
- 剖析SQL語句的執行過程SQL
- Oracle SQL 語句的執行過程OracleSQL
- mysql執行sql語句過程MySql
- 一條sql語句的執行過程SQL
- 理解oracle執行sql語句的過程OracleSQL
- SQL語句執行過程詳解SQL
- sql語句執行過程小結SQL
- 10_SQL語句執行過程剖析SQL
- MySQL 查詢語句執行過程淺析MySql
- ORACLE sql 語句的執行過程(SQL效能調整)OracleSQL
- Oracle資料庫SQL語句執行過程Oracle資料庫SQL
- GaussDB SQL查詢語句執行過程解析SQL
- 在.NET中用儲存過程執行SQL語句儲存過程SQL
- Mybatis原始碼分析(五)探究SQL語句的執行過程MyBatis原始碼SQL
- MySQL探祕(二):SQL語句執行過程詳解MySql
- [20170703]SQL語句分析執行過程.txtSQL
- 通過分析SQL語句的執行計劃優化SQL語句SQL優化
- MySQL系列之一條SQL查詢語句的執行過程MySql
- PostgreSQL的insert語句執行過程分析SQL
- 查詢Oracle正在執行和執行過的SQL語句OracleSQL
- SQL語句的處理過程SQL
- sql語句如何執行的SQL
- 執行大的sql語句SQL
- MySQL SQL語句查詢執行過程的四個階段介紹MySql
- Entity Framework Code First執行SQL語句、檢視及儲存過程FrameworkSQL儲存過程
- sql語句批量執行SQL
- [zebra原始碼]分片語句ShardPreparedStatement執行過程原始碼
- SQL語句的處理過程修正SQL
- 由SQL語句執行過程觸發對Oracle體系結構的思考SQLOracle
- sql 執行過程SQL
- mysql的sql語句執行流程MySql
- SQL 語句的執行順序SQL
- 15個常用sql語句 分支 迴圈 子查詢 儲存過程 事務 常用函式 sql語句執行過程(轉載備用)SQL儲存過程函式
- 通過分析SQL語句的執行計劃優化SQL 二SQL優化
- 查詢正在執行的sql語句及該語句執行的時間SQL
- 一條SQL語句的優化過程SQL優化
- SQL語句執行順序SQL