資料庫對象 用戶模式:指資料庫用戶所創建和存儲數據對象的統稱。在訪問其它用戶模式的資料庫對象時需加上用戶模式。 如:scott.emp, scott.dept等。 資料庫對象包括:表、視圖、索引、序列、目錄、同義詞、資料庫用戶、存儲過程、函數、觸發器等。 同義詞 同義詞是現有資料庫對象的一個別名。 ...
資料庫對象
用戶模式:指資料庫用戶所創建和存儲數據對象的統稱。在訪問其它用戶模式的資料庫對象時需加上用戶模式。
如: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';