mysql視圖和臨時表的區別


視圖

視圖是由從數據庫的基本表中選出來的數據組成的邏輯窗口,它與基本表不同的是,視圖是一個虛表。數據庫中只存放視圖的定義,而不存放視圖包含的數據,這些數據仍存放在原來的基表中。所以基表中的數據如果發生改變,從視圖中查詢出的數據也隨之改變。

視圖是一個虛表,他是通過執行SQL查詢所產生的。視圖以select命名存儲於數據字典當中。每當SQL查詢包含有視圖名稱的時候,數據庫管理系統會執行在視圖定義當中所包含的查詢,以建立其虛擬結果表。該結果表可以當做查詢其余部分的源表使用。

視圖可以是建立在一個或多個表上,也可以建立在視圖上,但是不管怎么樣對視圖數據的操作最終都會轉換為對基本表的操作,因為視圖是一個虛表,數據實際上保存在基本表中

臨時表

臨時表與永久表相似,但臨時表存儲在 tempdb 中,當不再使用時會自動刪除。 

 臨時表有兩種類型:本地和全局。它們在名稱、可見性以及可用性上有區別。本地臨時表的名稱以單個數字符號 (#) 打頭;它們僅對當前的用戶連接是可見的;當用戶從 SQL Server 實例斷開連接時被刪除。全局臨時表的名稱以兩個數字符號 (##) 打頭,創建后對任何用戶都是可見的,當所有引用該表的用戶從 SQL Server 斷開連接時被刪除。

臨時表是建立在系統臨時文件夾中的表,如果使用得當,完全可以像普通表一樣進行各種操作,在VFP退出時自動被釋放。

臨時表是一種並不存儲在數據庫當中的基表。與之相反的是,臨時表只存在於創建該臨時表的數據庫會話被激活的情況下。

臨時表存儲在數據庫會話中,不在數據庫中,當使用show tables 時沒有顯示,但是可以查詢,當關閉數據庫(quit,exit)然后在打開在去數據庫中查詢的時候就不存在了。

視圖和臨時表的區別

1、視圖只存在於單個查詢當中,每次使用該視圖名,其虛擬表就會根據現有的數據重新被創建。 2、臨時表存在於它被創建的整個數據庫會話過程中。 3、視圖自動使用其所定義的查詢檢索出來的數據進行填充。 4、必須使用SQLINSERT命令來向臨時表添加數據。 5、只有那些符合視圖可更新能力標准的視圖才可用於數據修改。當使用視圖進行更新時,該更新會永久被傳遞至底層基表上。 6、由於臨時表都是基表,因此所有的臨時表都是可更新的。不過,這些更新對於這些表來說是臨時性的。 7、由於視圖的內容是在該視圖每次被使用的時候才生成,因此視圖當中的數據幾乎每次都是最新的。 8、臨時表當中的數據所反應的是數據庫在該表被裝載進數據庫時的狀態。如果臨時表所裝載的源表中的數據在臨時表檢索這些數據之后發生了改變,那么臨時表當中的內容有可能與數據庫當中的其他部分的數據脫離同步狀態。

優缺點

1、由於視圖的內容是在該視圖每次被使用的時候才生成,所以數據和數據庫中的數據是同步的,但是在每次查詢的時候都要建立視圖表結構,所以比較浪費時間。 2、臨時表僅需創建一次,所以相比視圖每次都創建視圖結構,節省了大量時間,但是臨時表的數據在數據源發生改變是沒有進行更新的話,就會出現數據不同步現象。 3、簡化數據查詢語句——定義視圖可以將表與表之間的復雜的連接操作和搜索條件對用戶影藏起來,用戶只需簡單的對一個視圖進行查詢即可。 4、使用戶能從多角度看待同一數據。 5、提高了數據的安全性———在建立視圖的時候可以吧敏感的數據影藏起來,而吧需要的數據暴露給客戶這樣的話比較安全。 6、提供了一定程度的邏輯獨立性——數據庫中是三級模式兩級映射,三級模式是 外模式、模式、內模式而這里的視圖就是外模式,這樣就提供了數據的邏輯獨立性。

什么時候使用視圖呢?

應用場景1:保密工作,比如有一個員工工資表,如果你只希望財務看到員工工資這個字段,而其他人不能看到工資字段,那就用一個視圖,把工資這個敏感字段過濾掉

應用場景2:有一個查詢語句非常復雜,大概有100行這么多,有時還想把這個巨大無比的select語句和其他表關聯起來得到結果,寫太多很麻煩,可以用一個視圖來代替這100行的select語句,充當一個變量角色

什么時候用臨時表呢?

應用場景1:你在短期內有很多DML操作,比如京東淘寶亞馬遜的購物車表,把東西放購物車(insert),變更數量(update),刪除商品(delete),一旦結算金錢后,這些數據就要清掉,這時需要用臨時表

應用場景2:在導出數據時,你可能不想導完整的數據庫,或者表,你可能只想要導出符合某些條件的數據,那么你可以創建臨時表,把select語句插入到臨時表,接着導出這個臨時表,導完以后通過結束session或者事務的方式,讓這些沒用的數據自動清理掉

應用場景3:你在寫存儲過程時,有很多的連接,比如你需要連接A,B,C,D,E,F,G,H那么多張表,才能得到你的結果表,同時做連接的消耗太大,你可以先A,B,C連接的結果,放在臨時表,接着再把這張臨時表,跟D,E,F連接,作為新的結果放在臨時表,接着再把臨時表與G,H連接,最后得到臨時表數據,一次插入到結果表(永久表)。

二者區別:

空間分配:物理空間的分配不一樣,視圖不分配空間,   臨時表會分配空間

虛實:視圖是一條預編譯的SQL語句,並不保存實際數據,而臨時表是保存在tempdb中的實際的表。即視圖是一個快照,是一個虛表,而臨時表是客觀存在的表類型對象。它們的結構一個是表、一個快照。可以把視圖想象成聯合表的快捷方式。

mysql視圖和臨時表的區別


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM