本節我們來看看有關查詢中UNION和UNION ALL的問題,簡短的内容,深入的了解,Always to review the basics。
首先我們過一遍二者的基本概念和使用方法,UNION和UNION ALL是将兩個表或者多個表進行JOIN,當然表的資料類型必須相同,對于UNION而言它會去除重複值,而UNION ALL則會傳回所有資料,這就是二者的差別和使用方法。下面我們來看一個簡單的例子。

上述我們稍微講解了下二者的基本使用,接下來我們來看看二者的性能比較。
我們首先建立兩個測試表Table1和Table2
在表Table1中插入如下測試資料
在表Table2中插入如下測試資料
我們查詢下兩個表插入的測試資料
接着分别利用UNION和UNION ALL來查詢資料比較二者性能開銷
此時我們能夠很明顯的看到因為UNION要去除重複是以會進行DISTINCT Sort操作使得其性能要低于UNION ALL。到這裡我們可以下個基本結論。
UNION VS UNION ALL性能分析結論:當使用UNION查詢語句時類似會進行SELECT DISTINCT操作,除非我們非常明确要傳回唯一不重複的值那就用UNION,否則使用UNION ALL會帶來更好的性能,傳回結果集更快。
是不是到此就完了呢,使用UNION和UNION ALL就這麼簡單麼,那你就太天真了,我們繼續往下看。
我們聲明一個表變量插入資料并利用UNION ALL來進行查詢
此時對應傳回合并結果集,恩,沒毛病,我們接下來看看UNION
此時毛病就出來了,說什麼資料類型text不可比,不能将其用作UNIN、INTERSERCT或EXCEPT等運算符的操作數,這是什麼意思,不太懂。在我們講解UNION和UNION ALL的性能問題時,我們已經标出UNION的查詢計劃,UNION會進行DISTINCT Sort操作,這說明什麼呢?實際上它内部會進行自動排序同時移除重複的資料,此時資料類型為TEXT是以無法對TEXT類型進行排序,換句話說UNION不支援TEXT類型。是以到這裡我們可以給出一個結論。
當利用UNION進行查詢時,如果查詢列中有TEXT資料類型時,此時會發生錯誤,因為UNION内部會自動對資料進行排序,而TEXT是無法進行排序的,是以UNION不支援TEXT資料類型。
好了到了這裡,我們才算是給出第一個需要注意的地方,下面我們再來看一個。
當我們對兩個表進行UNION ALL時,此時我們如果有這樣一個需求,需要使用UNION ALL前後的表是進行排序的,那麼此時我們應該如何做呢?下面我們建立測試表看看。
此時我們查詢上述Table1和Table2資料如下:
我們的需求是利用UNION ALL将Table1和Table2合并時,其順序分别是1,2,3和1,2,3。對于UNION查詢我們就不用讨論,内部會自行排序,如下則是利用UNION對資料進行排序的結果:
當我們進行UNION ALL時呢
顯然滿足不了我們的需求,在Table2表中的資料我們需要的是1,2,3。那麼我們對Table2中的ID進行ORDER BY結果會如何呢?
使用UNION ALL通過對Table2表上的ID進行ORDER BY此時得到的結果和上述UNION查詢的結果很類似,但是還是沒有得到我們的結果。上述對于兩個結果集進行合并後的排序也可以進行如下查詢:
對于查詢我們能夠自定義常量列,我們接下來添加一個額外的常量列,先對其常量列進行排序,然後對ID進行ORDER BY呢,結果又會是怎樣的呢?
到這裡算是基本完成我們的需求,貌似需要額外添加一個列,雖然效果不是太好。
本節我們詳細講了UNION和UNION ALL的使用以及需要注意的地方,最近時間比較充足,就馬不停蹄的一下子寫了很多篇,比較猛,都是一些基礎知識吧,下一節我們開始進入表表達式的學習,簡短的内容,深入的了解,我們下節再會。