Oracle 數據庫對象又稱模式對象,數據庫對象是邏輯結構的集合,最基本的數據庫對象是表。數據庫
其餘數據庫對象包括:安全
同義詞是現有對象的一個別名。它的做用有:函數
1.簡化SQL語句性能
2.隱藏對象的名稱和全部者(隱藏原始對象內容)spa
3.提供對對象的公共訪問code
同義詞共有兩種類型:對象
公有同義詞可被全部的數據庫用戶訪問。索引
私有同義詞只能在其模式內訪問,且不能與當前模式的對象同名。內存
建立或替換現有同義詞ci
create or replace synonym emp_syn for scott.emp;
刪除同義詞
drop synonym emp; drop public synonym emp_syn
使用同義詞
Create public synonym Newer for scott.emp2; Select * from Newer ;
序列是用於生成惟1、連續序號的對象,序列能夠是升序的,也能夠是降序的,能夠用於表示數據的數量。咱們可使用CREATE SEQUENCE語句建立序列。
Create sequence 序列名 Start with 1 --指序列開始大小,默認爲1 Increment by 1 --每次的增量,默認爲1 Maxvalue 2000 --序列的最大數 Minvalue 1 --序列的最小數 Nocycle --當序列最大了將再也不生成整數(默認) Cache 10; --保留在內存中整數的個數,默認20
注意:序列在使用的時候,若是給的是主鍵,爲防止出現不連續的狀況,應該設置爲NOCACHE。
從user_sequences中查出全部的序列信息。
select * from user_sequences;
經過序列的僞列來訪問序列的值
1.NEXTVAL 返回序列的下一個值
2.CURRVAL 返回序列的當前值
注意:序列在使用的時候,若是給的是主鍵,爲防止出現不連續的狀況,應該設置爲NOCACHE。
INSERT INTO toys (toyid, toyname, toyprice) VALUES ( toys_seq.NEXTVAL, ‘TWENTY’, 25); INSERT INTO toys (toyid, toyname, toyprice) VALUES ( toys_seq.NEXTVAL, ’MAGIC PENCIL’, 75); --toys_seq.NEXTVAL 指定序列的下一個值
SELECT toys_seq.CURRVAL FROM dual; --檢索序列的當前值
使用ALTER SEQUENCE語句修改序列,不能更改序列的START WITH參數
ALTER SEQUENCE toys_seq MAXVALUE 5000 CYCLE;
使用DROP SEQUENCE語句刪除序列
DROP SEQUENCE toys_seq;
視圖以通過定製的方式顯示來自一個或多個表的數據,視圖能夠視爲「虛擬表」或「存儲的查詢」,建立視圖所依據的表稱爲「基表」。
視圖的優勢有:
1.提供了另一種級別的表安全性
2.隱藏的數據的複雜性
3.簡化的用戶的SQL命令
4.隔離基表結構的改變
5.經過重命名列,從另外一個角度提供數據
例:
CREATE VIEW stud_view AS SELECT studno, studname, subno FROM Stud_details;
經過這個視圖,查詢到的結果:
建立視圖的語法:
CREATE [OR REPLACE] [FORCE] VIEW view_name [(alias[, alias]...)] AS select_statement [WITH CHECK OPTION][CONSTRAINT C_NAME] [WITH READ ONLY]; --禁止對錶進行更新刪除操做 --W ITH CHECK OPTION CONSTRAINT _NAME :表示增長一個檢查約束,INSERT和UPDATE時候必需要求: --INSERT時候要求插入的數據必須符合定義時候設置的where條件一致,UPDATE 時候只能改除where條件列之外的其餘數據列或者修改的條件列的值符合where條件 --
使用 WITH CHECK OPTION 選項建立視圖
create or replace view pause_view as select * from order_master WHERE ostatus = 'p' with check option constaint chk_pv;
使用 ORDER BY 子句建立視圖
create or replace view ord_ven as select * from vendor_master order by venname;
聯接視圖:兩個表的結果
create view Stud_sub_view as select Studno, Studname, Submrks, Subname from Stud_details, Sub_Details where Stud_details.Subno=Sub_details.Subno;
建立外聯接視圖
CREATE VIEW ven_ord_outj_view AS SELECT vm.vencode, venname, orderno, odate, ostatus FROM vendor_master vm, order_master om WHERE vm.vencode = om.vencode(+);
等同於
SELECT vm.vencode, venname, orderno, odate, ostatus FROM vendor_master vm LEFT OUTER JOIN order_master om ON vm.vencode = om.vencode;
在視圖上也可使用修改數據的DML語句,如INSERT、UPDATE和DELETE
視圖上的DML語句有以下限制:
1.只能修改一個底層的基表
2.若是修改違反了基表的約束條件,則沒法更新視圖
3.若是視圖包含鏈接操做符、DISTINCT 關鍵字、集合操做符、聚合函數或 GROUP BY 子句,則將沒法更新視圖
4.若是視圖包含僞列或表達式,則將沒法更新視圖
若是往視圖中添加數據,數據能夠添加到基表,但若是插入的數據不符合視圖的where等條件的要求,則視圖中不會顯示。若是但願插入的數據要符合視圖定義的時候,where要確則須要添加參數。
若是要從視圖中刪除基表的數據,被刪除的這條數據必須符合視圖的查詢條件,才能經過視圖刪除該數據。
鍵保留表是理解鏈接視圖修改限制的一個基本概念。該表的主鍵列所有顯示在視圖中,而且它們的值在視圖中都是惟一且非空的。也就是說,表的鍵值在一個鏈接視圖中也是鍵值,那麼就稱這個表爲鍵保留表。
由於 Studno 既是Stud_details 中的主鍵,也是聯接結果中的主鍵,所以Stud_details是鍵保留表
視圖中可使用單行函數、分組函數和表達式
CREATE VIEW item_view AS SELECT itemcode, LOWER(itemdesc) item_desc FROM itemfile;
使用DROP VIEW語句刪除視圖
DROP VIEW toys_view;
索引是與表相關的一個可選結構,使用索引能夠提升 SQL 語句執行的性能,減小磁盤I/O,索引在邏輯上和物理上都獨立於表的數據,Oracle 可以自動維護索引。
索引的原理:索引的工做原理是與一個叫作ROWID的概念緊密相關的,Oracle在建立數據表時,默認會爲每一個數據表創建一個隱含字段,叫ROWID。在向數據表中插入記錄時,系統將自動爲每條記錄分配唯一的一個ROWID號,利用這個ROWID號,就能夠快速定位到記錄。
使用 CREATE INDEX 語句建立索引:
建立標準索引:Create index 索引名 on 表名(列名);
CREATE INDEX item_index ON itemfile (itemcode) TABLESPACE index_tbs;
重建索引
ALTER INDEX item_index REBUILD;
刪除索引
DROP INDEX item_index;
索引有各類類型,除了標準索引外,還有一些特殊類型的索引:
惟一索引確保在定義索引的列中沒有重複值,Oracle 自動在表的主鍵列上建立惟一索引
使用CREATE UNIQUE INDEX語句建立惟一索引
CREATE UNIQUE INDEX item_index ON itemfile (itemcode);
組合索引是在表的多個列上建立的索引,索引中列的順序是任意的,若是 SQL 語句的 WHERE 子句中引用了組合索引的全部列或大多數列,則能夠提升檢索速度。
CREATE INDEX comp_index ON itemfile(p_category, itemrate);
反向鍵索引反轉索引列鍵值的每一個字節,一般創建在值是連續增加的列上,可使數據均勻地分佈在整個索引上
建立索引時使用REVERSE關鍵字
CREATE INDEX rev_index ON itemfile (itemcode) REVERSE;
ALTER INDEX rev_index REBUID NOREVERSE;
位圖索引適合建立在低基數列上,位圖索引不直接存儲ROWID,而是存儲字節位到ROWID的映射,使用位圖索引能夠減小響應時間,節省空間佔用。
CREATE BITMAP INDEX bit_index ON order_master (orderno);
索引組織表的數據存儲在與其關聯的索引中,索引中存儲的是行的實際數據,而不是ROWID,它基於主鍵訪問數據。
CREATE TABLE 命令與 ORGANIZATION INDEX 子句一塊兒用於建立索引組織表。
CREATE TABLE ind_org_tab ( vencode NUMBER(4) PRIMARY KEY, venname VARCHAR2(20) ) ORGANIZATION INDEX;
普通表與索引組織表的比較
普通表 |
索引組織表 |
ROWID 惟一地標識行 |
主鍵惟一地標識行 |
隱式的 ROWID 列 |
沒有隱式的 ROWID 列 |
基於 ROWID 的訪問 |
基於主鍵的訪問 |
順序掃描返回全部行 |
徹底索引掃描返回全部行,並按主鍵順序排列 |
支持分區 |
不支持分區 |
基於一個或多個列上的函數或表達式建立的索引,表達式中不能出現聚合函數,不能在LOB類型的列上建立,建立時必須具備 QUERY REWRITE 權限,當查詢使用了函數的時候,索引將再也不使用,因此要創建函數索引。
CREATE INDEX lowercase_idx ON toys (LOWER(toyname));
SELECT toyid FROM toys WHERE LOWER(toyname)='doll';
咱們能夠將索引存儲在不一樣的分區中。
與分區有關的索引有三種類型:
1.局部分區索引 - 在分區表上建立的索引,在每一個表分區上建立獨立的索引,索引的分區範圍與表一致
2.全局分區索引 - 在分區表或非分區表上建立的索引,索引單獨指定分區的範圍,與表的分區範圍或是否分區無關
3.全局非分區索引 - 在分區表上建立的全局普通索引,索引沒有被分區
與索引有關的數據字典視圖有:
1.USER_INDEXES - 用戶建立的索引的信息
2.USER_IND_PARTITIONS - 用戶建立的分區索引的信息
3.USER_IND_COLUMNS - 與索引相關的表列的信息
SELECT INDEX_NAME, TABLE_NAME, COLUMN_NAME FROM USER_IND_COLUMNS ORDER BY INDEX_NAME, COLUMN_POSITION;