您好,登錄后才能下訂單哦!
這篇文章主要講解了“Mysql虛表指的是什么意思”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Mysql虛表指的是什么意思”吧!
虛擬表是實際上并不存在(物理上不存在),但是邏輯上存在的表。在mysql中,存在三種虛擬表:臨時表、內存表和視圖;而只能從select語句可以返回虛擬表的是視圖和派生表。視圖是為了方便多個表聯表查詢而設計的,所以視圖也是多個表中的字段由各個表中的關聯關系而創建的一種虛擬表。
虛擬表,就是實際上并不存在(物理上不存在),但是邏輯上存在的表。
在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、heap不允許使用xxxTEXT和xxxBLOB數據類型;只允許使用=和<=>操作符來搜索記錄(不允 許& amp; lt;、>、<=或>=);mysql4.1版本之前不支持auto_increment;只允許對非空數據列進行索引(not null)。
注:操作符 “<=>” 說明:NULL-safe equal.這個操作符和“=”操作符執行相同的比較操作,不過在兩個操作碼均為NULL時,其所得值為1而不為NULL,而當一個操作碼為NULL時,其所得值為0而不為NULL。
2、內存表可以通過max_heap_table_size = 2048M來加大使用的內存。
3、內存表必須使用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;
臨時表使用注意事項:
(1)臨時表只在當前連接可見,當這個連接關閉的時候,會自動drop。這就意味著你可以在兩個不同的連接里使用相同的臨時表名,并且相互不會沖突,或者使用已經存在的表,但不是臨時表的表名。(當這個臨時表存在的時候,存在的表被隱藏了,如果臨時表被drop,存在的表就可見了)。
(2)臨時表只能用在 memory,myisam,merge,或者innodb引擎。
(3)臨時表不支持mysql cluster(簇)。
(4)在同一個query語句中,你只能查找一次臨時表。例如:下面的就不可用
mysql> SELECT * FROM temp_table, temp_table AS t2; ERROR 1137: Can't reopen table: 'temp_table'
如果在一個存儲函數里,你用不同的別名查找一個臨時表多次,或者在這個存儲函數里用不同的語句查找,這個錯誤都會發生。
(5)show tables 語句不會列舉臨時表,但是會列出內存表。
(6)你不能用rename來重命名一個臨時表。但是,你可以alter table代替:
mysql>ALTER TABLE orig_name RENAME new_name;
感謝各位的閱讀,以上就是“Mysql虛表指的是什么意思”的內容了,經過本文的學習后,相信大家對Mysql虛表指的是什么意思這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。