學習內容:mysql
臨時表和視圖的基本操做...sql
臨時表與視圖的使用範圍...數據庫
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語句中,咱們只能查詢一次臨時表。。ui
iv.show table語句不會列舉臨時表信息..spa
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子句
那麼咱們到底何時能使用到視圖呢?
在咱們定義存儲過程的時候,咱們爲了加快查詢的效率,對數據進行復雜處理時,將代碼封裝在存儲過程當中,當咱們調用存儲過程的時候便可完成咱們的查詢操做...經過代碼來完成對數據的操做....以便於咱們在每次使用這類查詢時只須要調用存儲過程便可....存儲過程的結構屬於一個集合...
而視圖的結構是一個表,一個虛表,不進行實際的存儲,可是咱們在操做視圖的同時,那麼也就表明着操做着這個視圖的基表...視圖讓咱們看到的是咱們想要的數據信息...給個人感受,使用視圖仍是因爲他的安全性,能夠保存重要的信息。。用戶只能經過視圖來對本身的那部分信息進行操做,而沒有權限對其餘重要信息進行操做....