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

时间: 2024-10-11 21:35:31

Oracle笔记(十三) 视图、同义词、索引的相关文章

oracle 序列、视图、索引

序列 创建 在sequences里 作用 生成自动增长(或减少)的整数值 经常添加数据时使用,可控性好 写法:序列名.nextval  获取下一个序列值 序列名.currval  获取当前序列值,不常用. 视图 在物理表的基础上定义的虚拟表 创建 在views里 作用: 把复杂的查询逻辑以视图的形式保存起来,便于查询结果的重用 一般用来查询数据,不用来做数据更新 常用于系统的兼容或迁移 视图不能添加索引,适合数据量小的查询语句 创建视图 写法:select * from 视图名字 物化视图 对普

Oracle 笔记之视图

1.什么是视图? 视图(VIEW)也被称为虚表,即虚拟的表,是一组数据的逻辑表达 视图对应于一条SELECT语句,结果集被赋予一个名字, 即视图名字 视图本身不包含任何数据,只是映射到基表的一个查询语句,当基表数据发生变化,视图数据也随之发送变化 作用:重用代码,保护数据 2.创建视图 需要有权限 GRANT CREATE VIEW  TO user scott; CREATE VIEW view_name 别名 不包含函数 叫简单视图 包含函数 表达式 复杂视图 基于多个表 连接视图 OR R

Oracle笔记 十三、PL/SQL面向对象之package

--将方法和过程用包定义 create or replace package pkg_emp as --输入员工编号查询出员工信息 procedure pro_findInfo( in_empno emp2.empno%type, out_name out emp2.ename%type, out_sal out emp2.sal%type ); --根据部门编号修改本部门员工工资 procedure pro_editInfo( in_emp_record emp2%rowtype, out_f

Oracle笔记 目录索引

Oracle笔记 一.oracle的安装.sqlplus的使用 Oracle笔记 二.常用dba命令行 Oracle笔记 三.function .select Oracle笔记 四.增删改.事务 Oracle笔记 五.创建表.约束.视图.索引.序列.同义词.表空间 Oracle笔记 六.PL/SQL简单语句块.变量定义 Oracle笔记 七.PL/SQL 异常处理 Oracle笔记 八.PL/SQL跳转/判断/循环语句块 Oracle笔记 九.PL/SQL 游标的使用 Oracle笔记 十.PL

Oracle学习(十):视图,索引,序列号,同义词

1.知识点:可以对照下面的录屏进行阅读 视图,序列,索引,同义词 SQL> --视图:虚表 SQL> --视图的优点:简化复杂查询,限制数据访问(银行用的多),提供数据的相互独立,同样的数据可以有不同的显示方式 SQL> --第一个视图: 员工号 姓名 月薪 年薪 SQL> create view view1 2 as 3 select empno,ename,sal,sal*12 annlsal from emp; SQL> --如果显示没有权限,则需要授权,见下图1-1

Oracle实践--PL/SQL基础之视图和索引

PL/SQL基础入门之视图和索引         PL/SQL:过程语言(Procedure  Language)和结构化语言(Structured Query Language)结合而成的编程语言,是对SQL的扩展,支持多种数据类型,如大对象和集合类型,可使用条件和循环等控制语句,可创建存储过程,程序包和触发器等,给sql语句的执行添加程序逻辑,与Oracle服务器和Oracle工具紧密集成,具有可移植性,灵活性和安全性. -----------------------------------

oracle视图和索引

视图和索引 视图 视图的作用 控制数据访问.简化查询.避免重复访问相同的数据 视图的优点 限制用户只能通过视图检索数据,用户看不到底层基表 注意事项 视图可以理解为临时表,会随着真实表的数据变化而自动变化 视图的名字以V_开头,表明是视图; 视图不提高任何效率 视图不占用空间 不是所有的视图都能更改(若改动能对应的原来的表,则可以,否则不可以,比如用了聚合函数的,或者group by而来的) 简单视图 语法 create or replace view 视图名 as select 语句; cre

转:oracle笔记

oracle笔记1 卸载oracle developer server的方法: 1-1 oracle卸载工具中卸载对应的oracleds项目:在注册表中搜索ORACLEDS HOME对应的别名,删除对应的项:重新启动计算机:删除对应的ORACLEDS的安装目录: 2jinitiator的相关问题: 2-1 jinitiator是oracle自己的applet viewer工具: 2-2 在第一次打开web应用程序时会自动提示安装该程序,如果不安装则无法打开程序: 2-3 jinitiator是在

[转]Oracle DB 性能视图和数据字典

动态性能视图 用于访问实例内存结构不断变化的状态信息. 在Oracle DB 中还维护着一个关于数据库实例操作和性能的动态数据集.这些动态性能视图以基于数据库服务器内部的内存结构构建的虚拟表为基础.也就是说,这些视图不是驻留在数据库中的传统意义上的表.这就是为什么部分视图在数据库装载或打开之前就能够使用的原因. 动态性能视图包含下列信息: ? 会话 ? 文件状态 ? 作业和任务的进度 ? 锁 ? 备份状态 ? 内存使用率和内存分配 ? 系统参数和会话参数 ?SQL 执行 ? 统计数据和度量 注: