文章目录
- 前言
- 一、视图
- 1.什么是视图?
- 2.建立视图
- 3.删除视图
- 二、定义视图
- 1.建立视图
- (1)语法格式
- (2)举例讲解
- 例子1:建立房间视图
- 例子2:基于多表建立视图
- 例子3:基于视图建立视图
- 例子4:基于表达式的视图
- 2.删除视图
- (1)语法格式
- 三、查询视图
- 1.查询视图与查询基本表的区别
- 2.语法使用
- (1)举例讲解
- 例子1:查询分数
- 四、更新视图
- 1.更新视图与更新基本表的区别
- 2.语法使用
- (1)举例讲解
- 例子1:更改视图的单一元组
- 例子2:插入元组
- 例子3:删除元组
- 3.ORACLE的限制
- 总结
前言
本文主要讲解了SQL语言的视图操作,并且结合实例来讲解具体的代码操作
一、视图
1.什么是视图?
- 视图是一个虚表,是从一个或几个基本表(或视图)导出的表
- 它只存放视图的定义,不存放视图对应的数据
- 同时基表中的数据发生变化,从视图中查询出的数据也随之改变
2.建立视图
- 关系数据库管理系统执行CREATE VIEW语句时只是把视图定义存入数据字典,并不执行其中的SELECT语句。
- 在对视图查询时,按视图的定义从基本表中将数据查出。
- 若一个视图是从单个基本表导出的,并且只是去掉了基本表的某些行和某些列,但保留了主码,我们称这类视图为行列子集视图
3.删除视图
- 删除视图是从数据字典中删除指定的视图定义
- 如果该视图上还导出了其他视图,使用CASCADE级联删除语句,把该视图和由它导出的所有视图一起删除
- 删除基表时,由该基表导出的所有视图定义都必须显式地使用DROP VIEW语句删除
二、定义视图
1.建立视图
(1)语法格式
CREATE VIEW
<视图名> [(<列名> [,<列名>]…)]
AS <子查询>
[WITH CHECK OPTION];
(2)举例讲解
例子1:建立房间视图
建立本科生宿舍2栋的房间视图(F_BUILDID=2)
CREATE VIEW ROOM_2
AS
SELECT F_ROOMID, F_ROOMNUM, F_ROOMATTR
FROM ROOM_INFORMATION
WHERE F_BUILDID=2;
注意:
建立ROOM_2视图时,去掉了F_BUILD不等于2的元组,保留了主码F_ROOMID,
所以ROOM_2为行列子集视图
例子2:基于多表建立视图
建立学生成绩视图(包括学号、课程名称、成绩)
已知两个表
由于没有具体的属性名,这里给出了中文描述,不符合语法,故加上<>,以示用来“描述”属性名。
CREATE VIEW STU_GRADE(<学号>,<课程名称>,<成绩>)
AS
SELECT <成绩表.学号>,<成绩表.成绩>,<课程表.课程名称>
FROM <成绩表>,<课程表>
WHERE
<课程表.课程编号>=<成绩表.课程编号>;
例子3:基于视图建立视图
建立成绩在80以上的学生成绩视图(包括学号、课程名称、成绩)
由于没有具体的属性名,这里给出了中文描述,不符合语法,故加上<>,以示用来“描述”属性名。
CREATE VIEW STU_GRADE_80(<学号>,<课程名称>,<成绩>)
AS
SELECT <学号>,<成绩>,<课程名称>
FROM STU_GRADE
WHERE
<成绩>>=80;
例子4:基于表达式的视图
建立数据库课程,学生所丢失分数(假设总分100分)的视图(包括学号、丢失分数)
由于没有具体的属性名,这里给出了中文描述,不符合语法,故加上<>,以示用来“描述”属性名。
CREATE VIEW STU_GRADE_DATA (<学号>,<丢失分数>)
AS
SELECT <学号>,(100-<成绩>)
FROM <成绩表>
WHERE
<课程编号>=(
SELECT <课程编号>
FROM <课程表>
WHERE <课程名称>='数据库');
2.删除视图
(1)语法格式
DROP VIEW <视图名>[CASCADE];
三、查询视图
1.查询视图与查询基本表的区别
-
用户角度:查询视图与查询基本表相同,语法格式与使用也基本一致
-
关系数据库管理系统实现视图查询的方法
视图消解法(View Resolution)
1.进行有效性检查
2.转换成等价的对基本表的查询
3.执行修正后的查询
2.语法使用
查询视图与查询基本表相同,语法格式与使用也基本一致
具体可以参考文章:
SQL语言—数据的查询
(1)举例讲解
例子1:查询分数
查询平均分数大于90分的学生学号
SELECT *
FROM (
SELECT <学号>,AVG(<成绩>)
FROM <成绩表>
GROUP BY <学号>
)
AS STU_GRADE_AVG1 (<学号>,<平均分数>)
WHERE <平均分数>>=90
四、更新视图
1.更新视图与更新基本表的区别
- 从用户角度而言, 更新视图与更新基本表的方法相同
- DBMS实现视图更新的方法
1.视图实体化法(View Materialization)
2.视图消解法(View Resolution) - 定义视图时指定WITH CHECK OPTION子句后, DBMS在更新视图时会进行检查, 防止用户通过视图对数据进行增加、删除、修改时, 操作不属于视图范围内的基本表数据
2.语法使用
更新视图与更新基本表相同,语法格式与使用也基本一致
具体可以参考文章:
SQL语言—数据更新
(1)举例讲解
例子1:更改视图的单一元组
将ROOM_2视图中的F_ROOMID为10506的F_ROOMNUM更改为302
UPDATE ROOM_2
SET F_ROOMNUM=302
WHERE F_ROOMID=10506
例子2:插入元组
将ROOM_2视图中的插入一条新数据,其中F_ROOMID为10807,F_ROOMNUM为508,F_ROOMATTR为学生寝室。
INSERT
INTO ROOM_2
VALUES(‘10807’,’508’,’学生寝室’)
例子3:删除元组
将ROOM_2视图中的F_ROOMNUM为406房间删除
DELETE
FROM ROOM_2
WHERE F_ROOMNUM=406
UPDATE ROOM_2
SET F_ROOMNUM=302
WHERE F_ROOMID=10506
3.ORACLE的限制
-
简单视图可以执行DML操作;
-
在视图包含GROUP 函数,GROUP BY子句,DISTINCT关键字时不能删除数据行;
-
在视图不出现下列情况时可通过视图修改基表数据或插入数据:
1.视图中包含GROUP 函数,GROUP BY子句,DISTINCT关键字;
2.使用表达式定义的列;
3.ROWNUM伪列。
4.基表中未在视图中选择的其他列定义为非空且无默认值。 -
一个不允许更新的视图上定义的视图也不允许更新
总结
文章不妥之处请读者包涵指正
其它关于SQL语法的知识可以看文章:
SQL语言概述与SQL语言的数据定义
SQL语言—数据的查询
SQL语言—数据更新
更多推荐
SQL语言---视图操作
发布评论