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


    一、视图
    语法:
    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;
  • 相关阅读:
    RHEL虚机分区在线扩容操作指导说明
    Kafka vs AMQ技术比对
    数据库选型之MySQL vs ElasticSearch
    JAVA ElasticSearch 访问控制最佳解决方案
    EFS解密----未重装系统
    EFS加密解密----重装系统后
    EXCEL表格单元格中包含数字英文和汉字,如何自动去掉汉字,保留英文和数字
    excel如何用公式判断单元格的值是否为数字、英文、中文,以及相应的计数
    EXCEL计算数字、汉字、英文单元格的计数
    sql基本操作
  • 原文地址:https://www.cnblogs.com/rusking/p/4155844.html
Copyright © 2020-2023  润新知