oracl中視圖和同義詞的區別

時(shí)間:2022-06-28 13:11:00 語(yǔ)文 我要投稿
  • 相關(guān)推薦

oracl中視圖和同義詞的區別

  oracl中視圖和同義詞分別是什么意思?有什么區別?以下是小編整理的中視圖和同義詞的區別,歡迎閱讀。

oracl中視圖和同義詞的區別

  一、視圖

  在之前所學(xué)習過(guò)的所有的SQL語(yǔ)法之中,查詢(xún)操作是最麻煩的,如果程序開(kāi)發(fā)人員將大量的精力都浪費在查詢(xún)的編寫(xiě)上,則肯定影響代碼的工作進(jìn)度,所以一個(gè)好的數據庫設計人員,除了根據業(yè)務(wù)的操作設計出數據表之外,還需要為用戶(hù)提供若干個(gè)視圖,而每一個(gè)視圖包裝了一條條復雜的SQL語(yǔ)句,視圖的創(chuàng )建語(yǔ)法如下:

  CREATE [OR REPLACE] VIEW 視圖名稱(chēng)

  AS 子查詢(xún);

  范例:創(chuàng )建一張視圖

  CREATE VIEW myview AS  SELECT d.deptno,d.dname,d.loc,COUNT(e.empno) count,AVG(e.sal) avg  FROM emp e,dept d

  WHERE e.deptno(+)=d.deptno  GROUP BY d.deptno,d.dname,d.loc;

  現在已經(jīng)創(chuàng )建好了一張視圖,名稱(chēng)為myview,所以現在查詢(xún)myview:

  SELECT * FROM myview;

  此時(shí)通過(guò)一個(gè)簡(jiǎn)單的視圖查詢(xún)操作,就可以完成之前的復雜SQL語(yǔ)句的功能,所以視圖就是包裝了SQL查詢(xún)操作。

  范例:創(chuàng )建一張包含簡(jiǎn)單查詢(xún)語(yǔ)句的視圖

  DROP VIEW myview;CREATE VIEW myview AS  SELECT * FROM emp WHERE deptno=20;

  可是以上的操作實(shí)際上是屬于一個(gè)視圖的替換操作,所以此時(shí)也可以使用另外一種語(yǔ)法:

  CREATE OR REPLACE VIEW myview AS  SELECT * FROM emp WHERE deptno=20;

  此時(shí)表示的是,如果視圖存在則替換,不存在則創(chuàng )建一張新的視圖,視圖的概念雖然好理解,但是在創(chuàng )建視圖的時(shí)候存在兩個(gè)選項。

  選項一:WITH CHECK OPTION

  上面所創(chuàng )建的視圖,是存在一個(gè)創(chuàng )建條件的“WHERE deptno=20”,那么如果現在更新視圖中的這個(gè)條件呢?

  UPDATE myview SET deptno=30 WHERE empno=7369;

  此時(shí)更新的是一張視圖,但是視圖本身并不是一個(gè)具體的數據表,而且現在更新的操作又是視圖的創(chuàng )建條件,很明顯這樣的做法不可取,所以此時(shí)為了解決這個(gè)問(wèn)題,可以加入WITH CHECK OPTION;

  CREATE OR REPLACE VIEW myview AS  SELECT * FROM emp WHERE deptno=20  WITH CHECK OPTION;

  此時(shí)再次執行視圖的更新操作,出現以下錯誤提示:

  ORA-01402: 視圖 WITH CHECK OPTIDN where 子句違規

  意味著(zhù)現在根本就不能去更新視圖的創(chuàng )建條件。

  選項二:WITH READ ONLY

  雖然使用WITH CHECK OPTION可以保證視圖的創(chuàng )建條件不被更新,但是其他的字段卻允許更新。

  UPDATE myview SET sal=9000 WHERE empno=7369;

  與之前的問(wèn)題一樣,視圖本身不是具體的真實(shí)數據,而是一些查詢(xún)語(yǔ)句,所以這樣的更新并不合理,那么在創(chuàng )建視圖的時(shí)候建議將其設置為只讀視圖:

  CREATE OR REPLACE VIEW myview AS  SELECT * FROM emp WHERE deptno=20  WITH READ ONLY;

  此時(shí)再次發(fā)出更新的操作,則直接提示如下錯誤:

  ORA-01733: 此處不允許虛擬列

  而且一定要注意的是,以上給出的是一個(gè)簡(jiǎn)單的操作語(yǔ)句視圖,如果現在視圖中的查詢(xún)語(yǔ)句是統計操作,則根本就不可能更新。

  CREATE OR REPLACE VIEW myview AS  SELECT d.deptno,d.dname,d.loc,COUNT(e.empno) count,AVG(e.sal) avg  FROM emp e,dept d  WHERE e.deptno(+)=d.deptno  GROUP BY d.deptno,d.dname,d.loc;

  現在的信息是統計而來(lái)的,根本就不可能更新。

  在一個(gè)項目之中,視圖的數量有可能超過(guò)表的數量,因為查詢(xún)語(yǔ)句會(huì )很多的。

  二、同義詞

  同義詞就是意思相近的一組詞語(yǔ),對于同義詞的操作之前一直在使用,例如,現在有如下一個(gè)查詢(xún)語(yǔ)句:

  SELECT SYSDATE FROM dual;

  在之前說(shuō)過(guò)“dual”是一張虛擬表,但是虛擬表也肯定應該有它的用戶(hù),經(jīng)過(guò)查詢(xún)可以發(fā)現,這張表是屬于SYS用戶(hù)的,但是這個(gè)時(shí)候就出現一個(gè)問(wèn)題,在之前講解過(guò),不同的用戶(hù)要想訪(fǎng)問(wèn)其他用戶(hù)的表,則需要寫(xiě)上“用戶(hù).表名稱(chēng)”,那么為什么此時(shí)scott用戶(hù)訪(fǎng)問(wèn)的時(shí)候直接使用dual即可,而不是使用“sys.dual”呢,這個(gè)實(shí)際上就是同義詞的應用,dual表示的是sys.dual的同義詞,而同義詞在Oracle之中稱(chēng)為SYNONYM,同義詞的創(chuàng )建語(yǔ)法如下:

  CREATE [PUBLIC] SYSNONYM 同義詞的名稱(chēng) FOR 用戶(hù)名.表名稱(chēng);

  范例:下面創(chuàng )建一個(gè)同義詞為myemp,此同義詞指向scott.emp

  CREATE SYNONYM myemp FOR scott.emp;

  此時(shí)創(chuàng )建成功之后,以后在sys用戶(hù)中就可以使用myemp這個(gè)同義詞的名稱(chēng)了,但是這個(gè)同義詞只適合sys用戶(hù)一個(gè)人使用,其他用戶(hù)無(wú)法使用,因為創(chuàng )建的時(shí)候沒(méi)有使用PUBLIC,如果沒(méi)有使用,則表示創(chuàng )建的不是公共同義詞。

  范例:創(chuàng )建公共同義詞

  SYNONYM myemp;  SYNONYM myemp  scott.emp;

  CONN system/manager;SELECT * FROM myemp;

  但是同義詞也只是Oracle自己的概念,知道就行了。

  三、索引

  索引的主要功能就是用于提升數據庫的操作性能。

  下面通過(guò)代碼分析一個(gè)最簡(jiǎn)單的索引操作的問(wèn)題;

  例如,在之前曾經(jīng)寫(xiě)過(guò)如下的操作語(yǔ)句:

  SELECT * FROM emp WHERE sal>1500;

  此時(shí)由于在sal上沒(méi)有設置索引,所以它的查詢(xún)過(guò)程是采用逐行判斷的方式完成的,這種操作隨著(zhù)數據量的上升,則性能會(huì )出現越來(lái)越多的問(wèn)題,但是如果說(shuō)將數據排列一下呢?

  例如,現在將工作在內存之中形成這樣的一種數據結構;

  如果現在假設所有的數據都排列成以上的樹(shù)形結構的話(huà),同樣的查詢(xún),現在還會(huì )查詢(xún)全部記錄嗎?只會(huì )查詢(xún)部分。

  在Oracle之中創(chuàng )建索引有以下兩種方式:

  主鍵約束:如果一張表中的列上存在了主鍵約束的話(huà),自動(dòng)創(chuàng )建索引;

  手工創(chuàng )建:在某一個(gè)操作列上指定一個(gè)索引;

  范例:在emp.sal字段上創(chuàng )建索引

  CREATE INDEX emp_sal_ind ON emp(sal);

  雖然索引創(chuàng )建完成了,但是要想觀(guān)察出特點(diǎn)基本上是不可能的。

  但是這種索引有一個(gè)最大的問(wèn)題,即:如果要想實(shí)現性能的提高,則必須始終維持以上的一棵樹(shù),那么如果說(shuō)現在這棵樹(shù)上的數據需要頻繁修改的話(huà),則代碼的性能肯定會(huì )有所降低。

  所以一般索引只使用在不會(huì )頻繁修改的表中,而如果一張表上頻繁修改數據且又使用了索引的話(huà),性能肯定會(huì )嚴重降低,所以性能的攬永遠都是相對的。

  以上的索引只是Oracle十幾種索引中的一種,也是最簡(jiǎn)單的一種,稱(chēng)為B樹(shù)索引,還有位圖索引,反向索引,函數索引等等。

【oracl中視圖和同義詞的區別】相關(guān)文章:

保險公司中的區拓和營(yíng)銷(xiāo)的區別07-13

在企業(yè)中做出納和考試中的會(huì )計的區別07-09

愧疚的同義詞和近義詞08-05

大數據分析中,因果和關(guān)聯(lián)之間的區別和聯(lián)系是什么?07-10

會(huì )計英語(yǔ)中be charged to和be credited to的區別?07-10

離職和辭職的區別?07-12

立冬和冬至的區別04-04

社保和醫保的區別07-02

業(yè)余和專(zhuān)業(yè)的區別07-03

平板和電腦的區別07-02

99久久精品免费看国产一区二区三区|baoyu135国产精品t|40分钟97精品国产最大网站|久久综合丝袜日本网|欧美videosdesexo肥婆