sql語句中各個部分函數執行的順序

首先分析一下SQL:html

SELECT TOP 10 * FROM student WHERE age>'20';

這條SQL語句是否能夠有下面兩種理解呢函數

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

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

  哪一個是正確的呢? 咱們很容易能肯定:(1)是正確的。對於這樣的簡單的語句,一眼就能看出來,但是對於稍微複雜一些的SQL語句或者更加複雜的SQL語句,有時咱們一眼就看不出來了,爲了可以正確分析SQL語句以及寫出正確的SQL語句,有必要了解一下SQL語句各部分的執行順序。blog

例如:排序

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語句的執行順序,而後進行講解:文檔

**(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

加粗的序號給出了執行的順序:get

(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語句也能夠按照上面的順序去讀,作到內心明白。 執行的順序圖片:

輸入圖片說明

博客信息: 本文檔的原文:http://www.cnblogs.com/wuguanglei/p/4198272.html

相關文章
相關標籤/搜索