创建和查询视图
视图是从一个或多个表(或视图)导出的表。视图是数据库的用户使用数据库的观点。视图与表【有时为与视图区别,也称表为基本表(Base Table)】不同,视图是一个虚表,及试图所对应的数据不进行实际存储,数据库中只存储视图的定义,对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的基本表。
使用视图有一下优点:
1.为用户集中数据,简化用户的数据查询和处理。
2.屏蔽数据库的复杂性。
3.简化用户权限的管理。
4.便于数据共享。
5.可以重新组织数据,以便输出到其他应用程序中。
创建视图
语法格式如下。
CREATE [ON REPLACE] VIEN 视图名 [(列名列表]]
AS SELECT 语句
[WITH [CASCADED |LOCAL] CHECK OPTION]
OR REPLACE:给定OE REPLACE子句,语句能够替换已有的同名视图。
WITH CHECK OPTION:LOCAL关键字时CHECK OPTION只对定义的视图进行检查,CASCADED则会对所有试图进行检查。如果为给定任意关键字,则默认为CASCADED.
注意事项。
1.在默认情况下,将在当前数据库创建新视图。
2.视图的命名必循遵循标识符命名规则,不能与表同名。
3.不能把规则、默认值或触发器与视图相关联。
4.不能在试图上建立任何索引,包括全文索引
5.视图中使用SELECT语句有以下限制。
(1)定义视图的用户必须对所参照的表或试图有查询权限,即可执行SELECT语句的权限;在定义中引用的表或视图必须存在。
(2)不能包含FROM子句中的子查询,不能引用系统或用户变量,不能引用预处理语句参数
(3)在视图定义中允许使用ORDER BY子句,但是,如果从特定试图进行了选择,而试图使用了具有自己ORDER BY子句的语句,则试图定义中的ORDER BY子句将被忽略。
例1:创建bookstore数据库上的jsj_sell视图,包括计算机类图书的销售订单号,图书编号、书名、订购册数等情况,要保证对该视图的订单修改都要符合计算机类这个条件。
create or replace view jsj_sell
as
select 订单号,sell.图书编号,书名,订购册数
from book,sell
where book.图书编号=sell.图书编号
and book.图书类别='计算机'
with check option;
例2:创建bookstore数据库中“计算机”类图书销售视图sale_avg,包括书名(在视图列名为“name”)和该图书的平均订购册数(在视图中列名为“sale_avg”)。
create view sale_avg (name,sale_avg)
as
select 书名,avg(订购册数)
from jsj_sell
group by 书名;
查询视图
查询表与视图查询一致
例:在试图jsj_sell中查找“计算机”类图书的订单号和订购册数。
select 订单号,订购册数
from jsj_sell;
操作视图
通过视图操作数据
1.可更新视图
要通过视图更新基本表数据,必须保证视图是可更新视图,既可以在INSET、UPDATE或DELETE等语句当中使用它们。对于可更新视图,视图中的行和基本表中的行之间必须具有一对一的关系。如果视图包括下述结构中的任何一种,那么它就是不可更新的。
(1)聚合函数
(2)DISTINCT关键字
(3)GROUP BY子句
(4)ORDER BY子句
(5)HAVING子句
(6)UNION运算符
(7)位于选择列表中的子查询
(8)FROM 子句中包含多个表
(9)SELECT语句中引用了不可更新视图。
(10)WHERE子句中的子查询,引用FROM子句中的表
插入数据
当使用试图插入数据时,如果在创建视图时加上WITH CHECK OPTION子句,WITH CHECK 子句会在更新数据的时候检查新数据是否符合视图定义中WHERE子句的条件
WITH CHECK OPTION子句只能和可更新视图一起使用
例:创建视图jsj_book,视图包含“计算机”类图书的信息,并向jsj_book视图中插入一条记录“TP.0837“,计算机,OFFICE应用实例,张瑜海,人民邮电出版社,2010-10-21,34.5,NULL,NULL,NULL".
首先创建视图jsj_book
create or replace view jsj_book
as
select *from book
where 图书类别='计算机'
with check option;
插入记录
insert into jsj_book
value('TP.0837','计算机','OFFICE应用实例','张瑜海','人民邮电出版社','2020-10-21',34.5,NULL,NULL,NULL);
修改数据
使用UPDATE 语句可以实现通过视图修改基本表数据。
例:jsj_book视图中所有单价降低%5.
update jsj_book
set 单价=单价*(1-0.05);
例2:将jsj_sell视图中图书编号为”TP.2525“的书名改为”PHP网站制作“,将订单号为5的订购册数改为100册。
update jsj_sell
set 书名='PHP网站制作'
where 图书编号='TP.2525';
update jsj_sell
set 订购册数='100'
where 订单号=5;
删除数据
如果视图来源于单个基本表,可以使用DELETE语句通过视图来删除基本表数据
例:删除jsj_book中”人民邮电出版社记录“。
delete from jsj_book
where 出版社='人民邮电出版社';
修改视图定义
使用ALTER语句可以对已有的定义进行修改
语法格式如下。
ALTER VIEW 视图名 [(列名列表)]
AS SELECT 语句
[WITH [CASCADED | LOCAL] CHECK OPTION
例:将jsj_book视图修改为只包含”计算机“类图书的图书编号、书名和单价。
alter view jsj_book
as
select 图书编号,书名,单价 from book
where 图书类别='计算机';
删除视图
语法格式如下。
DROP VIEW [IF EXISTS]
视图名1[,视图名2]···