oracle視圖總結(建立、查詢、修改、刪除等),oracle視圖

來源:互聯網
上載者:User

oracle視圖總結(建立、查詢、修改、刪除等),oracle視圖

視圖定義:

— —視圖是一種虛表。

— —視圖建立在已有表的基礎上, 視圖賴以建立的這些表稱為基表。
— —向視圖提供資料內容的語句為 SELECT 語句, 可以將視圖理解為儲存起來的 SELECT 語句.
— —視圖向使用者提供基表資料的另一種表現形式


為什麼使用視圖?

— —控制資料訪問
— —簡化查詢
— —避免重複訪問相同的資料


建立視圖:在 CREATE VIEW 語句中嵌入子查詢,子查詢可以是複雜的 SELECT 語句

<span style="font-size:14px;">create or replace view empview as select employee_id emp_id,last_name name,department_namefrom employees e,departments dWhere e.department_id = d.department_id</span>

建立視圖時在子查詢中給列定義別名:在選擇視圖中的列時應使用別名

<span style="font-size:14px;">CREATE VIEW  salvu50AS SELECT  employee_id  ID_NUMBER,             last_name    NAME,            salary*12    ANN_SALARYFROM    employeesWHERE   department_id = 50;View created.</span>

查詢檢視:SELECT  *  FROM    salvu50;


修改視圖:使用CREATE OR REPLACE VIEW 子句修改視圖

<span style="font-size:14px;">CREATE OR REPLACE VIEW empvu80  (id_number, name, sal, department_id)AS SELECT  employee_id, first_name || ' ' || last_name,            salary, department_id   FROM    employees   WHERE   department_id = 80;View created.</span>
CREATE VIEW 子句中各列的別名應和子查詢中各列相對應

建立複雜視圖舉例:

<span style="font-size:14px;">CREATE VIEWdept_sum_vu  (name, minsal, maxsal, avgsal)AS SELECT d.department_name, MIN(e.salary),              MAX(e.salary),AVG(e.salary)   FROM      employees e, departments d   WHERE     e.department_id = d.department_id    GROUP BY  d.department_name;View created.</span>

視圖中使用DML的規定:

可以在簡單視圖中執行 DML 操作
當視圖定義中包含以下元素之一時不能使用delete:
— —組函數
— —GROUP BY 子句
— —DISTINCT 關鍵字
— —ROWNUM 偽列

<span style="font-size:14px;">create or replace view sal_viewas selectavg(salary) avg_sal from employeesgroup by department_id</span>

當視圖定義中包含以下元素之一時不能使用update:
— —組函數
— —GROUP BY子句
— —DISTINCT 關鍵字
— —ROWNUM 偽列
— —列的定義為運算式


當視圖定義中包含以下元素之一時不能使insert:
— —組函數
— —GROUP BY 子句
— —DISTINCT 關鍵字
— —ROWNUM 偽列
— —列的定義為運算式
— —表中非空的列在視圖定義中未包括


屏蔽 DML 操作:

可以使用 WITH READ ONLY 選項屏蔽對視圖的DML 操作
任何 DML 操作都會返回一個Oracle server 錯誤

<span style="font-size:14px;">CREATE OR REPLACE VIEW empvu10    (employee_number, employee_name, job_title)AS SELECTemployee_id, last_name, job_id   FROM     employees   WHERE    department_id = 10   WITH READ ONLY;View created.</span>

刪除視圖:刪除視圖只是刪除視圖的定義,並不會刪除基表的資料
<span style="font-size:14px;">DROP VIEW empvu80;View dropped.</span>

Top-N 分析:

查詢最大的幾個值的 Top-N 分析:

<span style="font-size:14px;">SELECT [column_list], ROWNUM  FROM   (SELECT [column_list]         FROM table        ORDER  BY Top-N_column)WHERE  ROWNUM <=  N;</span>
注意:
對 ROWNUM 只能使用 < 或 <=, 而用 =, >, >= 都將不能返回任何資料。

<span style="font-size:14px;">select *from(select rownum rn,employee_id,salaryfrom(select employee_id,salary,last_namefrom employeesorder by salary desc))where rn <=50 and rn >40</span>




























oracle 刪除視圖

首先,要明白視圖的原理。
視圖的資料都產生於表,視圖本身是沒有資料的,而表才是真正的資料來源。
還有多級的視圖,就是從視圖還可以繼續建立視圖。
所以,視圖的資料來源是表或視圖。但是最終的資料來源一定是表。
什麼樣的視圖資料是可以使用DELETE的?只有從單表引過來的視圖是可以的,這樣的視圖操作實際就相當於動作表,但是DROP VIEW不會對資料有任何影響。其他形勢的視圖,都是不可能刪除資料的。但是DROP VIEW同樣可以。
視圖只是根據關聯關係從表中抓取資料。實際並沒有像表一樣有專門的儲存這些資料。只是從表裡引過來而已。只要你時刻記住,視圖實際上並沒有實際的儲存資料,而是借用表的資料,這就夠了。無論你建立或者刪除視圖,都不會影響資料本身。否則你想想,你建立了一個視圖的時候,沒想過為什麼一下子就有了那麼多資料了呢?也不是你插入的,因為就是從表引過來的而已。
刪除視圖的語句是DROP VIEW 視圖名字
所以刪除視圖,不會對資料有任何影響。因為資料都在表中。想要恢複視圖,重新建立,你的幾千萬條資料就又會出現了。視圖的效果和SELECT查詢一樣,只是能把這個查詢固定了,以便你直接拿來用。
 
oracle刪除視圖所有方法?

用建視圖的使用者登陸,執行下面代碼,可以刪除所有視圖,但是謹慎哈。
前提是該使用者有執行代碼許可權。
begin
for cur in (select view_name from user_views) loop
execute immediately 'drop view '|| cur.view_name ||';';
end loop;
end;
/
 

相關文章

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.