資料庫物件
使用者模式:指資料庫使用者所建立和儲存資料物件的統稱。在訪問其它使用者模式的資料庫物件時需加上使用者模式。
如:scott.emp, scott.dept等。
資料庫物件包括:表、檢視、索引、序列、目錄、同義詞、資料庫使用者、儲存過程、函式、觸發器等。
同義詞
同義詞是現有資料庫物件的一個別名。
- 簡化SQL語句
- 隱藏物件的名稱和所有者
同義詞分為私有和公有的
--建立同義詞得通過sys進行授權
grant create [any] synonym to $username$; --授權,建立私有同義詞
grant create public synonym to $username$;--授權,建立公有同義詞
私有:只有當前使用者才能使用
--建立私有同義詞
create [or replace] synonym 同義詞名稱 for 物件(如:表,檢視等);
drop synonym $同義詞名$; --刪除同義詞
create or replace synonym emp for employee;
公有:全部的使用者都能使用
--建立公有同義詞
create [or replace] public synonym 同義詞名稱 for 物件(如:表);
drop public synonym $同義詞名$;--刪除同義詞
create or replace public synonym emp for employee;
序列
序列是用於生成唯一、連續序號的物件,如:1,2,3.......
作用:
序列常用於生成表的主鍵值、唯一鍵的值以及需要連續序號的場合。
補充:
序列可以是升序的,也可以是降序的。
一個序列產生的值可以同時供多個表使用,如果有這個需要的話。
建立序列:
--語法
CREATE SEQUNCE 序列名
START WITH 初始值
【INCREMNT BY 步長】 --步長為負數,則是降序
【MAXVALUE 最大值】
【MINVALUE 最小值】
【CYCLE/NOCYCLE】
【CACHE/NOCACH】預設oracle快取20個序列值
create sequence emp_seq
start with 1;
select emp_seq.nextval from dual;
--先執行,序列才會有資料,從1開始,步長預設為1,執行一次,序列的當前數值就會自加1
slect emp_seq.currval from dual;--返回當前的數值
--建立序列
create sequence emp_seq
start with 8001; --沒加increment by 預設步長為1
--最初建立序列時初始值是沒有的,第一次訪問序列必須先訪問它的nextval屬性
select emp_seq.nextval from dual;
select emp_seq.nextval,emp_seq.currval from dual;
--修改序列,不能修改初始值(start with x)
select max(empno) from emp;
--刪除序列
drop sequence emp_seq;
--在插入時使用序列來生成主鍵值
insert into employee(empno,ename,job,sal) values(emp_seq.NEXTVAL, 'james','CLERK',3999);
--生成序列的下一個值
select emp_seq.nextval from dual;
--訪問序列的當前值
select 'XYZ-'||emp_seq.currval from dual;
檢視
檢視,被稱為虛擬表,可以簡化select語句
作用:
- 提供了另外一種級別的表安全性
- 隱藏的資料的複雜性
- 簡化的使用者的SQL語句
- 隔離基表(建立檢視時用到的表)結構的改變
- 通過重新命名列,從另一個角度提供資料
- 資料獨立性
和之前的序列一樣,需要sys進行授權
grant create view to $username$
--相當於複製一個表
create view emp_view as select * from employee
--隱藏了其他的屬性,只顯示員工編號,姓名以及部門
create view emp_view as select empno,ename,deptno from employee
--複雜查詢的結果當成一個表
--列出薪金高於公司平均薪金的所有員工,所在部門,上級領導,和工資等級
--如果需要使用當前的結果,使用select語句就簡單許多
create or replace view emp_sal_vw
as
select e.empno,
e.ename,
d.dname dept_name,
m.empno as mgrNo,
m.ename as manager,
s.grade
from employee e,
employee m,
department d,
salgrade s
where e.mgr=m.empno(+)
AND e.deptno=d.deptno
AND e.sal>(select avg(sal) from employee)
AND e.sal BETWEEN s.losal AND s.hisal;
索引
查詢時候資料量大的時候,通過索引可以提高查詢的效率(百萬條資料級別),在常用的列名(欄位)建立索引
--建立索引
create [unique] index $indexName$ on $tablename$(列名1,列名2...)
唯一索引和普通索引
索引有唯一索引和普通索引,如在多個列上建立索引則成為組合索引
唯一索引一般在創表的時候,把某列設定某個主鍵,系統就會自動為該列建立唯一索引
--普通索引
create index hiredate_idx on employee(hiredate);
--組合索引
create index emp_comp on employee(mgr,deptno);
--組合索引的順序可以是任意的,不過,此順序會影響查詢的時候是否會啟用索引查詢
--下面兩條是會啟用索進行查詢
select mgr,deptno from employee;
select mgr from employee;
--下面兩條是會不會啟用索進行查詢
select deptno from employee;
select deptno,mgr from employee;
函式索引
create index emp_job_fun on employee(lower(job));
--不啟用索引查詢
select * from employee where job='CLERK';
--啟用索引查詢
select * from employee where lower(job)='clerk';