視圖這個名詞太抽象了,乍一看完全不明白是什麼意思,更不知道有何用處,其實瞭解清楚它的含義後你就會恍然大悟。表和視圖的區別,表是佔用硬碟空間物理表,而視圖可以理解為一個虛表,並不儲存在硬碟上,不佔用硬碟空間,實際上就是一個查詢語句,方便查詢。對視圖裡面的資料操作(增、刪、改) 其實就是對真實的表增、刪、改,它們始終保持一致性。
為什麼還需要視圖 ?
視圖可以理解成一個封裝過的表,例如不讓使用者清楚知道表的某些欄位資訊,比較安全。
延續之前的表tableA,建立一個select * from tableA的視圖a_view:
SQL>CREATE VIEW a_view AS SELECT * FROM tableA;
SQL>SELECT * FROM a_view;
650) this.width=650;" height=269>
650) this.width=650;" height=194>
視圖建立成功,查詢a_view的結果,和select * from tableA結果一樣。
如果建立視圖時提示以下錯誤,說明該使用者沒有建立視圖的許可權,需要用後面的方法進行授權。
ERROR at line 1:
ORA-01031: insufficient privileges
----------------------------------
SQL> conn /as sysdba
Connected.
SQL> grant connect,dba to user;
Grant succeeded.
SQL> conn user/password
Connected.
往視圖插入一條記錄
SQL> INSERT INTO a_view(id,name,age) VALUES(106,'susan',23);
記錄被成功添加進視圖中,同時也加進了表裡。
修改視圖:與建立視圖不同,建立視圖使用create建立,而修改視圖是用create or replace。如果要設定視圖唯讀許可權,可以在SQL語句末尾添加with read only。設為唯讀之後如果再往視圖裡添加記錄的話,Oracle即會報錯,如所示。
SQL> CREATE OR REPLACE VIEW a_view AS SELECT * FROM tableA WITH READ ONLY;
650) this.width=650;" height=181>
如果要添加有額外條件的查詢檢視,可以在末尾加上條件。例如查詢年齡大於等於24歲的人,可用所示的方式:
SQL> CREATE OR REPLACE VIEW a_view AS SELECT * FROM tableA where age>=24;
650) this.width=650;" height=198>
多表查詢檢視,如果表tableA和tableB的欄位ID有相同記錄的話,把相應的tableA的name欄位記錄和tableB的class、grade欄位記錄羅列出來,建立到視圖b_view裡,如所示:
SQL> CREATE VIEW b_view as select a.name,b.class,b.grade from tableA a,tableB b where a.id=b.id;
650) this.width=650;" height=270>
最後有關查看視圖中所包含的欄位,方法和查看錶的一樣
SQL>DESC b_view;
650) this.width=650;" height=130>