`
changhongbao
  • 浏览: 117601 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

Oracle笔记(十三) 视图、同义词、索引

 
阅读更多

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

分享到:
评论

相关推荐

    Oracle 入门文档2

    Oracle笔记 五、创建表、约束、视图、索引、序列、同义词、表空间 Oracle笔记 六、PL/SQL简单语句块、变量定义 Oracle笔记 七、PL/SQL 异常处理 Oracle笔记 八、PL/SQL跳转/判断/循环语句块 Oracle笔记 九、PL/...

    Oracle 入门文档

    Oracle笔记 五、创建表、约束、视图、索引、序列、同义词、表空间 Oracle笔记 六、PL/SQL简单语句块、变量定义 Oracle笔记 七、PL/SQL 异常处理 Oracle笔记 八、PL/SQL跳转/判断/循环语句块 Oracle笔记 九、PL/...

    oracle学习笔记(从入门到精通)

    06-同义词和序列学习笔记.txt 07-视图和索引学习笔记.txt 08-PLSQL和游标结合学习笔记.txt 09-游标学习笔记.txt 10-重要的函数的学习笔记.txt 11-存储过程学习笔记.txt 12-触发器学习笔记.txt 13-pl编码.txt

    6索引视图序列同义词锁数据字典动态视图笔记.sql

    小白必看!

    Oracle 10g 学习笔记

    │ 小功能,大作用 --- Oracle里的关键字& - 三十而立专栏 - CSDN博客.mht │ 经典SQL语句收集(ORACLE).mht │ 融会贯通Oracle数据库的25条基本知识.txt │ 详细讲解Oracle服务器的常用命令行.mht │ └─资料 ...

    Oracle数据库学习笔记

    Oracle数据库学习笔记,包括课程PPT(数据库基础,简单查询,单行多行函数,多表连接,子查询,高级子查询,集合运算,层次查询,DML与事务控制,数据库的网络连接,创建维护表,约束,视图,序列索引和同义词,用户...

    oracle所有知识点笔记(全)

    这是我自己学习oracle的时候,写的代码案例和笔记,基本上每一个知识点都写的很清楚!大家可以作为参考!...运算符,多表联查,排序,组函数,序列,索引,同义词, 约束,创建和管理表,单行函数,过滤数据等等

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 第一章 Oracle入门 一、 数据库概述 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前。简单来说是本身可视...

    oracle初学者笔记

    Oracle SQL语句查询,事务操作,安全管理,企业管理器,pl-sql, sql plus工具,表空间,表与约束管理,查询训练,存储过程与函数,视图,索引,同义词与表分区,游标

    数据库操作处理笔记

    一、表空间的操作 二、用户、角色、权限 三、表操作 ...七、同义词操作八、dblink操作 九、Sequences操作 十、数据库必须掌握的技巧 十一、oracle锁管理 十二数据库备份和迁移 十三oracle性能调优问题

    Navicat Premium操作手册.7z

    3Oracle 外部表访问参数59Oracle 索引组织表59Oracle 索引组织表选项59Oracle 视图60Oracle 函数或过程61Oracle 数据库链接62Oracle 索引63Oracle Java65Oracle 实体化视图66Oracle 实体化视图日志68Oracle 包69...

    oracle学习笔记(三)

    1、创建表语法 create table 表名(column datatype [default expr][,column …]) default 约束 说明略 2、利用子查询创建表 create table 表名 as select * from u表 二、修改表 1、添加一个新列 oracle:alter ...

    Oracle 教程电子书 3本压缩 精心推荐

    第十七章 序列、同义词 ............................................................................................................... 65 第十八章 PL SQL ..................................................

Global site tag (gtag.js) - Google Analytics