mysql中有关视图的概念、操作及作用

1、视图的概念

视图是从一个或几个基本表(或视图)中导出的表。他与基本表不同,但在操作上又与基本表相似。数据库只存放视图的定义(存放在数据字典中),而不存放视图对应的数据。所以一旦基本表中的数据发生变化,从视图中查询出的数据也就随之改变了。从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化。
视图一经定义,就可以和基本表一一样被查询、 被删除。也可以在一个视图之上再定义新的视图,这种类型的视图,会对视图的更新(增、删、改)操作则有一定的限制。

2、视图的操作

2.1、建立视图

SQL语言用CREATE VIEW命令建立视图,其一般格式为:

CREATE VIEW 视图名 [列名1,列名2...]

AS 子查询

[WITH CHECK OPTION];

其中,子查询可以是任意的SELECT语句,是否可以含有ORDER BY子句和DISTINCT短语,则取决于具体系统的实现(mysql中可以含有ORDER BY子句和DISTINCT短语,不知其他数据库能否含有)。

WITH CHECK OPTION表示对视图进行UPDATE、INSERT和DELETE操作时要保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)如果满足则操作成功,反之操作失败。

组成视图的属性列名或者全部省略或者全部指定,没有第三种选择。如果省略了视图

的各个属性列名,则隐含该视图由子查询中SELECT子句目标列中的诸字段组成但在下

列三种情况下必须明确指定组成视图的所有列名:

  1. 某个目标列不是单纯的属性名,而是聚集函数或列表达式;
  2. 多表连接时选出了几个同名列作为视图的字段:
  3. 需要在视图中为某个列启用新的更合适的名字。

例如在mystudent数据库中,有一基本表student,主码是Sno表示学生学号,还有Sname(学生姓名)、Ssex(学生性别)、Sage(学生年龄)、Sdept(学生所在系)多个字段。

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

CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept='IS';  /*IS是指信息系*/

该示例中省略了视图IS_Student的列名,则表明IS_Student的列名是由select子句中的三个列名组成。

数据库只存放视图的定义(存放在数据字典中),并不执行其中的select查询子句。只是在对视图查询时,才按视图的定义从基本表中将数据查出。

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

CREATE VIEW IS_Student
AS
SELECT Sno,Sname,Sage
FROM Student
WHERE Sdept='IS'
WITH CHECK OPTION;  #with check option会判断对该视图进行增删改时是否满足where子语句

由于在定义IS_Student视图时加上了WITH CHECK OPTION子句,以后对该视图进行插入、修改和删除操作时,关系数据库管理系统会自动判断新的数据是否满足Sdept='IS'的条件,若满足则操作成功,反之操作失败。

下面介绍一种特殊且重要的视图类型——行列子集视图

行列子集视图:若一个视图是从单个基本表导出的,并且只是去掉了基本表的某些行和某些列,但保留了主码,则称这类视图为行列子集视图。

示例1、2中的IS_Student视图就是一个行列子集视图。

示例3:

create view view1(学号,姓名,学科,分数
as
select student.Sno,Sname,sc.Sname,sc.grade
from student,sc
where student.sno=sc.sno;

上面的view1不是行列子集视图,因为该视图不是从一个基本表中导出的。这是一个细节,很多新手都会忽略这一点。同时注意行列子集视图要求必须包含主码。

只有行列子集视图才能进行删除、增加、修改,其他类型的不可以。

视图不仅可以建立在单个基本表上,也可以建立在多个基本表上。

示例4:

在mystudent数据库中,还有学生选课SC基本表,该表中有学生学号、课程号、分数三个字段,其中学生学号和课程号共同组成SC表的主码。

这时我们想建立一个信息系选修了1号课程的学生的视图,显然该视图建立在多个基本表上。

create view IS_C1(Sno,Sname,Grade) 
as
select Student.Sno,Sname,Grade
from Student,SC
where Sdept='IS' and Student.Sno=SC.Sno and SC.Cno='1';

由于视图IS_C1的属性列中包含了Student表与SC表的同名列Sno,所以必须在视图名后面明确说明视图的各个属性列名。

视图不仅可以建立在一个或多个基本表上,也可以建立在一个或多个已定义好的视图上,或建立在基本表与视图上(可以混合)。

示例5,建立信息系选修了1号课程且成绩在90分以上的学生的视图:

针对这道题,我们可以使用在Student和SC基本表上建立视图,但是我要求不能用这种方式。怎么办呢?我们是否能在刚才的视图上再新建一个视图,答案是肯定可以的。

create view IS_C1_GradeMore90
as
select Sno,Sname,Grade
from IS_C1
where Grade>90;

显然IS_C1_GradeMore90视图是建立在IS_C1视图上的。

定义基本表时,为了减少数据库中的冗余数据,表中只存放基本数据,由基本数据经过各种计算派生出的数据一般是不存储的。由于视图中的数据并不实际存储,所以定义视图时可以根据应用的需要设置一些派生属性列。这些派生属性由于在基本表中并不实际存在,也称它们为虚拟列。带虚拟列的视图也称为带表达式的视图。

示例6,建立一个反应学生出生年份的视图:

create view Birth_S(Sno,Sname,Sbirth)
as
select Sno,Sname,YEAR(NOW())-Sage
from Student;

这里视图Birth_S是一个带表达式的视图,视图中的出生年份值是通过计算得到的。还可以看到子查询语句中使用了列表达式,因此Birth_S视图中就要指明属性列。

还可以用带有聚集函数和group by 子句的查询来定义视图,这种视图称为分组视图

示例7,将学生的学号及平均成绩定义为一个视图:

create view S_Grade(Sno,Gavg)
as
select Sno,AVG(Grade)
from SC
group by Sno;

由于select子句中使用了聚集函数,所以在定义视图时要明确指出组成S_Grade视图的各个属性列名。

2.2、查看视图基本信息

我们可以像查看基本表一样,来查看视图的基本信息。主要有两个语句:

show create view 视图名\G

desc 视图名;

这两种方式查看到的信息有所不同,可以结合使用。

2.3、查询视图

注意这里是查询视图中的数据信息,不是上面的视图基本信息。视图定义后,用户就可以像对基本表一样对视图进行查询了,它们二者的查询方式基本一致。

在这里要说明2点

第1点:有关查询视图系统内部发生的动作。关系数据库管理系统执行对视图的查询时,首先进行有效性检查,检在查询中涉及的表、视图等是否存在。如果存在,则从数据字典中取出视图的定义,把定义中的子查询和用户的查询结合起来,转换成等价的对基本表的查询,然后再执行修正了的查询。这一转换过程称为视图消解

第2点:在视图上查询和基于派生表的查询的区别。视图一旦定义,其定义将永久保存在数据字典中,之后的所有查询都可以直接引用该视图。而派生表只是在语句执行时临时定义,语句执行后该定义即被删除。

具体查询视图操作和查询基本表操作一样,这里不再举例。

2.4、删除视图

drop view 视图名 [cascade];

使用cascade时,为级联删除,也就是与该视图相关连的数据对象都会被删除。

3、视图的作用

视图最终是定义在基本表之上的,对视图的一切操作最终也要转换为对基本表的操作。而且对于非行列子集视图进行查询或更新时还有可能出现问题。既然如此,为什么还要定义视图呢?这是因为合理使用视图能够带来许多好处。

  1. 视图能够简化用户的操作
  2. 视图使用户能以多种角度看待同一数据
  3. 视图对重构数据库提供了一定程度的逻辑独立性
  4. 视图能够对机密数据提供安全保护
  5. 适当定义视图可以更清晰地表达查询

对第3点说明一下:

数据的逻辑独立性是指当数据库重构造时,如增加新的关系或对原有关系增加新的字段等,用户的应用程序不会受影响。

层次数据库和网状数据库一般能较好地支持数据的物理独立性,而对于逻辑独立性则不能完全地支持。在关系数据库中,数据库的重构往往是不可避免的。重构数据库最常见的是将一个基本表“垂直”地分成多个基本表。例如:将学生关系Student(Sno,Sname,Ssex,Sage,Sdept)分为SX(Sno,Sname,Sage)和SY(Sno,Ssex,Sdept)两个关系。这时原表Student为SX表和SY表自然连接的结果。如果建立一个视图Student:

CREATE VIEW Student(Sno,Sname,Ssex,Sage,Sdept)
AS
SELECT SX.Sno,SX.Sname,SY.Ssex,SX.Sage,SY.Sdept
FROM SX,SY
WHERE SX.Sno=SY.Sno:

这样尽管数据库的逻辑结构改变了(变为SX和Y两个表),但应用程序不必修改,因为新建立的视图定义为用户原来的关系,使用户的外模式保持不变,用户的应用程序通过视图仍然能够查找数据。

当然,视图只能在一定程度上提供数据的逻辑独立性,比如由于对视图的更新是有条件的,因此应用程序中修改数据的语句可能仍会因基本表结构的改变而需要做相应修改。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值