MSSQL中的聯合查詢與視圖

2021-01-21 IT圈不亂

前面幾篇講到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是一門非常簡單的工具語言,用好了做查詢很方便的。

相關焦點

  • Visual Studio Code: 利用 MSSQL 插件創建資料庫 IDE
    除了已安裝的查詢執行引擎外,mssql 還在 VS Code 命令面板中添加了大量命令。最好先連接資料庫,儘管其他功能也會提示連接(如果尚未連接的話)。 按 F1(Ctrl/Command+Shift+P,如果使用的是不含功能鍵的有趣鍵盤之一的話)打開面板,鍵入「MS SQL」,篩選出所有 mssql 命令。
  • MSSQL用DISTINCT去除重複值,那怎麼查詢出重複值呢
    基本語法是【select distinct 列名稱 from 表名稱】當列名多個的時候這時 distinct 就作用於多列,也就是根據兩個欄位來聯合查重。這種作用於多列的查詢mssql和access都支持。作用於多列是不是根據兩列的值拼接後進行查重而是分別作用於兩列。那麼怎麼顯示這些重複的數據呢?
  • MSSQL-安全函數大全
    在mssql中有很多安全函數用來獲取系統或者服務中的安全信息。獲取安全證書的信息,很多操作程序上可能沒有權限但是mssql資料庫可能有權限獲取到或者更容易獲取到想要的額安全數據集,在安全性比較高的程序上有一些用戶自己創建的安全證書等安全信息都需要通過資料庫進行認證和對比這樣就需要安全函數來返回相應的結果來對比本次操作是否安全或者來確定本次操作是否合法。
  • 從mysql遷移到mssql需要哪些改變
    最近在項目中,初期使用的mysql作為資料庫,由於客戶方需要,將資料庫同時要兼容mssql,那麼在數據遷移過程中,有哪些是需要注意的呢?下載該軟體後,先創建項目,然後連接已知的mysql和mssql即可逐步完成轉換遷移。那麼重點來了,在java項目中,sql語句應該做如何改變呢?
  • php能連結到MSSQL 但讀取不到表的原因
    原因可能是:php對mssql的ntext類型的支持問題;今天弄了半天,明明可以連結到資料庫,卻不能讀取的數據。Google,百度一番之後終於知道了,原來是php讀取mssql的 ntext欄位反回值為空的,建議可以把ntext欄位改成 text。
  • MySQL視圖篇,視圖的優缺點以及如何創建視圖
    視圖,虛擬表,從一個表或多個表中導出來的表,作用和真實表一樣,包含一系列帶有行和列的數據 視圖中,用戶可以使用SELECT語句查詢數據,也可以使用INSERT,UPDATE,DELETE修改記錄,視圖可以使用戶操作方便,並保障資料庫系統安全優點及缺點優點
  • 怎麼修改Mysql數據表中的視圖
    本篇文章主要給大家介紹mysql數據表中怎麼進行修改視圖的操作。通俗的說,視圖是由SELECT語句組成的查詢定義的虛擬表,也就是由一張或多張表中的數據組成的。視圖就如同mysql基本表一樣,對表能夠進行的一般操作都可以應用於視圖,比如創建,查詢,插入,修改,刪除操作等。下面我們就結合簡單的示例給大家繼續介紹mysql視圖的修改操作。其實視圖的修改就相當於SQL語句的修改。首先我們可以通過cmd命令行工具連接mysql資料庫。
  • 數據查詢中,三個工作表聯合查詢的方法
    大家好,今日繼續講解VBA資料庫解決方案,今日的內容是第70講: 數據查詢中,三個工作表聯合查詢的方法。在各種查詢中,內連接,左外連接,右外連接等等,這些方法大家在工作中要多加利用,並且靈活利用,利用多了,知識就變成自己的了。今日我們講解的是三個工作表的聯合查詢,也就是說三個工作表的數據要一次查詢。我們還是看下面的實例講解。
  • MsSql中返回平均值函數AVG函數
    在實際需求中往往需要計算一下一組數字的平均值比如學生成績,報銷匯總平均值,mssql系統提供了函數avg來直接返回平均值,語法很簡單【select avg(列名) from 表名】其中列名不能為varchar等也就是不能是字符型數據類型。
  • PHP連接msSQL資料庫方法
    了解完mssql資料庫之後,我們經常見到的是PHP+mysql資料庫的組合,這個黃金搭檔是公認的最佳組合,我們今天不說它了,今天來說說PHP+mssql吧,作為程序猿來講,經常被各種需求轟炸,什麼需求都有,今天正好在做小型項目時發現PHP需要與mssql資料庫連接,第一感覺就是與mysql連接差不多,然後就下手開始了,但在我們的運行環境裡面
  • aspnet資料庫連接mssql配置(基礎入門6)
    內容回顧 在前兩講中,我們講到了連接資料庫,並向資料庫插入數據,我們在應用程式開發中,資料庫的操作必不可少,在B/S架構的程序中,大部分程序都是面向資料庫的開發,對資料庫進行增加、修改、刪除、查詢等操作。
  • 數據分析所需掌握的視圖用法,以及視圖所蘊含的分層思想
    視圖是資料庫中一個非常簡單的概念,寫過SQL的人幾乎大致了解視圖。本文除了在回顧視圖的本質及相關操作知識時,會重點闡述它蘊含的分層思想在數據分析工作中的作用。它的數據來源於SQL語句查詢中所使用的基本表,每次使用視圖時會動態生成最新的結果數據。
  • SQL基礎知識——VIEW視圖
    ,在隔離實體表的前提下還可以讓用戶查詢到需要的數據,可以起到保護底層數據的作用。視圖包含行和列,就像真正的表一樣。視圖中的欄位是一個或多個資料庫中真實表中的欄位。您可以添加 SQL 函數,在哪裡添加,並將語句連接到視圖,或者您可以呈現數據,就像數據來自單個表一樣。
  • ASP.NET Core WebAPI中利用EFCore為視圖View創建對應實體
    在EFCore中,利用Scaffold-DbContext命令創建資料庫表對應的實體類,但是卻無法為視圖View創建與之對應的實體,但是在有些應用場景中,由於視圖比較複雜,通過EFCore多表聯合查詢方式,無論是通過Join或者Include方式在操作上都不是很方便,接下來我們將研究為視圖View創建對應的實體類。
  • 使用HBMO選擇物化視圖(EI)
    為了縮短OLAP查詢處理時間,加快分析處理速度,人們開發了物化視圖、索引技術、查詢評估技術、查詢優化器等技術。本文主要研究如何使用物化視圖來減少OLAP查詢處理時間,從而減少分析過程中獲取信息的時間延遲。視圖是DW的一個或多個維度表的子集,由OLAP查詢定義,以便從中獲取某些必需的信息。它是從一個或多個大規模維度表中臨時計算的,並且由於大量昂貴的連接操作,計算非常昂貴。
  • 西瓜:資料庫的視圖,索引操作
    視圖概述視圖和表一樣,也包括幾個被定義的數據列和多個數據行,但就本質而言,這些數據列和數據行來源於視圖所引用的表,所以視圖不是真實存在的物理表,而是一張虛表。基於單表的視圖創建以後,可以通過視圖對源表數據進行添加、刪除、修改和查詢操作。
  • MySql基礎,MySql視圖&索引&存儲過程&觸發器
    行和列的數據來自於定義視圖的查詢中所使用的表,並且還是在使用視圖時動態生成的。資料庫中只存放了視圖的定義,並沒有存放視圖中的數據,這些數據都存放在定義視圖查詢所引用的真實表中。使用視圖查詢數據時,資料庫會從真實表中取出對應的數據。因此,視圖中的數據是依賴於真實表中的數據的。一旦真實表中的數據發生改變,顯示在視圖中的數據也會發生改變。
  • 使用Navicat Premium工具快速遷移數據方法 適用於mysql及mssql...
    前言:在工作中,經常遇到將mysql或mssql資料庫從其他伺服器轉移到新伺服器,一般常規操作方法是在原來資料庫處導出,然後在新的資料庫中導入,這種方法也是可以的,但數據會下載到本地進行中專,下面介紹不用將數據下載到本地中專方法。
  • 2D圖紙中視圖詳解,想要的投影視圖來了
    本文主要對零件2D圖紙中的投影視圖來進行闡述,在零件的2D圖紙製作過程中,會涉及到投影視角的選擇,不同的投影視角所投影出來的視圖存在差異,零件在製作過程中,若無3D數據指導,只有單純的2D圖紙,製作人員一定要熟知投影視角,根據投影視角的選擇來判別零件的形狀,從而避免零件製作過程中出現偏差
  • 我這麼久,才弄清楚mysql的觸發器、視圖、索引,受益匪淺
    drop {database | schema} [if exists] trigger_ name視圖視圖(View)是一個由查詢語句定義數據內容的表,表中的數據內容就是 SQL查詢語句的 結果集,行和列的數據均來自 SQL查詢語句中使用的數據表。