本文主要介紹Oracle資料庫中視圖、序列、索引、同義詞的相關使用方法。 ...
一、視圖(Views)與 同義詞
1、視圖:實際上是對查詢結果集的封裝,視圖本身不存儲任何數據,所有的數據都存放在原來的表中;
在邏輯上可以把視圖看作是一張表
2、作用:
-
- 封裝查詢語句,簡化複雜的查詢需求
- 屏蔽表中的細節
3、語法:
create [or replace] view 視圖的名稱 as 查詢語句 [with read only]
4、視圖和同義詞:
-
- 屏蔽了查詢過程步驟
- 屏蔽了真實的表名 增加了代碼被破解的難度
5、示例:
select * from emp;
-- 封裝成一個視圖: 獲取10號部門的員工信息 create or replace view view_test1 as select * from emp where deptno=10; select * from view_test1;
-- 簡化查詢語句 CREATE VIEW view_test2 AS SELECT SUM(cc) total, SUM(CASE yy WHEN '1980' THEN cc END) "1980", SUM(CASE yy WHEN '1981' THEN cc END) "1981", SUM(CASE yy WHEN '1982' THEN cc END) "1982", SUM(CASE yy WHEN '1987' THEN cc END) "1987" FROM( SELECT TO_CHAR(HIREDATE, 'YYYY') YY, COUNT(*) CC FROM EMP GROUP BY TO_CHAR(HIREDATE, 'YYYY') ) TT ; select * from view_test2;
-- 屏蔽表中的細節 create or replace view view_test3 as select ename,job,mgr,hiredate from emp; -- 通過視圖修改數據 update view_test3 set ename='SMITH' where ename='SMI%TH';
-- 創建只讀視圖 create view view_test4 as select ename,job,mgr,hiredate from emp with read only; -- 報錯 ORA-01733: virtual column not allowed here update view_test4 set ename='SMITH2' where ename='SMITH';
-- 同義詞: 相當於是取了一個別名 create synonym yuangong for view_test3; select * from yuangong;
二、序列
序列: 1,2,3,4,5,6,7....
作用: 模擬類似mysql中auto_increment自動增長的編號
1、語法:
create sequence 序列名稱 start with 從幾開始 increment by 每次遞增多少 minvalue | nominvalue maxvalue | nomaxvalue cycle | nocycle cache 緩存幾個數 3 1,2,3 4,5,6 -- currval:序列當前取到哪個值,必須是調用了一次nextval之後才能正常使用 -- nextval:序列中的下一個值 -- 註意:序列中的值,一旦被取過,無論回滾/發生異常,序列都是永不回頭向下遞增的
2、使用示例
-- 1,2,3,4,5,6,1,2,3,4,5,6 create sequence seq_test01 start with 1 minvalue 1 maxvalue 6 cycle cache 3; -- 需先執行nextval語句後才有效 select seq_test01.currval from dual; select seq_test01.nextval from dual; -- 開發過程,通常寫法如下: create sequence seq_test02; -- 建表 create table louceng( lou number primary key ); -- 執行兩次 insert into louceng values(seq_test02.nextval); -- 1 2 select seq_test02.currval from dual; select * from louceng;
三、索引
3.1 索引概述
索引:索引是一種已經排好序的幫助資料庫快速查找數據的數據結構,主要是用來幫助資料庫快速的找到數據 相當於一本書的目錄。
語法:
create index 索引名稱 on 表名(列名1,列名2....);
主鍵約束: 自帶唯一索引
唯一約束: 自帶唯一索引
3.2 索引作用示例
1 -- 創建測試數據500萬 2 -- 創建一張表 3 create table wbw( 4 c1 number primary key, 5 c2 varchar2(20), 6 c3 varchar2(20) 7 ); 8 -- 插入500萬條記錄 9 create sequence seq_wbw; 10 11 -- PLSQL中的迴圈(283s) 12 declare 13 14 begin 15 for i in 1..5000000 loop 16 insert into wbw values(seq_wbw.nextval,'c2:'||i,'c3:'||i); 17 end loop; 18 commit; 19 end; 20 21 -- 在沒有創建索引的情況下(2.37s) 22 select * from wbw where c2='c2:4000000'; 23 24 -- 0.00s 25 select * from wbw where c1=4000000; 26 27 -- 創建索引(35.77s) 28 create index wbw_c2 on wbw(c2); 29 -- 索引列下 0.15s 30 select * from wbw where c2='c2:4000000'; 31 -- 非索引列下 2.38s 32 select * from wbw where c3='c3:4000000';
3.3 索引擴展
3.3.1 索引優化概述
SQL語句的執行計劃(SQL語句分析的時候): 將SQL語句發送給資料庫, 資料庫分析執行這條語句需要經歷哪些步驟,消耗多少資源
SQL優化的步驟:
1.找到需要優化的語句
2.通過執行計划去分析SQL語句
3.確定優化方案
索引的原理: 索引是一種已經排好序的幫助資料庫快速查找數據的數據結構 BTree : B樹, Balance, 平衡多路查找樹
索引的利弊:
好處: 提高查詢的效率
缺點: 占資源,反向影響增刪改的效率
什麼時候創建索引?
1.數據量比較大時候
2.哪些列經常作為查詢的條件
3.3.2 使用示例:
1 -- 沒有創建多列索引的情況下 0.50s 2 select * from wbw where c2='c2:4000001' and c3='c3:4000001'; 3 4 -- 創建索引(41.43s) 5 create index wbw_c23 on wbw(c2,c3); 6 7 8 -- 創建多列索引的情況下 0.25s 9 select * from wbw where c2='c2:4000001' and c3='c3:4000001'; 10 -- 1.80s 11 select * from wbw where c3='c3:4000001';
3.3.3 執行計劃圖解