扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
视图 对于数据库来说 是一个最基本的 也是最重要的功能之一 数据库视图设计的好坏 直接跟数据库的性能相关 而且 在大型数据库设计中 大家分工合作 基础表的设计与报表视图的设计往往由不同的人负责 所以 视图的设计管理跟基础表的设计管理一样 都有很大的学问 在这篇文章中 笔者将结合自己在视图设计管理方面的工作经验 谈谈在这方面的一些鲜为人知的技巧
创新互联是一家专业提供丰林企业网站建设,专注与成都网站建设、成都网站设计、H5响应式网站、小程序制作等业务。10年已为丰林众多企业、政府机构等服务。创新互联专业的建站公司优惠进行中。
技巧一 把基础表与视图脱离开来
一般来说 视图都是在基础表的上面建立起来的 也就是说 要先有基础表 而后有视图 但是 在大型数据库的设计过程中 出于项目时间的考虑 往往基础表与视图的设计是同时进行的 如一些人负责基础表的建立 另一些人则负责视图的设计与建立等等 在这个过程中 往往基础表不存在的时候 就需要建立一些视图 以加快项目的进度
为了使得基础表的创建和修改与视图的创建于修改没有必然的联系 以便于员工之间工作的同步 提高工作效率 所以 在Oracle数据库中提出了一个 强制创建视图 的概念 也就是说 正常情况下 如果基本表不存在 则创建视图就会失败 但是 我们可以在创建视图的过程中 加入一个参数 只要创建视图的语法没有错误的话 即使基础表不存在 仍然可以建立这张表格 这个有用的参数就是force选项 如我们建立视图时 CREATE FORCE VIEW TEXT 只需要在关键字VIEW之前加入FORCE参数即可 如此的话 系统在编译视图的时候 就不会去考虑基础表是否存在
不过这里要注意一点 若基础表不存在的话 则编译后该视图的状态为 无效 不能再这个视图的基础上执行一些操作 如查询操作等等 当下次访问这个视图的时候 则数据库会对这个视图进行重新编译 若此时基础表存在了 则该基础表就会变为有效;若基础表不存在 则这视图就会失效
Oracle数据库之所以如此设置 主要是出于在数据库设计过程中协同办公的需要 有了这个功能之后 则在数据库建立的过程中 只要把数据库基础表与视图设计好之后 大家就可以分工合作 在数据库中建立相关的对象 不然的话 要等基础表建立好之后再建立视图 如此就会明显的影响数据库建立的进度 所以 在数据库建立的过程中 特别是中大型的数据库系统 这是一个很实用的功能
技巧二 创建视图的理想步骤
无论是简单视图 还是比较复杂的视图 笔者觉得数据库管理员在创建视图的时候 最好能够遵循一定的步骤 这一方面是因为视图的更改相对来说 是一件比较麻烦的工作 所以 我们在建立视图的时候 要确保视图的准确性 另一方面 视图是基础表的一个体现形式 若不按步骤来做的话 有可能就不能够达到我们预计的需求
当然这个步骤没有官方的版本 完全是数据库管理员根据实际的经验总结出来的 这个步骤不仅对Oracle数据库有效 对于其他数据库来说 也是类似的道理
一般来说 视图创建可以分为五步走
第一步 先考虑Select语句的编写 我们知道 视图其实就是一个Select语句的集合 所以 我们建立视图的第一步 就是考虑这个Select语句该如何编写 这个Select语句编写的是否合理 执行效率的高低直接影响着这个视图的性能 另外 在Select语句中 可能还会有格式的控制 内容的编排等等 如在Select语句中 可以把一些字段合并成一个字段;也可以把相关的内容进行倒置等等 这些功能都是Select语句完成的 所以可以这么说 Select语句的编写是视图建立的基础
第二步 对这个Select语句进行测试 当我们编写好Select语句之后 就需要在数据库中执行这条语句 看其能否查询到我们想要的值 在对Select语句进行测试的时候 需要注意一个问题 有时候Select查询语句可以查到准确的数据 但是在以这条语句建立视图的时候 可能就会通不过 如在一些表之间的连接查询的时候 如果两个表中有个字段名相同 是可以的 因为他们除了字段名字之外 还有表名一起来定义这个字段 如A name与B name 这是不算重名的 但是 若在建立视图的时候 这就会被认为是重复的列明 需要对其中的一个列名进行重定义 这一点在数据库视图建立的时候 要特别的注意
第三步 考虑查询结果的准确性 通过查询语句把我们想要的结果查询出来后 我们就需要看看这个结果是否满足我们的需要 在这个过程中 我们主要注意两点 一是形式字段是否齐全 在一些应用系统中 若数据库的视图要能够被前台的应用程序调用的话 则必须包含一些形式字段 如笔者以前在设计一个ERP系统的时候 若前台系统要调用数据库中的视图的时候 必须包含记录更新时间 更新者 记录创建时间 创建者等相关信息 若缺乏这些信息的话 则前台调用这张视图的时候 就会出现错误 故在考虑查询结果准确性的问题的时候 就要考虑到前台应用程序的需要 看看这些形式字段是否齐全 二是实体内容的完整性 我们到底需要显示表中的哪些字段呢 这个我们在这里要确认清楚 若显示内容太多的话 则会影响视图的执行效率 而且也会降低视图的安全性作用;但是 若字段内容显示不足的话 则以后要添加字段的话 会比较麻烦 有一定的工作量 所以在这个检验的时候 需要根据视图的实际功用 确定视图需要显示的内容
第四步 视图的修饰 有时候 为了阅读的方便 我们需要对查询结果进行一些修饰 如现在有两张表 一张是员工基本信息表 这表中有员工姓名 员工职位编号等等;另一张表是职位基本信息表 在这表中有职位编号 职位名称 我们希望在视图中能够如下显示 职位 员工名字 如数据库工程师 Victor 也就是说 把两个字段合并起来 并且在中间加入一个冒号 这些格式性的内容都是在查询的时候实现的 所以 我们确认查询的结果没有错误之后 接下来就要确认格式问题 若能够在视图中规范这些格式问题 则前台的程序设计就会相对来说比较简单
lishixinzhi/Article/program/Oracle/201311/17034
Oracle创建跨用户视图,也就是跨模式视图。
1、首先在A中运行,把读取的权限赋值给B,这样在B中建立视图就可
grant select on A.userA to B; 以读取A中userA表中的数据了。
2、登录用户B表空间,建立视图 语句如下:
create or
replace view cas_user_view as select
B.LOGIN_NAME,B.PASSWORD,B.LOGIN_FLAG from userB B union select
A.LOGIN_NAME,A.PASSWORD,A.LOGIN_FLAG
from A.userA
A;
到此,在用户B中已建立名为
cas_user_view的视图,可以供A和B同时使用。
基于表或其他视图来创建视图,目的将一些复杂的查询简化,提高查询速度 。如:
CREATE VIEW v_name AS SELECT b.dname,a.ename FROM emp a,dept b
WHERE a.deptno=b.deptno ;
查询部门名和员工名 通过建立视图,v_name 视图就等同于SELECT b.dname,a.ename FROM emp a,dept b
WHERE a.deptno=b.deptno 这样可以大大的简化程序
1
create view V_StudInfo
as
select a.学号,a.姓名,b.课程号,b.课程名,
case when c.成绩 between 90 and 100 then '优'
when c.成绩 between 80 and 89 then '良'
when c.成绩 between 70 and 79 then '中'
when c.成绩 between 60 and 69 then '及格'
else '不及格' end 成绩等级
from 学生表 a,课程表 b, 成绩表 c where a.学号=c.学号
and b.课程号=c.课程号
2
create view V_Stud
as
select a.学号,a.姓名,count(*) 所修科目数,avg(成绩) 平均成绩
from 学生表 a,课程表 b, 成绩表 c where a.学号=c.学号
and b.课程号=c.课程号
and a.学号 in
(select a.学号
from 学生表 a,课程表 b, 成绩表 c where a.学号=c.学号
and b.课程号=c.课程号 and b.课程名='英语' and c.成绩75)
表名和字段名,自己跟你实际的核对一下,不同的改一下
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view_name
[(alias[, alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY]
OR REPLACE :若所创建的试图已经存在,ORACLE自动重建该视图;
FORCE :不管基表是否存在ORACLE都会自动创建该视图;
NOFORCE :只有基表都存在ORACLE才会创建该视图:
alias :为视图产生的列定义的别名;
subquery :一条完整的SELECT语句,可以在该语句中定义别名;
WITH CHECK OPTION :插入或修改的数据行必须满足视图定义的约束;
WITH READ ONLY :该视图上不能进行任何DML操作。
CREATE OR REPLACE VIEW dept_sum_vw
(name,minsal,maxsal,avgsal)
AS
SELECT d.dname,min(e.sal),max(e.sal),avg(e.sal)
FROM emp e,dept d
WHERE e.deptno=d.deptno
GROUP BY d.dname;
--给用户授权创建视图
-- grant create all view to zdgshr; 所有数据库都能创建视图的用户
grant create view to zdgshr;
--创建简单视图
create view temp
as
select * from zd_member_basic_info;
--测试
select * from temp where rownum=1;
--创建简单视图:只读
create or replace view temp1
as
select id,job_number,name,dept_id from zd_member_basic_info
with read only;
--测试
insert into temp1(id,job_number,name,dept_id) values(1,0,'张三',1300);
视图的删除:
DROP VIEW VIEW_NAME语句删除视图。
删除视图的定义不影响基表中的数据。
只有视图所有者和具备DROP VIEW权限的用户可以删除视图。
视图被删除后,基于被删除视图的其他视图或应用将无效。
四、视图分为简单视图和复杂视图。
简单视图只从单表里获取数据;复杂视图从多表里获取数据。
简单视图不包含函数和数据组;复杂视图包含函数和数据组。
简单视图可以实现DML操作;复杂视图不可以。
create or replace view temp1
as
select distinct name,job_number,dept_id from zd_member_basic_info
with read only;
delete from zd_member_basic_info where name='而过';
create or replace view temp
as
select * from zd_member_basic_info order by name;
create
or
replace
view
视图名
as
...;
基本的创建命令:
比如:创建表book的一张视图
create
or
replace
view_book
as
select
*
from
book
where
book_id
='001';
使用视图,就用select
*
from
view_book;
当然了,使用
图形化界面
更方便。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流