zoukankan      html  css  js  c++  java
  • Oracle笔记(十三) 视图、同义词、索引

    一、视图

    在之前所学习过的所有的SQL语法之中,查询操作是最麻烦的,如果程序开发人员将大量的精力都浪费在查询的编写上,则肯定影响代码的工作进度,所以一个好的数据库设计人员,除了根据业务的操作设计出数据表之外,还需要为用户提供若干个视图,而每一个视图包装了一条条复杂的SQL语句,视图的创建语法如下:

    CREATE [OR REPLACE] VIEW 视图名称
      AS 子查询;

    范例:创建一张视图

    CREATE VIEW myview AS
      SELECT d.deptno,d.dname,d.loc,COUNT(e.empno) count,AVG(e.sal) avg
      FROM emp e,dept d
      WHERE e.deptno(+)=d.deptno
      GROUP BY d.deptno,d.dname,d.loc;

    现在已经创建好了一张视图,名称为myview,所以现在查询myview:

    SELECT * FROM myview;

    此时通过一个简单的视图查询操作,就可以完成之前的复杂SQL语句的功能,所以视图就是包装了SQL查询操作。

    范例:创建一张包含简单查询语句的视图

    DROP VIEW myview;
    CREATE VIEW myview AS
      SELECT * FROM emp WHERE deptno=20;

    可是以上的操作实际上是属于一个视图的替换操作,所以此时也可以使用另外一种语法:

    CREATE OR REPLACE VIEW myview AS
      SELECT * FROM emp WHERE deptno=20;

    此时表示的是,如果视图存在则替换,不存在则创建一张新的视图,视图的概念虽然好理解,但是在创建视图的时候存在两个选项。

    • 选项一:WITH CHECK OPTION

    上面所创建的视图,是存在一个创建条件的“WHERE deptno=20”,那么如果现在更新视图中的这个条件呢?

    UPDATE myview SET deptno=30 WHERE empno=7369;

    此时更新的是一张视图,但是视图本身并不是一个具体的数据表,而且现在更新的操作又是视图的创建条件,很明显这样的做法不可取,所以此时为了解决这个问题,可以加入WITH CHECK OPTION;

    CREATE OR REPLACE VIEW myview AS
      SELECT * FROM emp WHERE deptno=20
      WITH CHECK OPTION;

    此时再次执行视图的更新操作,出现以下错误提示:

    ORA-01402: 视图 WITH CHECK OPTIDN where 子句违规

    意味着现在根本就不能去更新视图的创建条件。

    • 选项二:WITH READ ONLY

    虽然使用WITH CHECK OPTION可以保证视图的创建条件不被更新,但是其他的字段却允许更新。

    UPDATE myview SET sal=9000 WHERE empno=7369;

    与之前的问题一样,视图本身不是具体的真实数据,而是一些查询语句,所以这样的更新并不合理,那么在创建视图的时候建议将其设置为只读视图:

    CREATE OR REPLACE VIEW myview AS
      SELECT * FROM emp WHERE deptno=20
      WITH READ ONLY;

    此时再次发出更新的操作,则直接提示如下错误:

    ORA-01733: 此处不允许虚拟列

    而且一定要注意的是,以上给出的是一个简单的操作语句视图,如果现在视图中的查询语句是统计操作,则根本就不可能更新。

    CREATE OR REPLACE VIEW myview AS
      SELECT d.deptno,d.dname,d.loc,COUNT(e.empno) count,AVG(e.sal) avg
      FROM emp e,dept d
      WHERE e.deptno(+)=d.deptno
      GROUP BY d.deptno,d.dname,d.loc;

    现在的信息是统计而来的,根本就不可能更新。

    在一个项目之中,视图的数量有可能超过表的数量,因为查询语句会很多的。

    二、同义词

    同义词就是意思相近的一组词语,对于同义词的操作之前一直在使用,例如,现在有如下一个查询语句:

    SELECT SYSDATE FROM dual;

    在之前说过“dual”是一张虚拟表,但是虚拟表也肯定应该有它的用户,经过查询可以发现,这张表是属于SYS用户的,但是这个时候就出现一个问题,在之前讲解过,不同的用户要想访问其他用户的表,则需要写上“用户.表名称”,那么为什么此时scott用户访问的时候直接使用dual即可,而不是使用“sys.dual”呢,这个实际上就是同义词的应用,dual表示的是sys.dual的同义词,而同义词在Oracle之中称为SYNONYM,同义词的创建语法如下:

    CREATE [PUBLIC] SYSNONYM 同义词的名称 FOR 用户名.表名称;

    范例:下面创建一个同义词为myemp,此同义词指向scott.emp

    CREATE SYNONYM myemp FOR scott.emp;

    此时创建成功之后,以后在sys用户中就可以使用myemp这个同义词的名称了,但是这个同义词只适合sys用户一个人使用,其他用户无法使用,因为创建的时候没有使用PUBLIC,如果没有使用,则表示创建的不是公共同义词。

    范例:创建公共同义词

    CONN sys/change_on_install AS SYSDBA;
    DROP
    SYNONYM myemp; CREATE PUBLIC SYNONYM myemp FOR scott.emp;
    CONN system/manager;
    SELECT * FROM myemp;

    但是同义词也只是Oracle自己的概念,知道就行了。

    三、索引

    索引的主要功能就是用于提升数据库的操作性能。

    下面通过代码分析一个最简单的索引操作的问题;

    例如,在之前曾经写过如下的操作语句:

    SELECT * FROM emp WHERE sal>1500;

    此时由于在sal上没有设置索引,所以它的查询过程是采用逐行判断的方式完成的,这种操作随着数据量的上升,则性能会出现越来越多的问题,但是如果说将数据排列一下呢?

    例如,现在将工作在内存之中形成这样的一种数据结构;

    如果现在假设所有的数据都排列成以上的树形结构的话,同样的查询,现在还会查询全部记录吗?只会查询部分。

    在Oracle之中创建索引有以下两种方式:

    • 主键约束:如果一张表中的列上存在了主键约束的话,自动创建索引;
    • 手工创建:在某一个操作列上指定一个索引;

    范例:在emp.sal字段上创建索引

    CREATE INDEX emp_sal_ind ON emp(sal);

    虽然索引创建完成了,但是要想观察出特点基本上是不可能的。

    但是这种索引有一个最大的问题,即:如果要想实现性能的提高,则必须始终维持以上的一棵树,那么如果说现在这棵树上的数据需要频繁修改的话,则代码的性能肯定会有所降低。

    所以一般索引只使用在不会频繁修改的表中,而如果一张表上频繁修改数据且又使用了索引的话,性能肯定会严重降低,所以性能的揽永远都是相对的。

    以上的索引只是Oracle十几种索引中的一种,也是最简单的一种,称为B树索引,还有位图索引,反向索引,函数索引等等。

  • 相关阅读:
    vue-递归 组件嵌套组件循环 附加:(项目中可以用form来提交 或者 v-model 绑定的提交)
    Vue-开卡充值 -轮询
    bootstrap3 三级下拉菜单
    【UOJ #50】【UR #3】—链式反应(生成函数+分治NTT/多项式Exp+常微分方程)
    【CSP-S 2019模拟】题解
    【洛谷P4233】— 射命丸文的笔记(竞赛图+多项式求逆)
    【LOJ #2264】「CTSC2017」吉夫特(Lucas定理+Dp)
    【LOJ #3120】「CTS2019 | CTSC2019」珍珠(生成函数+NTT)
    【LOJ #2541】「PKUWC2018」猎人杀(容斥+分治NTT)
    【LOJ #2346】「JOI 2016 Final」断层(线段树)
  • 原文地址:https://www.cnblogs.com/mchina/p/2678090.html
Copyright © 2011-2022 走看看