1.1 视图的定义
视图(View)是数据库中非常重要的内容,在实际开发中必须学会视图的编写。
用于产生视图的表叫做该视图的基表。一个视图也可以从另一个视图中产生。视图是可以嵌套的。
视图的定义存在数据库中,与此定义相关的数据并没有再存一份于数据库中。视图看上去非常象数据库的物理表,对它的操作同任何其它的表一样。
通过视图修改数据时,实际上是在改变基表中的数据。基表数据的改变也会自动反映在由基表产生的视图中。
1.2视图的语法和优势
视图的具体优势如下:
可以限制用户只能通过视图检索数据。这样就可以对最终用户屏蔽建表时底层的基表;
可以将复杂的查询保存为视图,可以对最终用户屏蔽一定的复杂性;
限制某个视图只能访问基表中的部分列或者部分行的特定数据,保证数据的安全性。
从多张基表中按一定的业务逻辑抽出用户关心的部分,形成一张虚拟表。
创建视图的语法如下:
create [ or replace ] [ force ] view [schema.]view_name
[ (column1,column2,…) ]
as
select …
[ with check option ] [ constraint constraint_name ]
[ with read only ];
(1) or replace: 如果存在同名的视图, 则使用新视图替代已有的视图
(2) force: 强制创建视图,不考虑基表是否存在,也不考虑是否具有使用基表的权限
(3) column1,column2,…:视图的列名, 列名的个数必须与select查询中列的个数相同; 如果select查询包含函数或表达式,则必须为其定义列别名。
(4) with check option: 指对视图执行的dml操作必须满足“视图子查询”的条件即,对通过视图进行的增删改操作进行检查,要求增删改操作的数据, 必须是查询语句所能查询到的数据,否则不允许操作并返回错误提示。
(5)with read only:创建的视图只能用于查询数据, 不能用于更改数据。
视图分为简单视图和复杂视图。
简单视图:是指基于单个表建立的,不包含任何函数、表达式和分组数据的视图。对简单视图可以进行dml操作。
复杂视图是指在视图定义中包括了聚合函数、分析函数、用户自定义函数、多表关联、子查询等。此类视图在某些特定条件下,优化器无法将视图外的谓词条件推送至视图内的基表上,即使在基表的列上创建索引也无法使用索引。
对视图进行DML操作就是对视图数据来源的基础表进行的操作(但不能违反基础表的约束条件)。只能对简单视图进行DML操作,复杂视图不可以。
【例1-1】建立雇员表包括职工编号、姓名、薪水、电话号码。建立基于该表
的简单视图 vw_emp,对视图进行dml操作
–第五章\st.sql
create table SM_EMP
( empid varchar2(30),
name varchar2(30),
salary NUMBER(6,2),
telno CHAR(8)
);
–建立视图
create view vw_emp as select empid,name,salary,telno from SM_EMP;
对简单视图进行DML操作,代码如下:
–插入数据
INSERT INTO vw_emp VALUES(‘15661’,‘张飞雨’,5500,'6678562 ');
–更新数据
update vw_emp set name=‘张雨庭’ where name=‘张飞雨’;
delete vw_emp where name=‘张雨庭’;
–查询数据
select * from vw_emp where empid=‘15661’;
【例1-2】建立表销售订单表,包括操作号码、总价、员工编号、销售时间。建立雇员表包括职工编号、姓名、薪水、电话号码。建立复杂视图查询职工的基本信息、 销售总价、销售时间。销售总价的10%作为职工的提成,查询出拿到提成的职工姓名。
建表,建立视图代码如下:
–第五章\st.sql
–建立销售订单表
CREATE TABLE sm_saleorderlist(
TransactionID NUMBER(10) ,
TotalPrice NUMBER(7,2) NOT NULL,
EmployID varchar2(30) NOT NULL,
SaleTime DATE NOT NULL,
PRIMARY KEY(TransactionID));
–插入测试数据
INSERT INTO sm_saleorderlist VALUES(1,100.10,‘0000000001’,‘09_9月_15’);
INSERT INTO sm_saleorderlist VALUES(3,300.10,‘0000000002’,‘09_9月_20’);
INSERT INTO sm_saleorderlist VALUES(4,100.10,‘0000000003’,‘09_9月_19’);
COMMIT;
–建立雇员表
create table SM_EMP
( empid varchar2(30),
name varchar2(30),
salary NUMBER(6,2),
telno CHAR(8)
);
INSERT INTO sm_emp VALUES(‘0000000001’,‘张飞飞’,5500,'6678562 ');
INSERT INTO sm_emp VALUES(‘0000000002’,‘关庭’,4500,‘87825626’);
INSERT INTO sm_emp VALUES(‘0000000003’,‘孙海’,6200,‘87783617’);
Commit;
–建立视图,查询销售总价和销售时间
create or replace view smv_zhcx
as
select a.empid,a.name,a.telno,b.transactionid,b.totalprice,b.saletime from sm_emp a
left join
sm_saleorderlist b
on a.empid=b.EmployID
–建立视图,查询职工能拿到提成
create view smv_cs
as
select empid,name,telno,totalprice*0.1 as commission ,saletime
from smv_zhcx
查询视图smv_zhcx数据,代码如下:
select * from smv_zhcx t
执行后如图5-1所示。
图5-1查询视图smv_zhcx数据
查询视图smv_cs数据,代码如下:
select * from smv_cs
执行后如图5-2所示。
图5-2查询视图smv_cs数据
5.1.3视图修改和删除
修改视图的过程即为重新定义视图的过程。可以通过先删除视图,然后再次创建视图实现。另外,Oralce数据库提供了一个专门的命令create or replace view来重新定义视图。
删除视图的动作实际为删除数据库中的对象操作,因此该操作为DML操作。如同删除数据表对象,删除视图也应该使用drop命令,其语法形式如下所示。
DROP VIEW view_name;
5.3视图和表的区别
(1)表是创建好的,真实存在的,而视图只是一段已经编译好的sql语句。
(2)表占有真实的物理空间,而视图只是一个逻辑概念。数据都是存储在表里面的。
(3)表是内模式,视图是外模式(内模式又称存储模式,对应于物理级,它是数据库中全体数据的内部表示或底层描述,是数据库最低一级的逻辑描述,它描述了数据在存储介质上的存储方式和物理结构,对应着实际存储在外存储介质上的数据库。内模式由内模式描述语言来描述、定义,它是数据库的存储观。外模式又称子模式,对应于用户级。它是某个或某几个用户所看到的数据库的数据视图,是与某一应用有关的数据的逻辑表示。外模式是从模式导出的一个子集,包含模式中允许特定用户使用的那部分数据。
(4)视图是查看数据表的一种方法,可以查询到表中用户想知道的数据,并且还不知道表结构,比较安全。
(5)表可以做增删改查,视图中简单视图可以做DML操作,复杂视图只可以查询。
(6)视图的创建和删除不影响表.