1. 程式人生 > >【安博培訓技術】Oracle4 事務和資料庫物件20130910

【安博培訓技術】Oracle4 事務和資料庫物件20130910

Oracle4 事務和資料庫物件


回顧
SQL 支援的操作符包括算術、比較、邏輯、集合和連線操作符
SQL 函式可大致分為:
單行函式:日期、字元、數字、轉換、其他
聚合函式
分析函式


目標
事務
使用同義詞
使用序列
理解並使用檢視
理解並使用索引


事務管理
例如,銀行轉帳問題:
    假定資金從帳戶A轉到帳戶B,至少需要兩步:
帳戶A的資金減少
然後帳戶B的資金相應增加
CREATE TABLE bank
(
    customerName CHAR(10),  --顧客姓名
    currentMoney MONEY     --當前餘額
)
GO
ALTER TABLE bank
   ADD CONSTRAINT CK_currentMoney    
       CHECK(currentMoney>=1)
GO
INSERT INTO bank(customerName,currentMoney)
        VALUES('張三',1000)
INSERT INTO bank(customerName,currentMoney)
        VALUES('李四',1)


事務控制
事務是最小的工作單元,作為一個整體進行工作
事務的原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、永續性(Durability)。
保證事務的整體成功或失敗,稱為事務控制
用於事務控制的語句有:
COMMIT - 提交併結束事務處理
ROLLBACK -  撤銷事務中已完成的工作
SAVEPOINT – 標記事務中可以回滾的點


資料庫物件簡介 
Oracle 資料庫物件又稱模式物件
資料庫物件是邏輯結構的集合,最基本的資料庫物件是表
其他資料庫物件包括:
資料庫物件  
同義詞序列 檢視索引


同義詞
同義詞是現有物件的一個別名。
簡化SQL語句
隱藏物件的名稱和所有者
提供對物件的公共訪問
同義詞共有兩種型別:
私有同義詞 公有同義詞
私有同義詞只能在其模式內訪問,且不能與當前模式的物件同名。
[說明]使用情況:頻繁引用
建立條件:在自身的模式建立私有同義詞,使用者需具有create synonym系統許可權
      在其它使用者模式建立私有同義詞,使用者需具有create any synonym系統許可權
私有同義詞
CREATE SYNONYM emp FOR SCOTT.emp;
empSCOTT.emp的別名
SCOTT模式名
emp表名


公有同義詞
CREATE PUBLIC SYNONYM syn_emp FOR SCOTT.emp;
syn_emp同義詞名稱


私有同義詞:只能被當前模式的使用者訪問
共有同義詞:需有create public synonym許可權
replace:若同義詞已存在,替換該同義詞


建立或替換現有的同義詞
CREATE OR REPLACE SYNONYM syn_emp FOR SCOTT.emp;
OR REPLACE 替換現有的同義詞


刪除同義詞
SQL> DROP SYNONYM emp; 
SQL> DROP PUBLIC SYNONYM syn_emp; 
同義詞TAB:當前使用者所擁有的表和檢視物件
本地物件和共有物件重名時,本地物件優先
資料字典檢視:user_synonyms、user_tables、user_views
通過這些檢視檢視當前模式下的資料物件


序列
序列是用於生成唯一、連續序號的物件
序列可以是升序的,也可以是降序的
使用CREATE SEQUENCE語句建立序列
SQL> CREATE SEQUENCE seq_toys
START WITH 10
INCREMENT BY 10
MAXVALUE 2000
MINVALUE 10
NOCYCLE
CACHE 10;
指定記憶體中預先分配的序號數 
[思路]聯絡SqlServer中的標示列,引出Oracle中的序列,然後通過例子展示在Oracle中如何實現標示列的功能
increament by:根據增量的正負確定升降序
預設最大值:增序10的27次方,降序-1
cache:預選分配一組序號,用完後再生成一組


訪問序列
通過序列的偽列來訪問序列的值
NEXTVAL 返回序列的下一個值
CURRVAL 返回序列的當前值
SQL> INSERT INTO toys (toyid, toyname, toyprice) 
     VALUES (seq_toys.NEXTVAL, ‘TransFormer’, 500);
SQL> INSERT INTO toys
     VALUES ( toys_seq.NEXTVAL, ’Plane’, 75);
指定序列的下一個值
SQL> SELECT seq_toys.CURRVAL FROM dual;
檢索序列的當前值


更改和刪除序列
使用ALTER SEQUENCE語句修改序列,
不能更改序列的START WITH引數
SQL> ALTER SEQUENCE seq_toys MAXVALUE 5000 CYCLE;
使用DROP SEQUENCE語句刪除序列
SQL> DROP SEQUENCE seq_toys;


檢視
檢視以經過定製的方式顯示來自一個或多個表的資料
檢視可以視為“虛擬表”或“儲存的查詢”
建立檢視所依據的表稱為“基表”
檢視的優點有:
提供了另外一種級別的表安全性
隱藏的資料的複雜性
簡化的使用者的SQL命令
隔離基表結構的改變
通過重新命名列,從另一個角度提供資料


建立檢視 3-1
CREATE VIEW stud_view
AS SELECT studno, studname, subno
FROM stud_details;
[初始化表及資料]
Create table sub_details(
  subno int primary key,
  subname varchar2(20)
);
Create table stud_details(
  studno int primary key,
  studname  varchar2(20) not null,
  studmarks int,
  subno int references sub_details(subno)
);
Insert into sub_details values(2,'English');
Insert into sub_details values(4,'Maths');
Insert into sub_details values(5,'Science');
Insert into stud_details values(1,'Rob',45,2);
Insert into stud_details values(2,'James',33,4);
Insert into stud_details values(3,'Jesica',40,4);


建立檢視 3-2
建立檢視的語法:
 CREATE [OR REPLACE] [FORCE] VIEW
    view_name [(alias[, alias]...)] 
  AS select_statement
  [WITH CHECK OPTION]
  [WITH READ ONLY];
[說明] 
force:無論基表是否存在都建立檢視
with read only:不能通過檢視修改資料


建立檢視 3-3
使用 WITH CHECK OPTION 選項建立檢視
CREATE OR REPLACE VIEW v_stu AS
SELECT * FROM t_student WHERE f_class = 1
WITH CHECK OPTION CONSTRAINT chk_class1;
使用 ORDER BY 子句建立檢視
CREATE OR REPLACE VIEW v_stusorted AS
SELECT * FROM t_student ORDER BY f_class;
建立帶有錯誤的檢視
CREATE FORCE VIEW v_temp AS
SELECT * FROM t_temp;
[說明] 
with check option:若沒有此選項,則可將符合條件的記錄(在檢視中)改為檢視中不可見的記錄
如果選擇特定的列來建立檢視,則通過該檢視只能更新這些列(與表的近似之處)


聯接檢視 2-1
CREATE VIEW v_stud AS
SELECT studno, studname, studmarks, subname
FROM stud_details, sub_details 
WHERE stud_details.subno=sub_details.subno;


聯接檢視 2-2
建立外聯接檢視
CREATE VIEW v_coursecount AS
SELECT stu.f_id, f_name, count(f_courseid) as coursecount
FROM   t_student stu, t_grade gra
WHERE  stu.f_id = gra.f_stuid(+)
GROUP BY stu.f_id;


SELECT stu.f_id, f_name, count(f_courseid) as coursecount
FROM   t_student stu left join t_grade gra 
         on (stu.f_id = gra.f_stuid)
GROUP BY stu.f_id, f_name;
注意外連線的寫法:from T1 left join T2 on T1.f=T2.f  <=>  from T1,T2 where T1.f=T2.f(+)


檢視上的DML語句
在檢視上也可以使用修改資料的DML語句,如INSERT、UPDATE和DELETE
檢視上的DML語句有如下限制:
只能修改一個底層的基表
如果修改違反了基表的約束條件,則無法更新檢視
如果檢視包含連線操作符、DISTINCT 關鍵字、集合操作符、聚合函式或 GROUP BY 子句,則將無法更新檢視
如果檢視包含偽列或表示式,則將無法更新檢視
[說明]說明檢視上的DML語句為什麼有如下限制,並適當舉例2-3種情況
[強調]檢視上的DML語句並非修改了檢視中的資料,而是通過對檢視的操作最終修改的是基表的資料,這一點一定要明確
如何利用檢視對基表進行寫操作(一般不通過檢視修改資料)
類似於表的地方以及不同
只要修改能夠確定的對應於唯一的基表資料,修改就是可行的


鍵保留表
stud_details 為什麼是鍵保留表?
因為 studno 既是stud_details 中的主鍵,也是聯接結果中的主鍵 
[思路]
如何保證對檢視的修改最後影射到唯一的基表資料 
鍵保留表:基表的主鍵亦是檢視的主鍵
可修改鍵保留表中的值(只有鍵保留表才能使用DML)
思考:Oracle相比於SQLServer的高明之處(明確,規範,近乎死板)


檢視中的函式
檢視中可以使用單行函式、分組函式和表示式
CREATE VIEW item_view AS 
SELECT itemcode, LOWER(itemdesc) item_desc
FROM itemfile; 
使用DROP VIEW語句刪除檢視
SQL> DROP VIEW toys_view; 


索引 3-1
索引是與表相關的一個可選結構
用以提高 SQL 語句執行的效能
減少磁碟I/O
使用 CREATE INDEX 語句建立索引
在邏輯上和物理上都獨立於表的資料
Oracle 自動維護索引
[說明]重點講解什麼是索引,索引的機制,這對查詢優化很重要
[思路]如何才能更快的查詢到需要的紀錄有序索引索引的儲存及原理


索引 3-2
索引有各種型別,除了標準索引外,還有一些特殊型別的索引:
唯一索引 點陣圖索引 組合索引 基於函式的索引 反向鍵索引


索引 3-3
建立標準索引
SQL> CREATE INDEX x_name ON t_student (f_name)
     TABLESPACE index_tbs;
重建索引
SQL> ALTER INDEX x_name REBUILD
刪除索引
SQL> DROP INDEX x_name; 
[說明]掌握索引的基本用法
Rebuild效能優於Drop Index和Create Index語句重建索引


唯一索引
唯一索引確保在定義索引的列中沒有重複值
Oracle 自動在表的主鍵列上建立唯一索引
使用CREATE UNIQUE INDEX語句建立唯一索引
SQL> CREATE UNIQUE INDEX x_id
     ON itemfile (f_id);


組合索引
組合索引是在表的多個列上建立的索引
索引中列的順序是任意的
如果 SQL 語句的 WHERE 子句中引用了組合索引的所有列或大多數列,則可以提高檢索速度
SQL> CREATE INDEX x_comp
     ON t_student(f_name, f_birth);


反向鍵索引
反向鍵索引反轉索引列鍵值的每個位元組
通常建立在值是連續增長的列上,使資料均勻地分佈在整個索引上
建立索引時使用REVERSE關鍵字
SQL> CREATE INDEX rev_index 
     ON t_student (f_birth) REVERSE;
SQL> ALTER INDEX rev_index REBUID NOREVERSE;
[說明]反向鍵索引和點陣圖索引需瞭解其使用的範圍、如何使用,原理稍加講解即可,不可深入
索引基於有序數,資料過於密集的情況(參看知識點文件Oracle_06Reverse Index.doc)


點陣圖索引
點陣圖索引適合建立在低基數列上
點陣圖索引不直接儲存ROWID,而是儲存位元組位到ROWID的對映
減少響應時間
節省空間佔用
SQL> CREATE BITMAP INDEX bit_index
     ON t_student (f_sex);
[說明]適用範圍:某列值重複較多
點陣圖索引中使用每個鍵值的點陣圖,而不使用Rowid列表,點陣圖中的每個位對應一個可能的Rowid
[說明]更為詳細的內容請參考知識點文件:Oracle_07Bitmap Index.txt


基於函式的索引
基於一個或多個列上的函式或表示式建立的索引
表示式中不能出現聚合函式
不能在LOB型別的列上建立
建立時必須具有 QUERY REWRITE 許可權
SQL> CREATE INDEX x_lowercase
     ON toys (LOWER(toyname));
SQL> SELECT toyid FROM toys
     WHERE LOWER(toyname)='doll';
例如按照姓名(英文)查詢的情況


獲取索引的資訊
與索引有關的資料字典檢視有:
USER_INDEXES - 使用者建立的索引的資訊
USER_IND_PARTITIONS - 使用者建立的分割槽索引的資訊
USER_IND_COLUMNS - 與索引相關的表列的資訊
SQL> SELECT INDEX_NAME, TABLE_NAME, COLUMN_NAME
     FROM USER_IND_COLUMNS
     ORDER BY INDEX_NAME, COLUMN_POSITION;
[說明] 常用的資料字典要講明白,還有其它一些,比如:user_tables,user_views等等


總結
同義詞是現有資料庫物件的別名
序列用於生成唯一、連續的序號
檢視是基於一個或多個表的虛擬表
索引是與表相關的一個可選結構,用於提高 SQL 語句執行的效能
索引型別有標準索引、唯一索引、反向鍵索引、點陣圖索引和基於函式的索引