前面幾篇講到SQL資料庫的一些查詢的基本語句,今天分享一下聯合查詢與視圖,這些在實際項目中用的也很多,問題也不少。
一、聯合查詢: 關鍵詞Union 和 Union all
我們先看下會用到的2張表:TableA ,TableB
現在我們做幾個實驗:
(1)將TableA中的第一條和第三條記錄聯合顯示:
select * from TableA WHERE xh=1
union all
select * from TableA WHERE xh=3
結果如下:
(2)分別用union 和union all來聯合查詢,觀察遇到重複記錄時的處理結果:
select * from TableA WHERE xh=1
union
select * from TableA WHERE xh=1
select * from TableA WHERE xh=1
union all
select * from TableA WHERE xh=1
(3) 常見錯誤一:列數量不一致導致報錯
select xh,xm from TableA
union all
select xh,xm,sex from TableB
(4)常見錯誤二:列數據類型不一致導致報錯
select xh,xm, age from TableA
union all
select xh,xm,sex from TableB
總結:(1)使用union 和 union all 都可以達到聯合查詢的效果,將數據併集顯示,但是union在合併數據集時會自動去重,也就是只顯示不重複的數據,而union all則會原封不動的顯示所有數據,這點在做財務統計的時候一定要注意,用的不對就會導致差帳;
(2)union 和union all 在合併數據集的時候,要求待合併的集合欄位數量和欄位數據類型必須一樣,如果不一樣就會報錯,上面第4個例子中的錯誤,如果改成下面的語句,就不會報錯:
select xh,xm, convert(varchar(10),age) from TableA
union all
select xh,xm,sex from TableB
二、視圖:關鍵詞View
這個視圖其實在前面講資料庫對象的時候就已經提到了,它是由物理表構成的邏輯上的數據集,現在以TableC為例,進行以下實驗:
(1)創建視圖V_tc,欄位取TableC中的 gh,name,bm 三個欄位:
create view V_tc
as
select gh,name,bm from TableC
select * from V_tc
(2)使用update直接更新V_tc 視圖裡的記錄,查看結果:
update V_tc set name ='王一九' where gh='001'
select * from V_tc
(3)修改視圖,使用union all 語句關聯查詢出併集,並重複第(2)步中的操作:
alter view V_tc
as
select gh,name,bm from TableC where gh='001'
union all
select gh,name,bm from TableC where gh='002'
update V_tc set name ='王一九' where gh='001'
(4)將視圖的欄位加上表TableC中的yj ,並刷新視圖,觀察結果:
alter view V_tc
as
select gh,name,bm,yj from TableC where gh='001'
union all
select gh,name,bm,yj from TableC where gh='002'
sp_refreshview V_tc
select * from V_tc
總結:(1)創建視圖用create,修改視圖結構用alter, 這個在前面講資料庫對象的修改和創建時候講到了;
(2)當視圖是由單一數據集構成時,可以用update命令進行更新,更新操作會直接影響到組成視圖的物理表;但是當視圖裡是由多組數據集聯合表達的時候,那不允許直接update,必須更新底層的物理表;
(3)視圖裡面也可以使用union 和 union all,只要被聯合的數據集,同樣滿足欄位數量和數據類型一致的條件;且一般在變更完視圖的結構以後,必須用sp_refreshview去刷新下視圖。
最後,我們結合以上的兩個方面內容,將視圖V_tc修改一下,滿足日常統計上的需求,代碼如下(手機上看代碼可以左右拖動):
alter view V_tc
as
select * from TableC
union all
select '--','--' ,bm+'小計',sum(yj) from TableC group by bm
union all
select '--','--' , '總計',sum(yj) from TableC
select * from V_tc order by bm,gh
怎麼樣,是不是日常用到的統計報表就出來了? 其實MSSQL是一門非常簡單的工具語言,用好了做查詢很方便的。