虛擬表,就是實際上並不存在(物理上不存在),但是邏輯上存在的表。
在MySQL中,存在的虛擬表:臨時表、內存表和視圖,派生表。
只能從select語句可以返回虛擬表的是視圖和派生表。
一、派生表
當select語句的from子句中使用獨立子查詢時,就稱其為派生表。
select column_list from ( select column_list from table_1 ) derived_table_name where derived_table_name.c1 > 0 ;
與子查詢不同,派生表必須具有別名,以便稍后在查詢中引用其名字。
如果派生表沒有別名,則出錯。
二、視圖
視圖是為了方便多個表聯表查詢而設計的,所以視圖也是多個表中的字段由各個表中的關聯關系而創建的一種虛擬表。
視圖創建后就保存了下來,以后可以隨時用,除非drop刪除視圖。
在數據庫中,只存放了視圖的定義,並沒有存放視圖的數據,數據還是存儲在原來的表中,
視圖的數據是依賴原來表中的數據的,所以原來表的數據發生了改變,那么顯示的視圖的數據也會隨着改變。
一般來說,我們只是利用視圖來查詢數據,不會通過視圖來操作數據。
1.創建視圖 -- other create view other as select a.name as username, b.name as goodsname from user as a, goods as b where a.id=b.id;
2.刪除視圖 drop view if exists other;
3.調用視圖
select * from other;
4.如果視圖不存在,則創建視圖;如果視圖存在,則修改視圖
create or replace view view_name as select 語句;
視圖創建一遍后會在navicat premium(MySQL可視化工具)保存下來,不可重復創建視圖,
所以想重復調試創建視圖,需先刪除已創建的視圖,在執行創建視圖的SQL命令或者是修改視圖。
視圖作用:
- 提高了重用性,就項一個函數,創建一次,可重復調用。
- 對數據庫重構,卻不影響原數據。
- 讓數據更加清晰。想要什么樣的數據,就創建什么樣的視圖。
視圖定義的存放位置:information_schema.views
查看視圖的基本信息:DESC view_name;
注意:
- 修改視圖的數據,將直接修改數據表(即原表)的真實數據。
- 刪除視圖,不會影響原表的數據,但是刪除視圖的數據,則會影響到原表。
即可以從select語句可以返回虛擬表,又可以通過構建表結構創建虛擬表的是臨時表和內存表。
三、臨時表
MySQL臨時表在保存一些臨時數據時是非常有用的。
臨時表是建立在系統臨時文件夾中的表,使用得當,完全可以像普通表一樣進行各種操作。
臨時表的數據和表結構都存儲在內存中。
臨時表只在當前MySQL連接可見,當關閉連接時,MySQL會自動刪除表並釋放所有空間。
1.通過構建臨時表結構創建臨時表 create temporary table tmp_table ( name VARCHAR(10) NOT NULL, value INTEGER NOT NULL ); select * from tmp_table; 2.直接將查詢結果導入臨時表 create temporary table tmp_table select * from other;
3.刪除臨時表
drop table tmp_table;
臨時表的應用:
- 當某一個SQL語句關聯的表在2張及以上,並且和一些小表關聯。可以采用將大表進行拆分並且得到比較小的結果集合存放在臨時表中。
- 程序執行過程中可能需要存放一些臨時數據,這些數據在整個程序的會話過程中需要重復使用。
- 臨時表默認是MyISAM(存儲引擎),但是可以修改。
注意:
- 臨時表與存在的表名相同的時候,存在的表會被隱藏,當臨時表被drop,存在的表就可見了。
- show tables語句不會列舉臨時表,但是會列出內存表。
- 臨時表在數據庫多個連接之間不能共享。
- 臨時表的最大所需內存需要通過tmp_table_size=128MB設定。當數據超過臨時表的最大值設定時,自動轉為磁盤表,此時因需要進行IO操作,性能會大大下降,而內存表不會,內存表滿后,會提示數據滿錯誤。
- 臨時表更多作用是系統自己創建或,組織數據以提升性能,如子查詢。
四、內存表
表結構建在磁盤上,數據在內存里,當停止服務后,表中的數據會丟失,而表的結構不會丟失。
內存表也可以被看作是臨時表的一種。
1.通過構建內存表結構創建內存表 create table tmp_table ( name VARCHAR(10) NOT NULL, value INTEGER NOT NULL )ENGINE=MEMORY; select * from tmp_table; show tables;
2.直接將查詢結果導入內存表
create table tmp_table engine=memory
select * from other;
3.釋放占用的內存 -- 刪除數據 delete from tmp_table; -- 清空表 truncate table tmp_table; -- 刪除表 drop table tmp_table;
內存表特征:
- 對於varchar等變長類型,內存表使用固定的長度來存放。
- 內存表可以有非唯一的鍵。
- 內存表不能包含BLOB或TEXT列。
- 內存表支持AUTO_INCREMENT列。
- 內存表支持插入延遲,使讀取優先。
- 當臨時表變得很大時,MySQL會自動地把它轉化為在磁盤上存儲的表,而內存表不會自動轉換。
- 在MySQL的主從服務器上,內存表可以被復制。
- 內存表最大的size受限於系統變量max_heap_table_size,默認值是16MB,這個變量是可以修改的。
- 內存表對所有用戶的連接都是可見的,使得它非常適合做緩存。
- 內存表必須使用memory存儲引擎。
五、臨時內存表
1.通過構建表結構創建臨時內存表 create temporary table tmp_table ( name VARCHAR(10) NOT NULL, value INTEGER NOT NULL )ENGINE=MEMORY; select * from tmp_table; show tables; 2.直接將查詢結果導入內存表 create temporary table tmp_table engine=memory select * from other;
參考:
https://dev.mysql.com/doc/refman/8.0/en/memory-storage-engine.html
https://blog.csdn.net/qq_43678418/article/details/87702348