Oracle系列:(22)視圖

來源:互聯網
上載者:User

標籤:oracle



什麼是視圖【View】 

(1)視圖是一種虛表 

(2)視圖建立在已有表的基礎上, 視圖賴以建立的這些表稱為基表

(3)向視圖提供資料內容的語句為 SELECT 語句,可以將視圖理解為儲存起來的 SELECT 語句

(4)視圖向使用者提供基表資料的另一種表現形式

(5)視圖沒有儲存真正的資料,真正的資料還是儲存在基表中

(6)程式員雖然操作的是視圖,但最終視圖還會轉成操作基表

(7)一個基表可以有0個或多個視圖 


什麼情況下會用到視圖

(1)如果你不想讓使用者看到所有資料(欄位,記錄),只想讓使用者看到某些的資料時,此時可以使用視圖

(2)當你需要減化SQL查詢語句的編寫時,可以使用視圖,但不提高查詢效率


視圖應用領域

(1)銀行,電信,金屬,證券軍事等不便讓使用者知道所有資料的項目中


視圖的作用

(1)限制資料訪問

(2)簡化複雜查詢

(3)提供資料的相互獨立

(4)同樣的資料,可以有不同的顯示方式


基於emp表所有列,建立視圖emp_view_1,

create view 視圖名 as select對一張或多張基表的查詢
create view emp_view_1asselect * from emp;

650) this.width=650;" src="http://s4.51cto.com/wyfs02/M00/87/19/wKioL1fUI7Hz1K2SAAAtZpJbbW0875.jpg" title="010.jpg" alt="wKioL1fUI7Hz1K2SAAAtZpJbbW0875.jpg" />


預設情況下,普通使用者無權建立視圖,得讓sysdba為你分配creare view的許可權 


以sysdba身份,授權scott使用者create view許可權

grant create view to scott;


以sysdba身份,撤銷scott使用者create view許可權

revoke create view from scott;


基於emp表指定列,建立視圖emp_view_2,該視圖包含編號/姓名/工資/年薪/年度營收(查詢中使用列別名)

create view emp_view_2asselect empno "編號",ename "姓名",sal "工資",sal*12 "年薪",sal*12+NVL(comm,0) "年度營收"from emp;


基於emp表指定列,建立視圖emp_view_3(a,b,c,d,e),包含編號/姓名/工資/年薪/年度營收(視圖中使用列名)

create view emp_view_3(a,b,c,d,e)asselect empno "編號",ename "姓名",sal "工資",sal*12 "年薪",sal*12+NVL(comm,0) "年度營收"from emp;

650) this.width=650;" src="http://s4.51cto.com/wyfs02/M00/87/19/wKioL1fUJQWiXG0RAAC_GbCz2rU667.jpg" title="011.jpg" alt="wKioL1fUJQWiXG0RAAC_GbCz2rU667.jpg" />


查詢emp_view_3建立視圖的結構

desc emp_view_3;

650) this.width=650;" src="http://s4.51cto.com/wyfs02/M02/87/1B/wKiom1fUJWCjry7DAAA1PTHP4Nw609.jpg" title="012.jpg" alt="wKiom1fUJWCjry7DAAA1PTHP4Nw609.jpg" />


修改emp_view_3(id,name,salary,annual,income)視圖,

create or replace view 視圖名 as 子查詢
create or replace view emp_view_3(id,name,salary,annual,income)asselect empno "編號",ename "姓名",sal "工資",sal*12 "年薪",sal*12+NVL(comm,0) "年度營收"from emp;

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/87/1B/wKiom1fUJemDVuHIAAB0bLNjAR8357.jpg" title="013.jpg" alt="wKiom1fUJemDVuHIAAB0bLNjAR8357.jpg" />


查詢emp表,求出各部門的最低工資,最高工資,平均工資

select min(sal),max(sal),round(avg(sal),0),deptnofrom empgroup by deptno;


建立視圖emp_view_4,視圖中包含各部門的最低工資,最高工資,平均工資

create or replace view emp_view_4asselect deptno "部門號",min(sal) "最低工資",max(sal) "最高工資",round(avg(sal),0) "平均工資"from empgroup by deptno;

650) this.width=650;" src="http://s1.51cto.com/wyfs02/M00/87/1B/wKiom1fUJ1nj0UZNAACw7iz_L5U624.jpg" title="014.jpg" alt="wKiom1fUJ1nj0UZNAACw7iz_L5U624.jpg" />


建立視圖emp_view_5,視圖中包含員工編號,姓名,工資,部門名,工資等級

create or replace view emp_view_5asselect e.empno "編號",e.ename "姓名",e.sal "工資",d.dname "部門名",s.grade "工資等級"from emp e,dept d,salgrade swhere (e.deptno=d.deptno) and (e.sal between s.losal and s.hisal);



刪除視圖emp_view_1中的7788號員工的記錄,使用delete操作,會影響基表嗎

delete from emp_view_1 where empno=7788;

寫法正確,會影響基表


修改emp_view_1為唯讀視圖【with read only】,再執行上述delete操作,還行嗎?

create or replace view emp_view_1asselect * from empwith read only;

不能進行delete操作了

650) this.width=650;" src="http://s1.51cto.com/wyfs02/M01/87/1B/wKiom1fUKKjRHdZfAABUqAp5WkQ019.jpg" title="015.jpg" alt="wKiom1fUKKjRHdZfAABUqAp5WkQ019.jpg" />


將【整個】視圖刪除,會影響表嗎?

不會影響基表


刪除視圖,會進入資源回收筒嗎?

不會進入資源回收筒

650) this.width=650;" src="http://s2.51cto.com/wyfs02/M01/87/19/wKioL1fUK0Di_FMdAAB-VAKtOrM957.jpg" title="017.jpg" alt="wKioL1fUK0Di_FMdAAB-VAKtOrM957.jpg" />


刪除基表會影響視圖嗎?

會影響視圖


閃回基表後,視圖有影響嗎?

視圖又可以正常工作了








Oracle系列:(22)視圖

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.