學習內容:
臨時表和視圖的基本操作...
臨時表與視圖的使用范圍...
1.臨時表
臨時表:臨時表,想必大家都知道這個概念的存在。。。但是我們什么時候應該使用到臨時表呢?當一個數據庫存在着大量的數據的時候,我們想要獲取到這個數據集合的一個子集,那么我們就可以使用臨時表來保存我們想要的數據。。然后對臨時表進行操作就可以了...使用臨時表必然是有原因的。。使用臨時表會加快數據庫的查詢性能....
create temporary table tmp_table //新建一個臨時表 ( name varchar(10) not null, value integer not null, ); 臨時表的創建很簡單,只需要加一個temporary關鍵字就完成了表的創建... 臨時表在我們與數據庫斷開連接的時候,系統將會自動的刪除臨時表並釋放其占用空間..除了這種方式,我們還可以手動進行刪除。。。 drop table tmp_table //與我們正常刪除表的語句一樣... create temporary table tmp_table select * from table_name;//將我們查詢的數據直接插入到臨時表當中... alter table tmp_table rename ttmp_table;//使用alter來重命名臨時表... rename table tmp_table to ttmp_table;//rename在臨時表中是不允許使用的...會發生錯誤。。。
並不是我們使用了臨時表數據庫的查詢性能一定就會得到提升,當我們的數據使用了很好的索引的時候,臨時表的速度可能並不快...那么是不是任何時候都可以使用臨時表呢?臨時表的使用也是有以下限制的:
i.臨時表只能使用在memory,myisam,merge,innodb存儲引擎下。。。
ii.臨時表不支持mysql簇。。
iii.在同一個query語句中,我們只能查詢一次臨時表。。
iv.show table語句不會列舉臨時表信息..
v.不能使用rename來重命名一個臨時表,但是我們可以使用alter table語句來代替...
再舉一個實際的例子:
create table user_info ( user_id int not null, user_name varchar(50) not null ); insert into user_info values(1,'aa'),(2,'bb').......//假設我們插入了10000條數據信息...那么我們想要查詢id>5000 and id<8000的數據信息,那么我們就可以使用一個臨時表了... drop procedure if exists query_performance_test; //如果存在這個存儲過程則刪除掉... delimiter $$ //設置$$符號為mysql的結束符,而不是分號了... create procedure query_performance_test() begin //以begin開始 declare begintime; //聲明變量 declare endtime; set begintime=curtime(); //設置為當前時間... drop temporary if exists userinfo_tmp; //如果臨時表存在則刪除掉當前臨時表... create temporary table userinfo_tmp//新建臨時表 ( i_userid int not null, v_username varchar(50) not null ) engine=memory; insert into userinfo_tmp(i_userid,v_username) select user_id,user_name from userinfo where userid>5000 and userid<8000; //將我們想要查詢的數據放置到臨時表中... select * from userinfo_tmp; set endtime=curtime(); select endtime-begintime; end //存儲過程定義完畢,以end結束... delimiter; //將結束符號重新定義為默認的分號.... call query_profromance_test(); //調用存儲過程....
最后的結果就會輸出id在5000—8000之間的數據信息,並且還會輸出查詢的時間信息....
2.視圖
視圖分為普通視圖和物化視圖,普通視圖是虛擬表,就是把數據庫中的基礎數據表的數據進行重新歸類,更易於使用和理解。物化視圖是實體表,除了把視圖數據進行視圖存儲外,其他類似普通視圖,但查詢速度一般要比普通視圖快,一般用於大數據量的視圖。
優點:
1.安全性:一般來時當我們創建一個數據庫的時候有一些重要的信息是不希望用戶看見的,那么我們就可以建立一個視圖來設置一個權限,使得用戶只能查看自己的基本數據...更重要的數據用戶是無法得到的...
2.查詢的性能有所改善...
3.對於復雜查詢的需求,可以進行問題分解,然后將創建多個視圖獲取數據。將視圖聯合起來就能得到需要的結果了。比如進行多表查詢時,我們希望使用一個統一的方式進行查詢,那么我們建立一個視圖,將每一個表的數據都放入到視圖當中去。。。最后我們對視圖進行操作,我們就可以得到想要的數據信息了....
CREATE TABLE student (stuno INT ,stuname NVARCHAR(60)) CREATE TABLE stuinfo (stuno INT ,class NVARCHAR(60),city NVARCHAR(60)) INSERT INTO student VALUES(1,'wanglin'),(2,'gaoli'),(3,'zhanghai') INSERT INTO stuinfo VALUES(1,'wuban','henan'),(2,'liuban','hebei'),(3,'qiban','shandong') -- 創建視圖 CREATE VIEW stu_class(id,NAME,glass) AS SELECT student.`stuno`,student.`stuname`,stuinfo.`class` FROM student ,stuinfo WHERE student.`stuno`=stuinfo.`stuno` SELECT * FROM stu_class//顯示視圖的結果... +----+----------+--------+ | id | NAME | glass | +----+----------+--------+ | 1 | wanglin | wuban | | 2 | gaoli | liuban | | 3 | zhanghai | qiban | +----+----------+--------+ describe stu_class;//顯示視圖的基本信息... show table status like 'stu_class'//使用show方法顯示視圖的信息.... show create view stu_class //顯示視圖的詳細信息。。。顯示視圖名稱基本信息+視圖中內部操作的代碼等等.... 修改視圖: 1.使用create or replace mysql> delimiter // mysql> create or replace view `stu_class` as select -> `student`.`stuno` as `id` from(`student` join `stuinfo`) //join將兩個表格進行聯合... -> where (`student`.`stuno`=`stuinfo`.`stuno`)// delimter; desc stu_class; // desc 是descbibe的縮寫,在數據庫中寫哪個都允許... select * from stu_class; 2.使用alter 。。。 alter view stu_class as select stuno from student; 更新視圖。。。 UPDATE stu_class SET stuname='xiaofang' WHERE stuno=2//很簡單,沒什么過多的東西。。。。 刪除視圖: drop view if exists stu_class;
更新的注意事項:
(1)視圖中包含基本中被定義為非空的列
(2)定義視圖的SELECT語句后的字段列表中使用了數學表達式
(3)定義視圖的SELECT語句后的字段列表中使用聚合函數
(4)定義視圖的SELECT語句中使用了DISTINCT、UNION、TOP、GROUP BY 、HAVING子句
那么我們到底什么時候能使用到視圖呢?
在我們定義存儲過程的時候,我們為了加快查詢的效率,對數據進行復雜處理時,將代碼封裝在存儲過程中,當我們調用存儲過程的時候即可完成我們的查詢操作...通過代碼來完成對數據的操作....以便於我們在每次使用這類查詢時只需要調用存儲過程即可....存儲過程的結構屬於一個集合...
而視圖的結構是一個表,一個虛表,不進行實際的存儲,但是我們在操作視圖的同時,那么也就代表着操作着這個視圖的基表...視圖讓我們看到的是我們想要的數據信息...給我的感覺,使用視圖還是由於他的安全性,可以保存重要的信息。。用戶只能通過視圖來對自己的那部分信息進行操作,而沒有權限對其他重要信息進行操作....