做美容美發(fā)的網站有哪些關于進一步優(yōu)化 廣州
目錄
視圖的概念
基本使用
準備測試表
創(chuàng)建視圖?
修改視圖影響基表?
修改基表影響視圖
刪除視圖?
視圖規(guī)則和限制
視圖的概念
- 視圖是一個虛擬表,其內容由查詢定義,同真實的表一樣,視圖包含一系列帶有名稱的列和行數據。
- 視圖中的數據并不會單獨存儲在數據庫中,其數據來自定義視圖時查詢所引用的表(基表),在每次引用視圖時動態(tài)生成。
- 由于視圖和基表用的本質是同一份數據,因此對視圖的修改會影響到基表,對基表的修改也會影響到視圖。
基本使用
準備測試表
下面用員工表(emp)和部門表(dept)作為測試表!
員工表(emp)中包含如下字段:
- 雇員編號(empno)
- 雇員姓名(ename)
- 雇員職位(job)
- 雇員領導編號(mgr)
- 雇傭時間(hiredate)
- 工資月薪(sal)
- 獎金(comm)
- 部門編號(deptno)
部門表(dept)中包含如下字段:
- 部門編號(deptno)
- 部門名稱(dname)
- 部門所在地點(loc)
創(chuàng)建視圖?
CREATE VIEW view_name AS SELECT ...;
創(chuàng)建視圖時會先執(zhí)行select語句,然后用查詢得到的結果來創(chuàng)建視圖
當我們要查詢每個員工及其對應的部門名稱時,需要使用員工表(emp)和?部門表(dept)進行多表查詢,并篩選出員工的部門號等于部門的部門號的記錄。
select ename, dname from emp,dept where emp.deptno=dept.deptno;
如果該查詢結果會被頻繁用到,那我們就可以給上述查詢結果創(chuàng)建視圖,創(chuàng)建完畢后通過show命令就能看到這個視圖。?
create view v_ename_dname as
select ename, dname from emp,dept where emp.deptno=dept.deptno;
并且在數據庫對應的目錄下,會增加一個對應的xxx.frm
文件,但并沒有與之對應的xxx.ibd
文件,這也證明了視圖和基表使用的是同一份數據。?
創(chuàng)建視圖后就可以直接通過查詢視圖,來查看每個員工及其對應的部門名稱了。
select * from v_ename_dname;
修改視圖影響基表?
通過查詢員工表(emp),可以看到員工CLARK所在部門的部門號為10
select * from emp where ename='CLARK';
查詢部門表(dept),可以看到10號部門的部門名稱為ACCOUNTING?
select * from dept where deptno=10;
在視圖中將員工CLARK的名字改為TEST后,會看到在員工表(emp)中的員工CLARK的名字也被改為TEST
update v_ename_dname set ename='TEST' where ename='CLARK';
select * from emp where ename='CLARK';
select * from emp where ename='TEST';
?根本原因就是因為視圖和基表使用的是同一份數據,將視圖中員工CLARK的名字改為TEST后員工表(emp)中的員工CLARK的名字也被改為TEST!!!
修改基表影響視圖
通過查詢員工表(emp),可以看到員工JAMES所在部門的部門號為30。
select * from emp where ename='JAMES';
?30號部門的部門名為SALES,因此查詢視圖時可以看到JAMES所在的部門名為SALES。
select * from v_ename_dname where ename='JAMES';
現在將員工表(emp)中,員工JAMES對應的部門號改為10。
update emp set deptno=10 where ename='JAMES';
select * from v_ename_dname where ename='JAMES';
修改后再查詢視圖,就會發(fā)現JAMES所在部門的部門名,變成了10號部門的部門ACCOUNTING
select * from v_ename_dname where ename='JAMES';
刪除視圖?
DROP VIEW view_name;
比如將剛才創(chuàng)建的視圖(v_ename_dname )刪除后,在數據庫中就看不到這個視圖了
drop view v_ename_dname;
并且該視圖(v_ename_dname )在數據庫目錄下對應的xxx.frm
文件也會被刪除。?
視圖規(guī)則和限制
- 視圖與普通表一樣,視圖的命名也必須是唯一的,不能出現同名視圖或表名。
- 創(chuàng)建視圖的數目無限制,但要考慮復雜查詢創(chuàng)建為視圖之后的性能影響。
- 視圖不能添加索引,也不能有關聯(lián)的觸發(fā)器或者默認值。
- 視圖可以提高安全性,在訪問視圖時必須具有足夠的訪問權限。
- 創(chuàng)建視圖時可以使用order by子句,但如果從該視圖檢索數據時也含有order by子句,那么該視圖中的order by將被覆蓋。
- 視圖可以和普通表一起使用,比如進行多表查詢,內外連接等。