视图、序列、索引、同义词

一、视图
语法:
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view
[(alias[, alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY];
1、简单视图:

创建视图:
SQL> create view test_view as select * from emp where deptno=10;
查询视图:
SQL> select * from test_view;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7782 CLARK MANAGER 7839 09-6月 -81 2450 10
7839 KING PRESIDENT 17-11月-81 5000 10
7934 MILLER CLERK 7782 23-1月 -82 1300 10
查看视图结构:
SQL> DESC TEST_VIEW;

2、创建复杂视图

SQL> CREATE VIEW AVG_SAL_COMM AS 
SELECT DNAME 部门名称,D.DEPTNO 部门编号,COUNT(ENAME) 部门总人数,ROUND(AVG(NVL(SAL,0)),2) 部门平均工资,ROUND(AVG(NVL(COMM,0)),1) 部门平均资金 
FROM EMP E RIGHT JOIN DEPT D 
ON E.DEPTNO=D.DEPTNO 
GROUP BY DNAME,D.DEPTNO
ORDER BY D.DEPTNO; 
SQL> SELECT * FROM AVG_SAL_COMM;

部门名称 部门编号 部门总人数 部门平均工资 部门平均资金
-------------- ---------- ---------- ------------ ------------
ACCOUNTING 10 3 2916.67 0
RESEARCH 20 5 2175 0
SALES 30 6 1566.67 366.7
OPERATIONS 40 0 0 0
testSEQ 94 0 0 0

3、在视图定义中,可以使用WITH READ ONLY选项来保证该视图上不能进行DML操作.

4、删除视图
DROP VIEW VIEW_NAME;

二、序列
1、创建序列
--创建一个名称为 DEPT_DEPTNO的序列值,以用于DEPT表.不要设置 CYCLE 选项.

CREATE SEQUENCE DEPT_DEPTNO
INCREMENT BY 1
START WITH 91
MAXVALUE 100
NOCACHE --CACHE(缓冲)定义存放序列的内存块的大小,默认为20。NOCACHE表示不对序列进行内存缓冲。对序列进行内存缓冲,可以改善序列的性能。
NOCYCLE;
/*NEXTVAL 返回下一个可用的序列值,每访问一次,将产生一个新的值。. CURRVAL 返回当前的序列值.只有当NEXTVAL被访问之后,
CURRVAL伪列才能包含一个值.所以刚创建好的序列,第一次访问CURRVAL时报错。必须先访问NEXTVAL再访问CURRVAL。*/

2、序列的使用及查询

SQL> SELECT DEPT_DEPTNO.CURRVAL FROM DUAL;
SELECT DEPT_DEPTNO.CURRVAL FROM DUAL
*1 行出现错误:
ORA-08002: 序列 DEPT_DEPTNO.CURRVAL 尚未在此会话中定义
SQL> SELECT DEPT_DEPTNO.NEXTVAL FROM DUAL;

NEXTVAL
----------
91

SQL> SELECT DEPT_DEPTNO.CURRVAL FROM DUAL;

CURRVAL
----------
91
SQL>
--使用序列向表DEPT中插入数据
SQL> insert into dept values(dept_deptno.nextval,'testSEQ','testLOC');

已创建 1 行。

--如果一个序列是以 NOCACHE选项建立的, 那么可以通过查询USER_SEQUENCES 表来查看下一个可用的序列值,而不会使序列的当前值增加.
SQL> SELECT * FROM USER_SEQUENCES;

SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ---------- ------------ - - ---------- -----------
DEPT_DEPTNO 1 100 1 N N 0 95

SQL>
=========
SELECT * FROM ALL_SEQUENCES;
SELECT * FROM DBA_SEQUENCES;

3、修改序列
可以更改序列的增量值、最大值、最小值、循环或者缓存选项。不能修改序列的初始值,否则会报错:ORA-02283: 无法变更启动序列号
ALTER SEQUENCE DEPT_DEPTNO INCREMENT BY 2;
ALTER SEQUENCE DEPT_DEPTNO MAXVALUE 200;

4、删除序列
DROP SEQUENCE SEQUENCE_NAME;
三、索引
1、创建索引
自动创建:当在创建表时,如果指定了 PRIMARY KEY或者 UNIQUE约束,那么将自动创建索引.
手动创建:用户可以在某个列上建立非唯一的索引,以加快基于该行的查询.
CREATE INDEX index_name
ON table (column[, column]...);
--创建索引,以提高对表EMP的ENAME列的访问速度.
CREATE INDEX EMP2_ENAME_IDX ON EMP2(ENAME);
--什么时候创建索引
欲创建索引的列在 WHERE子句或者连接条件中频繁使用.
该列所包含的不同值很多.
该列包含大量的空值.
表中的数据行数非常大,而且只有 2–4% 数据行被查询出来.
--什么时候没必要创建索引
表是空的.
列在查询条件中不经常使用.
大多数基于该表的查询,所查询出的数据量远多于2–4% 行.
表被频繁修改.

2、查看索引
USER_INDEXES 数据字典视图包含用户创建的索引的名字和它唯一性.
USER_IND_COLUMNS 视图包含索引的名字、表名、列名.

SELECT ic.index_name, ic.column_name,
ic.column_position col_pos,ix.uniqueness
FROM user_indexes ix, user_ind_columns ic
WHERE ic.index_name = ix.index_name
AND ic.table_name = 'EMP2';

3、基于函数的索引
基于函数的索引也就是基于表达式的索引.
索引表达式由表的列、常量、 SQL函数或者用户自定义函数组成.
SQL> CREATE TABLE test (col1 NUMBER);
SQL> CREATE INDEX test_index on test(col1,col1+10);
SQL> SELECT col1+10 FROM test;

4、删除索引
要删除一个索引,必须是索引的拥有者,或者具有 DROP ANY INDEX的权限.
从数据字典中删除 EMP_ENAME_IDX 索引.
SQL> DROP INDEX EMP2_ENAME_IDX;
索引已删除。

四、同义词
通过创建一个同义词 (对象的另一个名字)来简化对数据库中对象的存取. 缩短了对象的名字长度.
CREATE [PUBLIC] SYNONYM synonym
FOR object;
例:为视图QUERY_TABSPACE创建一个简短的名字Q_SPACE;

创建视图:
CREATE VIEW QUERY_TABSPACE AS (SELECT /*+NO_MERGE(A) NO_MERGE(B)*/B.TABLESPACE_NAME 表空间名称, ROUND((B.BYTES/1024)/1024,2) 总空间大小MB,
NVL2(A.BYTES,ROUND((B.BYTES-NVL(A.BYTES,0))/1024/1024,2),B.BYTES) 已使用大小MB,
NVL2(A.BYTES,ROUND(NVL(A.BYTES,0)/1024/1024,2),0) 未使用大小MB,
NVL2(A.BYTES,TO_CHAR(ROUND(((B.BYTES-NVL(A.BYTES,0))/B.BYTES)*100,2),'990.0'),'100')||'%' 已使用率
FROM (SELECT TABLESPACE_NAME,SUM(BYTES) BYTES FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME)A,
(SELECT TABLESPACE_NAME,SUM(BYTES) BYTES FROM DBA_DATA_FILES GROUP BY TABLESPACE_NAME) B
WHERE B.TABLESPACE_NAME=A.TABLESPACE_NAME(+))
查询视图:
SELECT * FROM QUERY_TABSPACE;
创建同义词:
CREATE SYNONYM Q_SPACE FOR QUERY_TABSPACE;
查询同义词:
SELECT * FROM Q_SPACE;
删除同义词
DROP SYNONYM Q_SPACE;
原文地址:https://www.cnblogs.com/rusking/p/4155844.html