数据库系统概论学习笔记(六):SQL的简单应用之试视图

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/credolhcw/article/details/57079542

数据逻辑独立的一种解决方案 —— 视图

官方文档:https://dev.mysql.com/doc/refman/5.7/en/views.html

“视图”,可以视为关系数据库模式结构中的外模式。其作用主要是:

①、简化用户的操作。DBA通过视图,可以过滤掉与用户无关的信息,让用户更加专注于其工作的内容。

②、使用户能够以多种角度看待同一数据。这一作用主要针对拥有多种种类的DBS。

③、对重构数据库提供了一定程度的逻辑独立性支持。

④、能够对机密数据提供安全保护。这个功能其实是对第一个功能的另一个应用,即DBA可以通过建立视图,仅提供用户其权限所允许的数据。

⑤、适当的利用视图可以更清晰的表达查询。


定义视图

在数据库中仅存储了视图的定义,并不会存储视图内的数据。对视图的操作,最终会通过视图消解转换成对基本表的操作。


建立视图

官方文档:https://dev.mysql.com/doc/refman/5.7/en/create-view.html

SQL语言格式:

CREATE [ OR REPLACE ] VIEW <视图名> [ ( <列名>, <列名>, … ) ]
AS <子查询>
[ WITH CHECK OPTION ]

The CREATE VIEW statement creates a new view, or replaces an existing view if the OR REPLACE clause is given. If the view does not exist, CREATE OR REPLACE VIEW is the same as CREATE VIEW. If the view does exist, CREATE OR REPLACE VIEW is the same as ALTER VIEW.

MySQL中,当视图 v 不存在时,CREATE VIEW 和 CREATE OR REPLACE 的语义是一样的意思。但是当 v 存在时 CREATE OR REPLACE 就相当于 ALTER VIEW。

ORDER BY is permitted in a view definition, but it is ignored if you select from a view using a statement that has its own ORDER BY.

这与教材上说的不同,在MySQL中,建立视图时是可以使用 ORDER BY 语句的,但是当在一个已经通过ORDER BY建立的视图 v1 之上建立视图 v2 时,定义视图的语句中的“ORDER BY”将被忽略。

说了这么多,开始上例子:

例1、建立信息系学生的视图。

CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept = 'IS';

Create View 1
 

例2、建立信息系学生的视图,并要求进行修改和插入时仍需保证该视图只有信息系的学生。

CREATE OR REPLACE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept = 'IS'
WITH CHECK OPTION;

Create View 2

WITH CHECK OPTION:表示对视图进行UPDATE、INSERT、DELETE时,要保证满足视图定义中的谓词条件。

官方文档:https://dev.mysql.com/doc/refman/5.7/en/view-check-option.html

以上皆为由单表导出的行列子视图。视图还可以建立在多张表以及视图之上。

例3、建立信息系选修了1号课程且成绩在90分以上的学生的视图。

由于例2中已经用“WITH CHECK OPTION”定义了视图IS_Student,也就是说如果我们使用IS_Student为基础定义新视图,就会自动限制在“ WHERE Sdept = ‘IS’ ”条件下。

CREATE VIEW IS_S2
AS
SELECT IS_Student.Sno,Sname,Grade
FROM IS_Student,SC
WHERE IS_Student.Sno = SC.Sno;

Create View 3
 

为了减少数据库的冗余数据,且能够尽量减少用户的操作,并专注于其工作内容,往往会定义一些代表达式的视图。

例4、定义一个反映学生出生年份的视图。

CREATE VIEW BT_S(Sno,Sname,Sbirth)
AS
SELECT Sno,Sname,2017-Sage
FROM Student;

Create View 4


删除视图

SQL语句格式:

DROP VIEW <视图名>,<视图名>,…

在MySQL中,同样该语句后面可以加上“RESTRICT”或“CASCADE”,但是依然没什么卵用。

RESTRICT and CASCADE, if given, are parsed and ignored.

官方文档:https://dev.mysql.com/doc/refman/5.7/en/drop-view.html

例5、删除前面例子所建视图“BT_S”和“IS_S2”。

DROP VIEW BT_S,IS_S2;

Drop View 5
 


查询视图

正如我使用SHOW TABLES来查看视图存不存在一样,当视图建立好之后,几乎就能当做表来用了。

例6、教材上说某些关系数据库并不能对包涵聚集函数的视图进行正确的查询转换,那么我们就测试一下MySQL可不可以做到。

首先,建立一个各学院学生平均年龄的视图S_A。

CREATE VIEW S_A(Sno,Avg_Age)
AS
SELECT Sdept,AVG(Sage)
FROM Student
GROUP BY Sdept;

然后,查询学生平均年龄在20岁以上的学院。

SELECT * FROM S_A
WHERE Avg_Age >= 20;

结果如下:
Select View 6

该例说明MySQL是可以进行正确转换的,请放心使用。


更新视图

官方文档:https://dev.mysql.com/doc/refman/5.7/en/view-updatability.html

由于视图并不是表,所以对其进行的更新操作同样会经过视图消解转化成对基本表的操作。

另外,为了避免用户对视图进行更新操作时,更新了不属于视图范围内的数据,故强烈推荐在视图定义时加上“WITH CHECK OPTION”。

MySQL关于View的更新操作还蛮多的,尽量不用视图更新就好了,嘿嘿嘿……

猜你喜欢

转载自blog.csdn.net/credolhcw/article/details/57079542