虛拟表,就是實際上并不存在(實體上不存在),但是邏輯上存在的表。
在MySQL中,存在的虛拟表:臨時表、記憶體表和視圖,派生表。
隻能從select語句可以傳回虛拟表的是視圖和派生表。
一、派生表
當select語句的from子句中使用獨立子查詢時,就稱其為派生表。
selectcolumn_listfrom(selectcolumn_listfromtable_1
) derived_table_namewhere derived_table_name.c1 > 0 ;
與子查詢不同,派生表必須具有别名,以便稍後在查詢中引用其名字。
如果派生表沒有别名,則出錯。
二、視圖
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;
視圖建立一遍後會在navicat premium(MySQL可視化工具)儲存下來,不可重複建立視圖,
是以想重複調試建立視圖,需先删除已建立的視圖,在執行建立視圖的SQL指令。
視圖作用:
提高了重用性,就項一個函數,建立一次,可重複調用。
對資料庫重構,卻不影響原資料。
讓資料更加清晰。想要什麼樣的資料,就建立什麼樣的視圖。
即可以從select語句可以傳回虛拟表,又可以通過建構表結建構立虛拟表的是臨時表和記憶體表。
三、臨時表
MySQL臨時表在儲存一些臨時資料時是非常有用的。
臨時表是建立在系統臨時檔案夾中的表,使用得當,完全可以像普通表一樣進行各種操作。
臨時表的資料和表結構都存儲在記憶體中。
臨時表隻在目前MySQL連接配接可見,當關閉連接配接時,MySQL會自動删除表并釋放所有空間。
1.通過建構臨時表結建構立臨時表create temporary tabletmp_table (
nameVARCHAR(10) NOT NULL,
valueINTEGER NOT NULL);select * fromtmp_table;2.直接将查詢結果導入臨時表create temporary table tmp_table select * from other;
3.删除臨時表
drop table tmp_table;
臨時表的應用:
當某一個SQL語句關聯的表在2張及以上,并且和一些小表關聯。可以采用将大表進行拆分并且得到比較小的結果集合存放在臨時表中。
程式執行過程中可能需要存放一些臨時資料,這些資料在整個程式的會話過程中需要重複使用。
臨時表預設是MyISAM(存儲引擎),但是可以修改。
注意:
臨時表與存在的表名相同的時候,存在的表會被隐藏,當臨時表被drop,存在的表就可見了。
show tables語句不會列舉臨時表,但是會列出記憶體表。
四、記憶體表
表結建構在磁盤上,資料在記憶體裡,當停止服務後,表中的資料會丢失,而表的結構不會丢失。
記憶體表也可以被看作是臨時表的一種。
1.通過建構記憶體表結建構立記憶體表create tabletmp_table (
nameVARCHAR(10) NOT NULL,
valueINTEGER NOT NULL)ENGINE=MEMORY;select * fromtmp_table;
show tables;
2.直接将查詢結果導入記憶體表
create table tmp_table engine=memory
select * from other;3.釋放占用的記憶體--删除資料
delete fromtmp_table;--清空表
truncate tabletmp_table;--删除表
drop table tmp_table;
記憶體表特征:
對于varchar等變長類型,記憶體表使用固定的長度來存放。
記憶體表可以有非唯一的鍵。
記憶體表不能包含BLOB或TEXT列。
記憶體表支援AUTO_INCREMENT列。
記憶體表支援插入延遲,使讀取優先。
當臨時表變得很大時,MySQL會自動地把它轉化為在磁盤上存儲的表,而記憶體表不會自動轉換。
在MySQL的主從伺服器上,記憶體表可以被複制。
記憶體表最大的size受限于系統變量max_heap_table_size,預設值是16MB,這個變量是可以修改的。
記憶體表對所有使用者的連接配接都是可見的,使得它非常适合做緩存。
記憶體表必須使用memory存儲引擎。
五、記憶體臨時表
1.通過建構表結建構立臨時記憶體表create temporary tabletmp_table (
nameVARCHAR(10) NOT NULL,
valueINTEGER NOT NULL)ENGINE=MEMORY;select * fromtmp_table;
show tables;2.直接将查詢結果導入記憶體表create temporary table tmp_table engine=memoryselect * from other;
參考:
https://dev.mysql.com/doc/refman/8.0/en/memory-storage-engine.html
https://blog.csdn.net/qq_43678418/article/details/87702348
原文:https://www.cnblogs.com/xl717/p/12144126.html