其他數據庫對象
數據庫對象種類
視圖
視圖介紹
視圖的優點
限制數據訪問
簡化複雜查詢
提供數據的相互獨立
同樣的數據,可以有不同的顯示方式
創建視圖語句
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view
[(alias[, alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY [CONSTRAINT constraint]];
修改視圖語句
CREATE OR REPLACE VIEW empvu80
(id_number, name, sal, department_id)
AS SELECT employee_id, first_name || ' ' || last_name,
salary, department_id
FROM employees
WHERE department_id = 80;
屏蔽DML操作
刪除視圖
刪除視圖只是刪除視圖的定義,並不會刪除基表的數據
DROP VIEW view;
視圖示例
2 as
3 select empno,ename,sal,sal*12 annlsal ,sal*12+nvl(comm,0) income from emp;
SQL> show user
USER 爲 "SCOTT"
SQL> /
視圖已創建。
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
EMP10 TABLE
EMP20 TABLE
TESTSAVEPOINT TABLE
TESTDELETE TABLE
BIN$91xa7gtoQfiGlzbFlex5HQ==$0 TABLE
TEST3 TABLE
MYPERSON TABLE
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
EMPINCOMEVIEW VIEW
已選擇12行。
SQL> desc EMPINCOMEVIEW
名稱 是否爲空? 類型
----------------------------------------------------------------------------------- -------- --------------------------------------------------------
EMPNO NOT NULL NUMBER(4)
ENAME VARCHAR2(10)
SAL NUMBER(7,2)
ANNLSAL NUMBER
INCOME NUMBER
SQL> select * from 名稱 是否爲空
2 ----------------------------------------------------------------------------------- -------
3 EMPNO NOT NUL
4 ENAME
5 SAL
6 ANNLSAL
7 INCOME
8 ;
EMPNO NOT NUL
*
第 3 行出現錯誤:
ORA-00933: SQL 命令未正確結束
SQL> select * from EMPINCOMEVIEW;
EMPNO ENAME SAL ANNLSAL INCOME
---------- ---------- ----- ---------- ----------
7369 SMITH 800 9600 9600
7499 ALLEN 1600 19200 19500
7521 WARD 1250 15000 15500
7566 JONES 2975 35700 35700
7654 MARTIN 1250 15000 16400
7698 BLAKE 2850 34200 34200
7782 CLARK 2450 29400 29400
7788 SCOTT 3000 36000 36000
7839 KING 5000 60000 60000
7844 TURNER 1500 18000 18000
7876 ADAMS 1100 13200 13200
EMPNO ENAME SAL ANNLSAL INCOME
---------- ---------- ----- ---------- ----------
7900 JAMES 950 11400 11400
7902 FORD 3000 36000 36000
7934 MILLER 1300 15600 15600
已選擇14行。
SQL> host cls
序列
什麼是序列?
序列: 可供多個用戶用來產生唯一數值的數據庫對象
定義序列語句
CREATE SEQUENCE sequence
[INCREMENTBY n]
[START WITH n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}];
創建序列
CREATE SEQUENCE dept_deptid_seq
INCREMENT BY 10
START WITH 120
MAXVALUE 9999
NOCACHE
NOCYCLE;
查詢序列
SELECT sequence_name, min_value, max_value,
increment_by, last_number
FROM user_sequences;
NEXTVAL和CURRVAL僞列
修改序列
修改序列的增量, 最大值, 最小值, 循環選項, 或是否裝入內存
ALTER SEQUENCE dept_deptid_seq
INCREMENT BY 20
MAXVALUE 999999
NOCACHE
NOCYCLE;
修改序列注意事項
刪除序列
序列語句實例
SQL> --序列
SQL> create sequence myseq;序列已創建。
SQL> create table testseq
2 (tid number,tname varchar2(20));
表已創建。
SQL> --insert into testseq values( ,'aaa');
SQL> select myseq.currval from dual;
select myseq.currval from dual
*
第 1 行出現錯誤:
ORA-08002: 序列 MYSEQ.CURRVAL 尚未在此會話中定義
SQL> select myseq.nextval from dual;
NEXTVAL
----------
1
已選擇 1 行。
SQL> insert into testseq values(myseq.nextval ,'aaa');
已創建 1 行。
SQL> insert into testseq values(myseq.nextval ,'aaa');
已創建 1 行。
SQL> /
已創建 1 行。
SQL> select * from testseq;
TID TNAME
---------- --------------------
2 aaa
3 aaa
4 aaa
已選擇3行。
SQL> select myseq.currval from dual;
CURRVAL
----------
4
已選擇 1 行。
SQL> hostcls
SP2-0042: 未知命令 "hostcls" - 其餘行忽略。
SQL> host cls
索引
索引:
創建索引
CREATE INDEXindex
ON table(column[,column]...);
CREATE INDEX emp_last_name_idx
ON employees(last_name);
Index created.
何時創建索引
以下情況可以創建索引:
l列中數據值分佈範圍很廣
l列經常在WHERE
子句或連接條件中出現
l表經常被訪問而且數據量很大,訪問的數據大概佔數據總量的2%到4%
何時不要創建索引
下列情況不要創建索引:
l表很小
l列不經常作爲連接條件或出現在WHERE子句中
l查詢的數據大於2%到4%
l表經常更新
查詢索引
SELECT ic.index_name, ic.column_name,
ic.column_positioncol_pos,ix.uniqueness
FROM user_indexes ix, user_ind_columns ic
WHERE ic.index_name = ix.index_name
AND ic.table_name = 'EMPLOYEES';
刪除索引
DROP INDEX index;
DROP INDEX upper_last_name_idx;
索引語句示例
SQL> --索引
SQL> create index myindex on emp(deptno,job);索引已創建。
SQL> --同義詞:別名
SQL> show user
USER 爲 "SCOTT"
SQL> select count(*) from hr.EMPLOYEES;
select count(*) from hr.EMPLOYEES
*
第 1 行出現錯誤:
ORA-00942: 表或視圖不存在
SQL> /
COUNT(*)
----------
107
已選擇 1 行。
同義詞
爲何使用同義詞
使用同義詞訪問相同的對象:
l方便訪問其它用戶的對象
l縮短對象名字的長度
創建和刪除同義詞
CREATE SYNONYM d_sum
FOR dept_sum_vu;
DROP SYNONYM d_sum;
同義詞語句實例
create synonym hremp for hr.EMPLOYEES
*
第 1 行出現錯誤:
ORA-01031: 權限不足
SQL> /
同義詞已創建。
SQL> select count(*) from hremp;
COUNT(*)
----------
107
已選擇 1 行。
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
EMP10 TABLE
EMP20 TABLE
TESTSAVEPOINT TABLE
TESTDELETE TABLE
BIN$91xa7gtoQfiGlzbFlex5HQ==$0 TABLE
TEST3 TABLE
MYPERSON TABLE
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
EMPINCOMEVIEW VIEW
TESTSEQ TABLE
HREMP SYNONYM
已選擇14行。
SQL> spool off