SQL入门:创建视图

如视图中所讨论的,视图提供在一个或多个表中查看数据的替代方法。通过创建视图,可以对想要各种用户查看的信息进行限制。

下列语句创建 STAFF 表 中 20 部门的非经理人员视图,其中薪水和佣金不通过基表显示。


CREATE VIEW STAFF_ONLY
AS SELECT ID, NAME, DEPT, JOB, YEARS
FROM STAFF
WHERE JOB <> 'Mgr' AND DEPT=20

在创建视图之后,下列语句显示视图的内容:

SELECT *
FROM STAFF_ONLY

早些时候,我们把 STAFF 和 ORG 表连接起来产生一个列出每个部门名称及其部门经理姓名的结果。下列语句创建可重复用于相同目的的视图:


CREATE VIEW DEPARTMENT_MGRS
AS SELECT NAME, DEPTNAME
FROM STAFF, ORG
WHERE MANAGER = ID

创建视图时,可以使用 WITH CHECK OPTION 子句将附加约束添加到通过视图插入和更新表。此子句导致数据库管理程序验证对视图的任何更新或插入是否符合该视图的定义,并拒绝那些不符合定义的更新或插 入。如果省略此子句,则不检查违反视图定义的插入和更新。有关 WITH CHECK OPTION 如何起作用的详情,参考 SQL Reference 中的 CREATE VIEW 语句。


使用视图来处理数据
象 SELECT 语句一样,INSERT、DELETE 以及 UPDATE 语句可以应用于视图,就好象视图是一个实表一样。这些语句处理基本基表中的数据。因此当再次存取该视图时,使用最新的基表对它进行计算。如果未使用 WITH CHECK OPTION,则使用视图修改的数据可能由于不再满足原始视图定义而不在视图的重复存取中出现。

下列是一个将更新应用于视图 FIXED_INCOME 的示例:

FIXED_INCOME 的视图定义:


CREATE VIEW FIXED_INCOME (LNAME, DEPART, JOBTITLE, NEWSALARY)
AS SELECT NAME, DEPT, JOB, SALARY
FROM PERS
WHERE JOB <> 'Sales' WITH CHECK OPTION


UPDATE FIXED_INCOME
SET NEWSALARY = 19000
WHERE LNAME = 'Li'

除了校验选项以外,先前视图中的更新等效于对基表 PERS 的更新:

UPDATE PERS
SET SALARY = SALARY * 1.10
WHERE NAME = 'Li'
AND JOB <> 'Sales'

注意:由于视图是在 CREATE VIEW FIXED_INCOME 中对约束 JOB <> 'Sales'使用 WITH CHECK OPTION 创建的,所以当 Limoges 调去做销售时不允许下列更新:

UPDATE FIXED_INCOME
SET JOBTITLE = 'Sales'
WHERE LNAME = 'Limoges'

不能更新由表达式 SALARY + COMM or SALARY * 1.25 定义的列。如果定义的视图包含一列或多个这样的列,则拥有者不接受对这些列的更新(UPDATE)特权。在包含这样的列的视图上不允许 INSERT 语句,但允许 DELETE 语句。

考虑一个没有一列定义为 NOT NULL 的 PERS 表。可以通过 FIXED_INCOME 视图将行插入 PERS 表中,即使该视图不包含基本表 PERS 的 ID、YEARS、COMM 或 BIRTHDATE。整个视图中看不到的列被适当地设置为空值或缺省值。

然而,PERS 表确实已将列 ID 定义为 NOT NULL。如果尝试通过 FIXED_INCOME 视图插入行,则系统试图将空值插入在整个视图中“看不到”的所有 PERS 列。由于 ID 列未包括在视图中并且该列不允许空值,所以系统不允许通过该视图进行插入。

有关修改视图的规则和限制,参考 SQL Reference 中的 CREATE VIEW 语句。

use pubs
select * from titles


--新建一个视图,存放business类别的书籍
create view title_business
as
select * from titles
where type='business'

select * from title_business

select * from titles
select * from authors
select * from titleauthor

--根据作者姓名,返回该作者的书籍信息
select *
from titles t,authors a,titleauthor ta
where ta.au_id=a.au_id and
ta.title_id=t.title_id
and au_lname='white'

create view title_author
as
select t.title_id,title,type,price,
a.au_id,au_fname,au_lname,phone,address
from titles t,authors a,titleauthor ta
where ta.au_id=a.au_id and
ta.title_id=t.title_id


create table 学生信息1
(
编号 int primary key,
姓名 varchar(10),
性别 char(2)
)
create table 学生信息2
(
编号 int primary key,
姓名 varchar(10),
性别 char(2)
)

create view 学生信息
as
select * from 学生信息1
union
select * from 学生信息2

select * from 学生信息
where 姓名='王云'


select * from authors
create view authors_info
as
select au_id,au_lname,au_fname
from authors


--修改视图
alter view authors_info
as
select au_id,au_lname,au_fname,address
from authors

--删除视图
drop view authors_info

select * from authors_info


--price>该类书籍的均价
select * from titles t,type_avg a
where t.type=a.type and price>avgPrice

select * from type_avg

create view type_avg
as
select avg(price) avgPrice,type
from titles
group by type


posted @ 2008-05-07 10:57  乱炖er  阅读(580)  评论(0编辑  收藏  举报