SQL语言---视图操作


前言

本文主要讲解了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语言—数据更新

猜你喜欢

转载自blog.csdn.net/weixin_52042488/article/details/127129820
今日推荐