本文主要讲解了SQL语言的视图操作,并且结合实例来讲解具体的代码操作
CREATE VIEW
<视图名> [(<列名> [,<列名>]…)]
AS <子查询>
[WITH CHECK OPTION];
建立本科生宿舍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为行列子集视图
建立学生成绩视图(包括学号、课程名称、成绩)
已知两个表
由于没有具体的属性名,这里给出了中文描述,不符合语法,故加上<>,以示用来“描述”属性名。
CREATE VIEW STU_GRADE(<学号>,<课程名称>,<成绩>)
AS
SELECT <成绩表.学号>,<成绩表.成绩>,<课程表.课程名称>
FROM <成绩表>,<课程表>
WHERE
<课程表.课程编号>=<成绩表.课程编号>;
建立成绩在80以上的学生成绩视图(包括学号、课程名称、成绩)
由于没有具体的属性名,这里给出了中文描述,不符合语法,故加上<>,以示用来“描述”属性名。
CREATE VIEW STU_GRADE_80(<学号>,<课程名称>,<成绩>)
AS
SELECT <学号>,<成绩>,<课程名称>
FROM STU_GRADE
WHERE
<成绩>>=80;
建立数据库课程,学生所丢失分数(假设总分100分)的视图(包括学号、丢失分数)
由于没有具体的属性名,这里给出了中文描述,不符合语法,故加上<>,以示用来“描述”属性名。
CREATE VIEW STU_GRADE_DATA (<学号>,<丢失分数>)
AS
SELECT <学号>,(100-<成绩>)
FROM <成绩表>
WHERE
<课程编号>=(
SELECT <课程编号>
FROM <课程表>
WHERE <课程名称>='数据库');
DROP VIEW <视图名>[CASCADE];
用户角度:查询视图与查询基本表相同,语法格式与使用也基本一致
关系数据库管理系统实现视图查询的方法
视图消解法(View Resolution)
1.进行有效性检查
2.转换成等价的对基本表的查询
3.执行修正后的查询
查询视图与查询基本表相同,语法格式与使用也基本一致
具体可以参考文章:
SQL语言—数据的查询
查询平均分数大于90分的学生学号
SELECT *
FROM (
SELECT <学号>,AVG(<成绩>)
FROM <成绩表>
GROUP BY <学号>
)
AS STU_GRADE_AVG1 (<学号>,<平均分数>)
WHERE <平均分数>>=90
更新视图与更新基本表相同,语法格式与使用也基本一致
具体可以参考文章:
SQL语言—数据更新
将ROOM_2视图中的F_ROOMID为10506的F_ROOMNUM更改为302
UPDATE ROOM_2
SET F_ROOMNUM=302
WHERE F_ROOMID=10506
将ROOM_2视图中的插入一条新数据,其中F_ROOMID为10807,F_ROOMNUM为508,F_ROOMATTR为学生寝室。
INSERT
INTO ROOM_2
VALUES(‘10807’,’508’,’学生寝室’)
将ROOM_2视图中的F_ROOMNUM为406房间删除
DELETE
FROM ROOM_2
WHERE F_ROOMNUM=406
UPDATE ROOM_2
SET F_ROOMNUM=302
WHERE F_ROOMID=10506
简单视图可以执行DML操作;
在视图包含GROUP 函数,GROUP BY子句,DISTINCT关键字时不能删除数据行;
在视图不出现下列情况时可通过视图修改基表数据或插入数据:
1.视图中包含GROUP 函数,GROUP BY子句,DISTINCT关键字;
2.使用表达式定义的列;
3.ROWNUM伪列。
4.基表中未在视图中选择的其他列定义为非空且无默认值。
一个不允许更新的视图上定义的视图也不允许更新
文章不妥之处请读者包涵指正
其它关于SQL语法的知识可以看文章:
SQL语言概述与SQL语言的数据定义
SQL语言—数据的查询
SQL语言—数据更新