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树索引,还有位图索引,反向索引,函数索引等等。

  • 相关阅读:
    LeetCode 264. Ugly Number II
    LeetCode 231. Power of Two
    LeetCode 263. Ugly Number
    LeetCode 136. Single Number
    LeetCode 69. Sqrt(x)
    LeetCode 66. Plus One
    LeetCode 70. Climbing Stairs
    LeetCode 628. Maximum Product of Three Numbers
    Leetcode 13. Roman to Integer
    大二暑假周进度报告03
  • 原文地址:https://www.cnblogs.com/lcword/p/5711792.html
Copyright © 2011-2022 走看看