--==============================================================
视图
视图是数据库中 特有的对象。 视图用于存储查询, 但不会存储数据(物化视图除外)。这是视图和数据表的重要区别。 可以利用视图进行查询、插入、更新和删除数据。
Oracle 中 有4 中视图:
1. 关系视图
2. 内嵌视图
3. 对象视图
4. 物化视图
-- 关系视图 : 关系视图 是 四种视图中最简单, 同时也是最常用的视图。 我们可以将关系视图看作对简单或复杂的查询的定义。 它的输出可以看作一个虚拟的表, 该表的数据是由其他基础数据表提供的。
由于关系视图并不存储真实的数据, 因此占用数据库资源也较少。
--先观察一下 源数据表 t_employees
SQL> select * from t_employees;
EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_SEX EMPLOYEE_SALARY STATUS WORK_YEARS FIRST_NAME LAST_NAME PROVINCE CITY LOCATION
----------- --------------- --------------- --------------- ---------- ---------- --------------- ---------- ---------- ---------- ----------------------------
107 NEW 1 小郭 东方 北京 北京市 朝阳区
101 zhangSan 男 6000 ACT 3 三 张 北京 北京市 朝阳区
102 liSi 男 5500 CNN 2 四 李 河北 秦皇岛 海港区
103 songyanjun 男 2000 EN 1 延军 宋 河北 秦皇岛 海港区
104 wangpeng 男 2000 ACT 1 朋 网 河北 秦皇岛 海港区
105 hanjipeng 男 2000 ACT 1 鹏 韩 河北 福宁 海港区
106 liangmingy 女 2000 NEW 1 雨 量 河北 福宁 海港区
108 wangErMaZi 男 123 jjj 3 而马子 王 廊坊 廊坊 不明
已选择8行。
-- 建立关系视图:
--1. 建立关系视图 create view vw_employees as select employee_id, last_name || first_name as employee_name, province || '-' || city as location from employees
SQL> create view vw_employees as select employee_id, last_name || first_name as employee_name, province || '-' || city as location from t_employees;
视图已创建。
--2. 查看视图定义 select text from user_views where view_name='VW_EMPLOYEES';
SQL> select text from user_views where view_name='VW_EMPLOYEES';
TEXT
--------------------------------------------------------------------------------
select employee_id, last_name || first_name as employee_name, province || '-' ||
--3. 查询刚创建的视图
SQL> select * from vw_employees;
EMPLOYEE_ID EMPLOYEE_NAME LOCATION
----------- ------------------------- ---------------------
107 东方小郭 北京-北京市
101 张三 北京-北京市
102 李四 河北-秦皇岛
103 宋延军 河北-秦皇岛
104 网朋 河北-秦皇岛
105 韩鹏 河北-福宁
106 量雨 河北-福宁
108 王而马子 廊坊-廊坊
已选择8行。
--======================
修改/删除 视图
--1. 修改视图(为视图 添加 新列 employee_salary) create or replace view vw_employees as select employee_id, last_name || first_name as employee_name, province || '-' || city as location, employee_salary from t_employees
SQL> create or replace view vw_employees as select employee_id, last_name || first_name as employee_name, province || '-' || city as location, employee_salary from t_emoyees;
视图已创建。
--2. 查询刚才修改的视图。
SQL> select * from vw_employees;
EMPLOYEE_ID EMPLOYEE_NAME LOCATION EMPLOYEE_SALARY
----------- ------------------------- --------------------- ---------------
107 东方小郭 北京-北京市
101 张三 北京-北京市 6000
102 李四 河北-秦皇岛 5500
103 宋延军 河北-秦皇岛 2000
104 网朋 河北-秦皇岛 2000
105 韩鹏 河北-福宁 2000
106 量雨 河北-福宁 2000
108 王而马子 廊坊-廊坊 123
已选择8行。
--3. 删除视图 drop view vw_employees;
SQL> drop view vw_employees;
视图已删除。
SQL>
联接视图:
--联接视图 在 上面的关系视图的举例中 我们 创建的视图 是基于 单个基础表的。 而在实际应用中, 大多数的视图是较为复杂的查询 。 这也是视图的一大优势, 封装复杂查询。
--例如:
--create or replace view vw_employee_salary as select e.employee_id, e.last_name || e.first_name employee_name, e.employee_salary+s.total_price*0.1 salary from employees e, t_sales s where e.employee_id=s.sale_by and s.sale_month='3月';
--我们先创建一个 类似的测试表 t_sales
-- Create table
create table T_SALES
(
sale_id NUMBER not null,
sale_by NUMBER,
sale_month VARCHAR2(10),
sale_day VARCHAR2(10),
sale_year VARCHAR2(10),
total_price NUMBER
)
tablespace SONGYANJUN
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
-- Create/Recreate primary, unique and foreign key constraints
alter table T_SALES
add constraint PK_SALE_ID primary key (SALE_ID)
using index
tablespace SONGYANJUN
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
--创建视图
SQL> create or replace view vw_employee_salary as select e.employee_id, e.last_name || e.first_name employee_name, e.employee_salary+s.total_price*0.1 salary from employees e, t_sales s where e.employee_id=s.sale_by and s.sale_month='3月';
视图已创建。
SQL> select * from vw_employee_salary;
EMPLOYEE_ID EMPLOYEE_NAME SALARY
----------- ------------------------- ----------
102 李四 5520
-- 编译视图
-- 编译视图 : 编译视图 依赖于 基础表的存在而存在,当初基础表进行了 结构上的调整, 有可能会对视图产生影响。 如欲再次使用该视图, 必须对视图进行重新编译。
--例如:alter view vw_employee_salary compile;
SQL> alter view vw_employee_salary compile;
视图已变更。
--使用 force 选项强制创建 视图
使用 force 选项强制创建 视图: 有时, 视图的基础表还没有创建, 但是仍然希望能够创建基于 不存在的数据表的视图。 这是因为, 数据表的预期创建这和视图的创建者并非同一用户。
视图创建这不希望 等待基础表创建这的工作完成之后 才进行 自己的工作。 假设, 此时视图创建者 已经对基础表的结构 有了清晰的概念, 例如: books 将被创建, 以存储 图书信息。
--例如: create or replace force view vw_ebooks as select book_name,author from ebooks;
SQL> create or replace force view vw_ebooks as select book_name,author from ebooks;
视图已创建。
SQL> select * from vw_ebooks;
BOOK_NAME AUTHOR
-------------------- ----------
Java编程宝典 张三
Java基础 李四
Java打飞机 王五
JavaScript基础 趙六
CshapBeNet 二狗子
Cshap编程 傻蛋
已选择6行。
--=====================================
利用视图 更新 数据表
--通过视图, 不但可以对 基础表中的数据进行查询, 而且可以对数据表中的数据进行更新。 更新的方式非常简单 : 直接更新视图中的数据即可将 对基础表 进行相应的更新。
--当然, 并非视图中的所有列都能够 进行更新, 并反射到基础表中, 只有那些直接由基础表 获得的列可以进行更新操作。
--例如 , 先头创建的 book_name 和 列 author; 而由基础表中的数据经过运算获得, 仅凭视图中的数据无法判断基础表中的数据情况的列, 不能进行更新, vw_employees 中的 name 列。
--select table_name, column_name, updatable, insertable, deletable from user_updatable_columns where table_name='VW_BOOKS';
--插入视图数据
--insert into vw_ebooks values ('千年一叹', '余秋雨')
--1. 我们先查一下 VW_EBOOKS 这个视图中的数据。
SQL> select * from vw_ebooks;
BOOK_NAME AUTHOR
-------------------- ----------
Java编程宝典 张三
Java基础 李四
Java打飞机 王五
JavaScript基础 趙六
CshapBeNet 二狗子
Cshap编程 傻蛋
已选择6行。
--2. 我们 在 更新这个视图中的数据。
SQL> update vw_ebooks set book_name='C#' where author='二狗子';
已更新 1 行。
-- 我们在查看 验证一下 是否 这个视图中的数据 变更了。
SQL> select * from vw_ebooks;
BOOK_NAME AUTHOR
-------------------- ----------
Java编程宝典 张三
Java基础 李四
Java打飞机 王五
JavaScript基础 趙六
C# 二狗子
Cshap编程 傻蛋
已选择6行。
--我们在看一下 实体表中的数据 是否 也 同样跟着 变更了。
SQL> set linesize 150;
SQL> select * from ebooks;
BOOKNO EID BOOKNAME BOOK_NAME AUTHOR
---------- ---------- ------------------------------ -------------------- ----------
1006 Java编程宝典 张三
1001 8 javaBook Java基础 李四
1002 8 javaBook Java打飞机 王五
1003 8 javaBook JavaScript基础 趙六
1004 6 c# Book C# 二狗子
1005 8 c# Book Cshap编程 傻蛋
已选择6行。
SQL>
-- OK , 这样就说明了 ,视图是 可以被 修改的。
--===============
with check option选项
--创建 视图时, with check option 是常用选项之一。 一旦使用了 该选项, 那么 Oracle将保证视图在数据库更新之后与更新之前呃结果集相同。
--create or replace view vw_books as select * from ebooks where bookno=1005;
SQL> create or replace view vw_books as select * from ebooks where bookno=1005;
视图已创建。
SQL> select * from vw_books;
BOOKNO EID BOOKNAME BOOK_NAME AUTHOR
---------- ---------- ------------------------------ -------------------- ----------
1005 8 c# Book Cshap编程 傻蛋
--update vw_books set bookno=1006;
SQL> update vw_books set book_id=1006;
已更新 1 行。
SQL> select * from vw_books;
BOOKNO EID BOOKNAME BOOK_NAME AUTHOR BOOK_ID
---------- ---------- ------------------------------ -------------------- ---------- ----------
1005 8 c# Book Cshap编程 傻蛋 1006
--create or replace view vw_books as select * from ebooks where book_id=1006 with check option
SQL> create or replace view vw_books as select * from ebooks where book_id=1005 with check option;
视图已创建。
SQL> select * from vw_books;
未选定行
--==============================
关系视图小结
1. 保障数据安全性
2. 数据整合
3. 数据透明性
--================================
内嵌视图
关系视图座位查询定义, 一旦创建, 既可存在于 数据库中, 并可被多次使用。 但有时 ,需要某个视图座位过度结果集, 但在一次使用之后, 便不再需要, 此时不宜创建关系视图。 因为关系视图占用数据库资源, 而且也会增加维护成本。 此时应该选择使用 内嵌视图。
-- 内嵌视图 简介:
-- 内嵌视图 也是 视图, 只是不会利用 create view 进行 显示创建 。 也不能 在数据库中查询到 其 相关信息。 一般情况下, 被嵌套在 查询语句中 使用, 因此称为 内嵌视图。 其功能类似于子查询。
-- 当然 , 内嵌视图 也可以 出现在更新、 插入和删除语句中。 内嵌视图具有临时性, 他只在 被嵌入语句的执行期间有效, 并可以在被嵌入语句的任何地方 使用该视图。
-- 内嵌视图的使用:
--1. 利用内嵌视图 进行查询 : select * from (select employee_id, last_name || first_name as employee_name, employee_salary from t_employees order by employee_salary desc) where rownum<=3; // rownum<=3 为取出 3行的数据
SQL> select * from (select employee_id, last_name || first_name as employee_name, employee_salary from t_employees order by employee_salary desc) where rownum<=3;
EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_SALARY
----------- ------------------------- ---------------
107 东方小郭
101 张三 6000
102 李四 5500
SQL>
--2. 利用 内嵌视图更新数据表
--。。。。。。。。
内嵌视图小结:
1. 内嵌视图与临时表、 关系视图的使用场景。
2. 分辨内嵌视图 与子查询。
--=============================
对象视图
对象视图: 数据库都是在关系型 数据库, 但是 , 面对对象编程的思想早已深入人心。 Oracle数据库不仅可以通过关系表来存储数据, 同样, 也可以创建对象, 以对象的方式进行数据存储。
--关系视图是由 关系表进行查询获得的, 而对对象视图则是对 对象机型查询获得的。
--对象视图简介:
--说道 对象视图 ,自然应该首先提到 对象。 Oracle中的对象 仍然是一个逻辑的概念, 虽然可以从对象中获取数据, 就像数据真实存储与对象中 一样。
--但是在对象的概念之下, 数据仍然是 存储与关系表中。 要创建对象, 首先要建立对象类型, 类似于 Java 或 C#中 类的概念。
--先创建一个 类似的表 吧
-- Create table
create table EMPLOYEES
(
employee_id NUMBER,
employee_name VARCHAR2(20),
location VARCHAR2(50),
first_name VARCHAR2(10),
last_name VARCHAR2(10),
province VARCHAR2(10),
city VARCHAR2(10),
salary NUMBER
)
tablespace SONGYANJUN
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64
minextents 1
maxextents unlimited
);
--之后插入了一条 测试数据 , 我们查询一下。
SQL> select * from employees;
EMPLOYEE_ID EMPLOYEE_NAME LOCATION FIRST_NAME LAST_NAME PROVINCE CITY SALARY
----------- -------------------- -------------------------------------------------- ---------- ---------- ---------- ---------- ----------
101 员工名字 东方明珠城B 延军 宋 河北 秦皇岛 2000
---====
-- 创建 和使用 对象 视图 : 利用 基础的对象类型 employee 来创建 对象视图。 那么视图中的列 将与 employee_type 中的属性保持 一致。
create type employee is object(employee_id number, employee_name varchar2(20), location varchar2(50), salary number)
create or replace view ov_employees of employee with object oid(employee_id) as select employee_id, last_name || first_name, province || city, salary from employees;
--=====
尼玛的, 为啥 无法执行啊, 我勒个去, 为什么执行成功了, 但是神马 都效果都没出来啊?????
--======
--=======================================
物化视图
前面所叙述的 三种 视图 : 关系视图、内嵌视图 和 对象视图, 实际头饰通过定制查询 , 并利用 查询定义来 获取 数据。 三种视图都不会直接存储数据, 每次 操作时, 都会进行 编译
--下面 描述一下 物化视图。
物化视图 简介:
物化视图 是物理化视图的简称, 顾名思义, 该视图存储实际数据, 因此, 会占用一定的数据库空间。 在这一点上, 更接近于 临时表。 但不像临时表那样在某个特定的时机 会 删除数据。
物化视图中 的数据 是 可以重用的, 因此, 经常应用与 读取频繁的场合。
物化视图对于大数据表 的处理显的尤为重要。 为了统计一个拥有 百万级记录的数据表的 总和 以及 平均值 问题, 将耗费大量的数据库资源和时间 。
可以通过 物化视图 改善这一状况。 即: 对表进行一次统计, 并将统计结果存储在物化视图中, 那么, 以后的每次查询直接查询该视图即可。
--1. 创建 物化视图:
create materialized view mv_monthly_sales
build immediate
refresh on commit
enable query rewrite
as
select sale_month,sum(price*quantity) from employee_sale_details group by sale_month;
-- 2. 查看 物化视图信息
select object_name, object_type,status from user_objects where object_name='MV_MONTHLY_SALES';
-- 物化视图的数据加载
--在上面的创建 物化视图的例子语句中 ,
--SQL 语句中使用了 build immediate 。 该选项用于立即 加载 物化视图的数据。
--也就是说, 在创建 物化视图的同时, 立即根据定义从基础表中 获取数据, 并将数据添加到物化视图中。 另外 一个可用 选项为 build deffered , 表示延迟载入数据。
使用 延迟加载 是 必要的。
--有时 , 物化视图的基础表数据量 巨大, 载入数据会耗费 大量资源。 直接使用立即加载策略, 在数据库使用的高峰期, 会造成客户端延迟。 但是,后续的开发工作可能使用到 该 物化视图, 那么可以采用延迟加载数据的策略。
--==========================
物化视图的数据更新
-- 物化视图的数据 应该 根据 基础表的更新而更新。 同上创建物化视图的例子中:
SQL语句 中使用了 refresh on commit , 要求 Oracle实现 自动更新功能。 即基础表的数据 更新 被 提交后, 应该自动更新物化视图的数据。
--======================
查询 重写
同上例子创建物化视图 的SQL语句 例子中 , 使用 了 enable query rewrite 选项。 该选项 用于 启用 查询重写。
-- 查询重写是指: Oracle 对基础表 的查询, 按照优化原则, 查找恰当的物化视图, 如果获得 优化视图, 则将查询转化为对 物化视图的查询。
select sale_month, sum(quantity * price) sale_quantity from employee_sale_details group by sale_month;
-- 删除物化视图 , 再次查看 SQL 语句的花费。
drop materialized view mv_monthly_sales;
--===================================
视图 小结:
介绍了 Oracle中的 4 中视图 : 关系视图、 内嵌视图、 对象视图 和物化视图。 。
--其中
关系视图 是最常用的视图。 关系视图在 安全性、 组合数据以及 增强型方面都有着 即为广泛的应用。
内嵌视图 则无须 真正创建一个视图对象, 而 更接近于临时视图, 具有运行时有效的特点, 使内嵌视图 使用 起到了非常 灵活、方便。
组装数据;
封装复杂查询;
提供建模模型;
提高相应速度。
--===== 视图 实例 =====--
主要讲述了 视图的创建和使用。 在Oracle 数据库中 , 本身存在着 若干已 创建的视图。 这些视图可以用来获取许多重要的信息。
--例如: 为了获得数据库中, 某个表的所有列, 既可以利用视图 user_tab_cols 。
-- 该例子 演示了 如何获的 某个表/视图的所有列
select table_name, column_name, data_type from user_tab_cols where lower(table_name) = 'books';
select table_name, column_name, data_type from user_tab_cols where lower(table_name) = 'vw_employee_salary';
--======================= 视图小结OVER ===============================
视图
视图是数据库中 特有的对象。 视图用于存储查询, 但不会存储数据(物化视图除外)。这是视图和数据表的重要区别。 可以利用视图进行查询、插入、更新和删除数据。
Oracle 中 有4 中视图:
1. 关系视图
2. 内嵌视图
3. 对象视图
4. 物化视图
-- 关系视图 : 关系视图 是 四种视图中最简单, 同时也是最常用的视图。 我们可以将关系视图看作对简单或复杂的查询的定义。 它的输出可以看作一个虚拟的表, 该表的数据是由其他基础数据表提供的。
由于关系视图并不存储真实的数据, 因此占用数据库资源也较少。
--先观察一下 源数据表 t_employees
SQL> select * from t_employees;
EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_SEX EMPLOYEE_SALARY STATUS WORK_YEARS FIRST_NAME LAST_NAME PROVINCE CITY LOCATION
----------- --------------- --------------- --------------- ---------- ---------- --------------- ---------- ---------- ---------- ----------------------------
107 NEW 1 小郭 东方 北京 北京市 朝阳区
101 zhangSan 男 6000 ACT 3 三 张 北京 北京市 朝阳区
102 liSi 男 5500 CNN 2 四 李 河北 秦皇岛 海港区
103 songyanjun 男 2000 EN 1 延军 宋 河北 秦皇岛 海港区
104 wangpeng 男 2000 ACT 1 朋 网 河北 秦皇岛 海港区
105 hanjipeng 男 2000 ACT 1 鹏 韩 河北 福宁 海港区
106 liangmingy 女 2000 NEW 1 雨 量 河北 福宁 海港区
108 wangErMaZi 男 123 jjj 3 而马子 王 廊坊 廊坊 不明
已选择8行。
-- 建立关系视图:
--1. 建立关系视图 create view vw_employees as select employee_id, last_name || first_name as employee_name, province || '-' || city as location from employees
SQL> create view vw_employees as select employee_id, last_name || first_name as employee_name, province || '-' || city as location from t_employees;
视图已创建。
--2. 查看视图定义 select text from user_views where view_name='VW_EMPLOYEES';
SQL> select text from user_views where view_name='VW_EMPLOYEES';
TEXT
--------------------------------------------------------------------------------
select employee_id, last_name || first_name as employee_name, province || '-' ||
--3. 查询刚创建的视图
SQL> select * from vw_employees;
EMPLOYEE_ID EMPLOYEE_NAME LOCATION
----------- ------------------------- ---------------------
107 东方小郭 北京-北京市
101 张三 北京-北京市
102 李四 河北-秦皇岛
103 宋延军 河北-秦皇岛
104 网朋 河北-秦皇岛
105 韩鹏 河北-福宁
106 量雨 河北-福宁
108 王而马子 廊坊-廊坊
已选择8行。
--======================
修改/删除 视图
--1. 修改视图(为视图 添加 新列 employee_salary) create or replace view vw_employees as select employee_id, last_name || first_name as employee_name, province || '-' || city as location, employee_salary from t_employees
SQL> create or replace view vw_employees as select employee_id, last_name || first_name as employee_name, province || '-' || city as location, employee_salary from t_emoyees;
视图已创建。
--2. 查询刚才修改的视图。
SQL> select * from vw_employees;
EMPLOYEE_ID EMPLOYEE_NAME LOCATION EMPLOYEE_SALARY
----------- ------------------------- --------------------- ---------------
107 东方小郭 北京-北京市
101 张三 北京-北京市 6000
102 李四 河北-秦皇岛 5500
103 宋延军 河北-秦皇岛 2000
104 网朋 河北-秦皇岛 2000
105 韩鹏 河北-福宁 2000
106 量雨 河北-福宁 2000
108 王而马子 廊坊-廊坊 123
已选择8行。
--3. 删除视图 drop view vw_employees;
SQL> drop view vw_employees;
视图已删除。
SQL>
联接视图:
--联接视图 在 上面的关系视图的举例中 我们 创建的视图 是基于 单个基础表的。 而在实际应用中, 大多数的视图是较为复杂的查询 。 这也是视图的一大优势, 封装复杂查询。
--例如:
--create or replace view vw_employee_salary as select e.employee_id, e.last_name || e.first_name employee_name, e.employee_salary+s.total_price*0.1 salary from employees e, t_sales s where e.employee_id=s.sale_by and s.sale_month='3月';
--我们先创建一个 类似的测试表 t_sales
-- Create table
create table T_SALES
(
sale_id NUMBER not null,
sale_by NUMBER,
sale_month VARCHAR2(10),
sale_day VARCHAR2(10),
sale_year VARCHAR2(10),
total_price NUMBER
)
tablespace SONGYANJUN
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
-- Create/Recreate primary, unique and foreign key constraints
alter table T_SALES
add constraint PK_SALE_ID primary key (SALE_ID)
using index
tablespace SONGYANJUN
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
--创建视图
SQL> create or replace view vw_employee_salary as select e.employee_id, e.last_name || e.first_name employee_name, e.employee_salary+s.total_price*0.1 salary from employees e, t_sales s where e.employee_id=s.sale_by and s.sale_month='3月';
视图已创建。
SQL> select * from vw_employee_salary;
EMPLOYEE_ID EMPLOYEE_NAME SALARY
----------- ------------------------- ----------
102 李四 5520
-- 编译视图
-- 编译视图 : 编译视图 依赖于 基础表的存在而存在,当初基础表进行了 结构上的调整, 有可能会对视图产生影响。 如欲再次使用该视图, 必须对视图进行重新编译。
--例如:alter view vw_employee_salary compile;
SQL> alter view vw_employee_salary compile;
视图已变更。
--使用 force 选项强制创建 视图
使用 force 选项强制创建 视图: 有时, 视图的基础表还没有创建, 但是仍然希望能够创建基于 不存在的数据表的视图。 这是因为, 数据表的预期创建这和视图的创建者并非同一用户。
视图创建这不希望 等待基础表创建这的工作完成之后 才进行 自己的工作。 假设, 此时视图创建者 已经对基础表的结构 有了清晰的概念, 例如: books 将被创建, 以存储 图书信息。
--例如: create or replace force view vw_ebooks as select book_name,author from ebooks;
SQL> create or replace force view vw_ebooks as select book_name,author from ebooks;
视图已创建。
SQL> select * from vw_ebooks;
BOOK_NAME AUTHOR
-------------------- ----------
Java编程宝典 张三
Java基础 李四
Java打飞机 王五
JavaScript基础 趙六
CshapBeNet 二狗子
Cshap编程 傻蛋
已选择6行。
--=====================================
利用视图 更新 数据表
--通过视图, 不但可以对 基础表中的数据进行查询, 而且可以对数据表中的数据进行更新。 更新的方式非常简单 : 直接更新视图中的数据即可将 对基础表 进行相应的更新。
--当然, 并非视图中的所有列都能够 进行更新, 并反射到基础表中, 只有那些直接由基础表 获得的列可以进行更新操作。
--例如 , 先头创建的 book_name 和 列 author; 而由基础表中的数据经过运算获得, 仅凭视图中的数据无法判断基础表中的数据情况的列, 不能进行更新, vw_employees 中的 name 列。
--select table_name, column_name, updatable, insertable, deletable from user_updatable_columns where table_name='VW_BOOKS';
--插入视图数据
--insert into vw_ebooks values ('千年一叹', '余秋雨')
--1. 我们先查一下 VW_EBOOKS 这个视图中的数据。
SQL> select * from vw_ebooks;
BOOK_NAME AUTHOR
-------------------- ----------
Java编程宝典 张三
Java基础 李四
Java打飞机 王五
JavaScript基础 趙六
CshapBeNet 二狗子
Cshap编程 傻蛋
已选择6行。
--2. 我们 在 更新这个视图中的数据。
SQL> update vw_ebooks set book_name='C#' where author='二狗子';
已更新 1 行。
-- 我们在查看 验证一下 是否 这个视图中的数据 变更了。
SQL> select * from vw_ebooks;
BOOK_NAME AUTHOR
-------------------- ----------
Java编程宝典 张三
Java基础 李四
Java打飞机 王五
JavaScript基础 趙六
C# 二狗子
Cshap编程 傻蛋
已选择6行。
--我们在看一下 实体表中的数据 是否 也 同样跟着 变更了。
SQL> set linesize 150;
SQL> select * from ebooks;
BOOKNO EID BOOKNAME BOOK_NAME AUTHOR
---------- ---------- ------------------------------ -------------------- ----------
1006 Java编程宝典 张三
1001 8 javaBook Java基础 李四
1002 8 javaBook Java打飞机 王五
1003 8 javaBook JavaScript基础 趙六
1004 6 c# Book C# 二狗子
1005 8 c# Book Cshap编程 傻蛋
已选择6行。
SQL>
-- OK , 这样就说明了 ,视图是 可以被 修改的。
--===============
with check option选项
--创建 视图时, with check option 是常用选项之一。 一旦使用了 该选项, 那么 Oracle将保证视图在数据库更新之后与更新之前呃结果集相同。
--create or replace view vw_books as select * from ebooks where bookno=1005;
SQL> create or replace view vw_books as select * from ebooks where bookno=1005;
视图已创建。
SQL> select * from vw_books;
BOOKNO EID BOOKNAME BOOK_NAME AUTHOR
---------- ---------- ------------------------------ -------------------- ----------
1005 8 c# Book Cshap编程 傻蛋
--update vw_books set bookno=1006;
SQL> update vw_books set book_id=1006;
已更新 1 行。
SQL> select * from vw_books;
BOOKNO EID BOOKNAME BOOK_NAME AUTHOR BOOK_ID
---------- ---------- ------------------------------ -------------------- ---------- ----------
1005 8 c# Book Cshap编程 傻蛋 1006
--create or replace view vw_books as select * from ebooks where book_id=1006 with check option
SQL> create or replace view vw_books as select * from ebooks where book_id=1005 with check option;
视图已创建。
SQL> select * from vw_books;
未选定行
--==============================
关系视图小结
1. 保障数据安全性
2. 数据整合
3. 数据透明性
--================================
内嵌视图
关系视图座位查询定义, 一旦创建, 既可存在于 数据库中, 并可被多次使用。 但有时 ,需要某个视图座位过度结果集, 但在一次使用之后, 便不再需要, 此时不宜创建关系视图。 因为关系视图占用数据库资源, 而且也会增加维护成本。 此时应该选择使用 内嵌视图。
-- 内嵌视图 简介:
-- 内嵌视图 也是 视图, 只是不会利用 create view 进行 显示创建 。 也不能 在数据库中查询到 其 相关信息。 一般情况下, 被嵌套在 查询语句中 使用, 因此称为 内嵌视图。 其功能类似于子查询。
-- 当然 , 内嵌视图 也可以 出现在更新、 插入和删除语句中。 内嵌视图具有临时性, 他只在 被嵌入语句的执行期间有效, 并可以在被嵌入语句的任何地方 使用该视图。
-- 内嵌视图的使用:
--1. 利用内嵌视图 进行查询 : select * from (select employee_id, last_name || first_name as employee_name, employee_salary from t_employees order by employee_salary desc) where rownum<=3; // rownum<=3 为取出 3行的数据
SQL> select * from (select employee_id, last_name || first_name as employee_name, employee_salary from t_employees order by employee_salary desc) where rownum<=3;
EMPLOYEE_ID EMPLOYEE_NAME EMPLOYEE_SALARY
----------- ------------------------- ---------------
107 东方小郭
101 张三 6000
102 李四 5500
SQL>
--2. 利用 内嵌视图更新数据表
--。。。。。。。。
内嵌视图小结:
1. 内嵌视图与临时表、 关系视图的使用场景。
2. 分辨内嵌视图 与子查询。
--=============================
对象视图
对象视图: 数据库都是在关系型 数据库, 但是 , 面对对象编程的思想早已深入人心。 Oracle数据库不仅可以通过关系表来存储数据, 同样, 也可以创建对象, 以对象的方式进行数据存储。
--关系视图是由 关系表进行查询获得的, 而对对象视图则是对 对象机型查询获得的。
--对象视图简介:
--说道 对象视图 ,自然应该首先提到 对象。 Oracle中的对象 仍然是一个逻辑的概念, 虽然可以从对象中获取数据, 就像数据真实存储与对象中 一样。
--但是在对象的概念之下, 数据仍然是 存储与关系表中。 要创建对象, 首先要建立对象类型, 类似于 Java 或 C#中 类的概念。
--先创建一个 类似的表 吧
-- Create table
create table EMPLOYEES
(
employee_id NUMBER,
employee_name VARCHAR2(20),
location VARCHAR2(50),
first_name VARCHAR2(10),
last_name VARCHAR2(10),
province VARCHAR2(10),
city VARCHAR2(10),
salary NUMBER
)
tablespace SONGYANJUN
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64
minextents 1
maxextents unlimited
);
--之后插入了一条 测试数据 , 我们查询一下。
SQL> select * from employees;
EMPLOYEE_ID EMPLOYEE_NAME LOCATION FIRST_NAME LAST_NAME PROVINCE CITY SALARY
----------- -------------------- -------------------------------------------------- ---------- ---------- ---------- ---------- ----------
101 员工名字 东方明珠城B 延军 宋 河北 秦皇岛 2000
---====
-- 创建 和使用 对象 视图 : 利用 基础的对象类型 employee 来创建 对象视图。 那么视图中的列 将与 employee_type 中的属性保持 一致。
create type employee is object(employee_id number, employee_name varchar2(20), location varchar2(50), salary number)
create or replace view ov_employees of employee with object oid(employee_id) as select employee_id, last_name || first_name, province || city, salary from employees;
--=====
尼玛的, 为啥 无法执行啊, 我勒个去, 为什么执行成功了, 但是神马 都效果都没出来啊?????
--======
--=======================================
物化视图
前面所叙述的 三种 视图 : 关系视图、内嵌视图 和 对象视图, 实际头饰通过定制查询 , 并利用 查询定义来 获取 数据。 三种视图都不会直接存储数据, 每次 操作时, 都会进行 编译
--下面 描述一下 物化视图。
物化视图 简介:
物化视图 是物理化视图的简称, 顾名思义, 该视图存储实际数据, 因此, 会占用一定的数据库空间。 在这一点上, 更接近于 临时表。 但不像临时表那样在某个特定的时机 会 删除数据。
物化视图中 的数据 是 可以重用的, 因此, 经常应用与 读取频繁的场合。
物化视图对于大数据表 的处理显的尤为重要。 为了统计一个拥有 百万级记录的数据表的 总和 以及 平均值 问题, 将耗费大量的数据库资源和时间 。
可以通过 物化视图 改善这一状况。 即: 对表进行一次统计, 并将统计结果存储在物化视图中, 那么, 以后的每次查询直接查询该视图即可。
--1. 创建 物化视图:
create materialized view mv_monthly_sales
build immediate
refresh on commit
enable query rewrite
as
select sale_month,sum(price*quantity) from employee_sale_details group by sale_month;
-- 2. 查看 物化视图信息
select object_name, object_type,status from user_objects where object_name='MV_MONTHLY_SALES';
-- 物化视图的数据加载
--在上面的创建 物化视图的例子语句中 ,
--SQL 语句中使用了 build immediate 。 该选项用于立即 加载 物化视图的数据。
--也就是说, 在创建 物化视图的同时, 立即根据定义从基础表中 获取数据, 并将数据添加到物化视图中。 另外 一个可用 选项为 build deffered , 表示延迟载入数据。
使用 延迟加载 是 必要的。
--有时 , 物化视图的基础表数据量 巨大, 载入数据会耗费 大量资源。 直接使用立即加载策略, 在数据库使用的高峰期, 会造成客户端延迟。 但是,后续的开发工作可能使用到 该 物化视图, 那么可以采用延迟加载数据的策略。
--==========================
物化视图的数据更新
-- 物化视图的数据 应该 根据 基础表的更新而更新。 同上创建物化视图的例子中:
SQL语句 中使用了 refresh on commit , 要求 Oracle实现 自动更新功能。 即基础表的数据 更新 被 提交后, 应该自动更新物化视图的数据。
--======================
查询 重写
同上例子创建物化视图 的SQL语句 例子中 , 使用 了 enable query rewrite 选项。 该选项 用于 启用 查询重写。
-- 查询重写是指: Oracle 对基础表 的查询, 按照优化原则, 查找恰当的物化视图, 如果获得 优化视图, 则将查询转化为对 物化视图的查询。
select sale_month, sum(quantity * price) sale_quantity from employee_sale_details group by sale_month;
-- 删除物化视图 , 再次查看 SQL 语句的花费。
drop materialized view mv_monthly_sales;
--===================================
视图 小结:
介绍了 Oracle中的 4 中视图 : 关系视图、 内嵌视图、 对象视图 和物化视图。 。
--其中
关系视图 是最常用的视图。 关系视图在 安全性、 组合数据以及 增强型方面都有着 即为广泛的应用。
内嵌视图 则无须 真正创建一个视图对象, 而 更接近于临时视图, 具有运行时有效的特点, 使内嵌视图 使用 起到了非常 灵活、方便。
组装数据;
封装复杂查询;
提供建模模型;
提高相应速度。
--===== 视图 实例 =====--
主要讲述了 视图的创建和使用。 在Oracle 数据库中 , 本身存在着 若干已 创建的视图。 这些视图可以用来获取许多重要的信息。
--例如: 为了获得数据库中, 某个表的所有列, 既可以利用视图 user_tab_cols 。
-- 该例子 演示了 如何获的 某个表/视图的所有列
select table_name, column_name, data_type from user_tab_cols where lower(table_name) = 'books';
select table_name, column_name, data_type from user_tab_cols where lower(table_name) = 'vw_employee_salary';
--======================= 视图小结OVER ===============================
发表评论
-
dblink 阀值
2013-09-06 04:53 489调整方法: alter system set open_l ... -
查看 运行中的存储过程
2013-08-29 23:45 7841、查看ORACLE中正在运 ... -
oracle seconds to hh:mm:ss format
2013-03-13 02:26 965SELECT TO_CHAR(TRUNC(x/36 ... -
listener.ora、sqlnet.ora、tnsnames.ora
2013-03-06 04:57 744oracle网络配置 三个配置文件 listener.or ... -
oracle ratio_to_report
2013-02-20 03:20 911Ratio_to_report函数 Syntax ... -
Oracle 获取本周、本月、本季、本年的第一天和最后一天
2013-01-15 05:08 2684--取得当天0时0分0秒 select TRUNC ... -
package UTL_MAIL - 04042
2012-12-14 03:53 595Connect as SYS as sysdba: ... -
oracle常用的时间函数
2012-12-14 03:09 850SELECT SYSDATE FROM DUAL 取当前系 ... -
oracle ash awr addm 三把利剑 ---转贴
2012-10-19 04:53 791原文出处:http://space.itp ... -
expdp/impdp 进行数据库迁移例子
2012-09-21 01:59 851把一个数据库上的一个用户schema迁移到另外一个数据库上 ... -
数据库缓冲区命中率
2012-09-19 21:55 717数据库缓冲区命中率 select name,value ... -
oracle真实案例之oem大量占用cpu与内存问题的解决方法
2012-09-14 23:13 8729一、介绍 由于dba离职,所以公司所有的or ... -
grant all object to another user
2012-09-07 04:42 749If you really want to grant all ... -
oracle 权限管理
2012-09-07 04:41 6101.查看所有用户: select * from db ... -
impdp 在同一个数据库中把一个schema中所有的对象复制到另一个schema中
2012-09-07 02:03 1179在同一个数据库中把一个schema中所有的对象复制到另一个sc ... -
11g MEMORY_TARGET 参数对SGA 和PGA的影响
2012-09-06 04:32 83811g 中新增 MEMORY_MAX_TARGET 参数 ... -
每小时生成csv文件,并ftp到远端服务器
2012-08-17 03:31 2422CREATE OR REPLACE procedu ... -
全面学习DBMS包之DBMS_SQL (转贴)
2012-08-16 22:32 690在PL/SQL编程当中,经常 ... -
Oracle – Select sysdate +/- time from dual
2012-08-15 22:39 903如果想+,-系统时间: Sysdate: S ... -
ZT 查看Oracle数据库表空间大小(空闲、已使用),是否要增加表空间的数据文件
2012-08-08 23:15 858--1查看表空间已经使用的百分比 ...
相关推荐
Oracle物化视图应用详,有实例和各属性介绍
东华大学oracle上机实验二答案,需要的可以参考下。
Oracle物化视图增量刷新的应用研究.pdf
视图:是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改。视图基于的表称为基表,Oracle的数据库对象分为五种:...视图被删除后,基于被删除视图的其他视图或应用将无效。
ORACLE视图技术在用户数据管理中的应用分析.pdf
ORACLE物化视图的技术应用.pdf
Oracle数据库应用中的可更新视图设计.pdf
这是我学习Oracle时,老师给的讲义,包含了Oracle从入门到高级应用的全部资料。 以下是文件列表 Day01-Oracle基础.pdf Day02-Oracle表的管理.pdf Day03-约束和序列.pdf Day04-SQL和操作符.pdf Day05-Oracle常用函数....
体验数据库的应用→认识 Oracle的工作环境、体验Oracle 10g环境中常用工具操作→数据库的创建与管理→数据表的创建与管理→管理视图→SQL编程语言→PL/SQL编程语言→管理PLSQL存储过程与触发器 →管理安全性→数据库...
orace表分区及物化视图 进一步了解oracle表分区技术及物化视图技术应用
我想下载别的东西需要积分,所以请各位帮帮忙我们互利共赢。
Oracle数据仓库实体化视图的研究与应用的最新成果,对研究数据仓库的DBA有很好的借鉴作用。
第一部分:Oracle数据库安装与应用操作 第一章:oracle数据库简介 第二章:oracle安装 第三章:SQL基础知识 第四章:使用SELECT语句 第五章:数据的限定与排序 第六章:多表连接技术 第二部分:ORACLE SQL高级应用 ...
Oracle是当今各领域中应用比较广泛的一个大型关系型数据库产品,它以其所拥有的稳定、可伸缩性强以及安全可靠等特性受到越来越多的系统开发人员的青睐,正成为企业开发信息系统的首选产品。同其他数据库管理系统相比...
Oracle数据仓库实体化视图的研究与应用.pdf
在实际应用中,快速刷新的限制条件是非常重要的,因为它直接影响了物化视图的刷新性能。如果不满足这些限制条件,物化视图就不能进行快速刷新,影响了数据的实时性和可靠性。 此外,物化视图的快速刷新还需要满足...
Oracle 数据库原理及应用教学大纲 Oracle 数据库原理及应用教学大纲是数据库管理系统的核心组件之一。了解 Oracle 数据库的原理和应用对于数据库管理员、开发人员和 IT 专业人员来说非常重要。这篇教学大纲涵盖了 ...
由浅入深地介绍了Oracle 10g系统的使用方法和基本管理。...本书全面介绍使用Oracle数据库管理应用与开发知识,适合作为普通高校计算机专业Oracle教材,也可以作为Oracle数据库开发和应用人员的参考资料。
物化视图在大型ORACLE数据库查询中的应用.pdf
oracle高级复制应用的实例及物化视图复制和多主体复制的具体配置