一、视图简介
1.视图是从一个或几个基本表(或视图)导出的表。它与基本表不同,是一个虚表。
2.数据库只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。所以基本表中的数据发生变化,从视图中查询出的数据也就随之改变了。从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化。
3.视图的结构和数据,是对数据表进行查询的结果。
4.视图的定义永久保存,数据不会保存。
--SQL语言用CREATE VIEW命令建立视图,其一般格式为:
CREATE VIEW <视图名>[(<字段名>,[<字段名>]…)]
AS
(子查询)
[WITH READ ONLY] [WITH CHECK OPTION]
--WITH CHECK OPTION是可选项,该选项表示对所建视图进行INSERT、UPDATE和DELETE操作时,
--让系统检查该操作的数据是否满足子查询中WHERE子句里限定的条件,若不满足,则系统拒绝执行。
二、视图的优点
既然视图的定义是基于基本表的,哪为什么还要定义视图呢?这是因为合理地使用视图能够带来许多好处:
1.视图提供一定程度的逻辑独立性
用户程序是通过视图来访问数据库的,视图相当于用户的外模式,只需要修改用户的视图定义来保证用户的外模式不变,而用户的程序不必改变。
在关许数据库中,数据库的重构造往往是不可避免的。重构数据库最常见的是将一个基本表“垂直”地分成多个基本表。例如:将学生关系Student(Sno,Sname,Ssex,Sage,Sdept),分为SX(Sno,Sname,Sage)和SY(Sno,Ssex,Sdept)两个关系。这时原表Student为SX表和SY表自然连接的结果。如果建立一个视图Student:
CREATE OR REPLACE VIEW Student(Sno,Sname,Ssex,Sage,Sdept)
AS
SELECT SX.Sno,SX.Sname,SY.Ssex,SX.Sage,SY.Sdept
FROM SX,SY
WHERE SX.Sno=SY.Sno
WITH CHECK OPTION --数据表插入或修改的数据行,必须满足视图定义的约束
--or replace 若所创建的视图已经存在,oracle自动重建该视图
这样尽管数据库的逻辑结构改变了(变为SX和SY两个表了),但应用程序不必修改,因为新建立的视图定义为用户原来的关系,使用户的外模式保持不变,用户的应用程序通过视图仍然能够查找数据。
当然,视图只能在一定程度上提供数据的逻辑独立,比如由于视图的更新是有条件的,因此应用程序中修改数据的语句可能仍会因为基本表构造的改变而改变。
2.视图有利于数据的保密
对于不同的用户定义不同的视图,而只授予用户访问自己视图的权限
3.视图简化了用户的操作
视图机制是用户把注意力集中在自己所关心的数据上。这种视图所表达的数据逻辑结构相比基本表而言,更易被用户所理解。
4. 适当的利用视图可以更清晰地表达查询
例如经常需要执行这样的查询“对每个学生找出他获得最高成绩的课程号”。可以先定义一个视图,求出每个同学获得的最高成绩:
CREATE VIEW VMGRADE
AS
SELECT Sno,MAX(Grade) Mgrade
FROM SC
GROUP BY Sno;
--然后用如下的查询语句完成查询:
SELECT SC.Sno,Cno
FROM SC,VMGRADE
WHERE SC.Sno = VMGRADE.Sno AND SC.Grade = VMGRADE.Mgrade;
三、视图的操作
1.查看视图:
-- 查看视图结构。
SHOW CREATE VIEW '视图名';
2. 修改视图
ALTER VIEW '视图名' [('列名1' ..., '列名n')]
AS
'select_statement'
[WITH [CASCADED|LOCAL] CHECK OPTION]
3.删除视图
DROP VIEW [IF EXISTS] '视图名'[,'视图名2'] ... [RESTRICT|CASCADE];
-- RESTRICT:限制。
-- CASCADE:级联。
DROP VIEW view_name;
四、视图实例
创建视图,业主类型 为1 的业主信息。
create or replace view 'view_owners'
as
select * from 'T_OWNERS' where ownertypeid = 1;
--查询该视图 和查询表一样
select * from 'view_owners' where addressid = 1;
如果视图中的语句只是 单表查询,并且 没有聚合函数,我们就称之为 简单视图。对于简单视图,不仅可以用查询,还可以 增删改 记录。
update 'view_owners' set name='王刚' where id = 2;
select * from 'view_owners';
-- 修改后,再次查询表数据,发现表的数据也跟着更改了。
--查询员工表中部门30的员工姓名、工资和奖金。
CREATE VIEW view_1 AS
SELECT ename,sal,comm FROM emp WHERE deptno=30;
--在视图view_1中查找薪水大于2000的员工信息
SELECT ename, sal, comm FROM view_1 WHERE sal > 2000
--本例在执行时DBMS会转化为下列执行语句:
SELECT ename, sal, comm FROM emp WHERE deptno=30 AND sal > 2000
参考:
1.(1条消息) 数据库中视图的作用_MazenChan的博客-CSDN博客_数据库视图的作用是什么