视图是一个虚拟表,从一个或多个表中导出(视图也可以从视图中导出),其内容由查询语句定义生成。数据库中只存储了视图定义,而不存放视图所对应的数据,视图所对应的数据仍存放在视图所引用的基表中。
作用
- 视图可以集中数据,满足不同用户对数据的不同要求。
- 视图可以简化复杂查询的结构,从而方便用 户对数据的操作。
- 视图能够对数据提供安全保护。
- 便于组织数据导出。
创建视图
CREATE VIEW view_name [ ( column [ ,...n ] ) ]
AS select_statement
[with check option]
注意如下:
- 在一个视图中最多引用1024列,视图中记录的行数限制由基表中记录数目决定
- 视图名称不允许与该用户拥有的表重名
- 列的名称一般继承其基表中列的名称,如果视图中某一列是算术表达式、函数、常量或者来自多个表的列名相同,必须要为视图中的列定义名称
- 不能在临时表上创建视图,也不能创建临时视图
示例:以学生表为基础建立一个视图,其名称为“学生名单”,其包含列为学生表中的学号和姓名
create view student_inf
as
select id,name
from student
其中[with check option]对通过视图操作的数据是否满足定义视图时的条件做检查.以下对这个选项做说明:
我们可以通过对视图的操作间接操作基表.例如创建如下视图:
create view Math_inf
as
select id,grade from score where claId='math'
向这一视图插入数据
insert into Math_inf values(9,83)
这一指令将转换为对基表score的插入操作执行.根据基表的定义,我们可以看到插入的数据是不完整的,需要通过默认值来填充
insert into score values(9,NULL,83)
所以当我们再次查询这一视图时,发现并没添加新的信息.对于用户而言,在数学成绩信息中成功插入了一条新纪录;而对于数据库来说,新插入的记录并没有指定课程信息,产生了冲突.其根本原因在于对视图的修改不等于对基表的修改.如果对视图的修改能够等价于对基本表的修改,那么这样的更新才是允许的
因此[with check option]是对相关条件进行检查,以保证通过视图的插入和更新操作都满足定义视图时的约束.通常来说,带有where条件的都要加这句
关于修改视图的约束问题,在下文还会详细分析
修改视图
ALTER VIEW view_name [ ( column [ ,...n ] ) ]
AS
select_statement
示例:修改student_inf,以Id,Name,Class显示信息
alter view student_inf(Id,Name,Class)
as
select id,name,claNum from student
删除视图
DROP VIEW { view } [ ,...n ]
使用视图
select colmun_list from view_name
示例:显示student_inf视图
select * from student_inf
在上文提到过,我们可以修改视图从而修改基表.具体的过程是将对视图的操作指令转换为对基表的操作指令,但这一转换不是永远正确的,有时会存在逻辑上的冲突,根本原因就在于在视图限定的条件没有在转换后的指令上体现出来
示例:
CREATE VIEW 数据库成绩
AS
SELECT *
FROM S_C
WHERE CNO = '001'
UPDATE 数据库成绩
SET SCORE=SCORE*1.1
WHERE SNO='0003'
将上面的更新指令等价到基表上,则有
update S_C
set SCORE=SCORE*1.1
where SNO='0003'
并没有体现CNO='001’这一约束,因此是不对的
删除也是同样的道理,在视图中删除不等价于在基表中删除
DELETE FROM 数据库成绩
WHERE SNO= '0002'
DELETE FROM S_C
WHERE SNO= '0002'
下面这条语句转换后是正确的
CREATE VIEW 学生名单
AS
SELECT SNO,SNAME
FROM S
INSERT INTO 学生名单
VALUES ('0011','zz')
在视图中插入,等价于在基表中插入
insert into S values('0011','zz',NULL...)
例题:给出表 student(id,name,sex,birth,admission_time,department_code)
1.建立计算机系(department_code= ‘01’ )学生视图,该视图包含学生的id,name和admission_time信息
create view compute_student
as
select id,name,admission_time
from student
where department_code='01'
with check option
2)建立student表中全体学生年龄的视图,该视图包含学生的id、name和年龄信息
create view all_student_age
as
select id,name,(YEAR(GETDATE())-YEAR(birth) AS age)
from student
给出表
| 学生 | 学号,姓名,性别 |
|---|---|
| 课程 | 课程号,课程名 |
| 选修 | 学号,课程号,成绩 |
1)建立选修“高等数学”的学生的视图,该视图包含学生的学号和姓名信息
CREATE VIEW 高等数学
AS
SELECT 学号,姓名
FROM 学生
WHERE
学号 IN
(SELECT 学号 FROM 选修 WHERE 课程号=
(SELECT 课程号 FROM 课程 WHERE 课程名='高等数学')
)
WITH CHECK OPTION
2)建立没有获得学分(成绩<60)的学生的视图,该视图包含学生的学号、姓名、课程名和成绩信息
CREATE VIEW 没有学分
AS
SELECT 学号,姓名,课程名,成绩
FROM (学生 JOIN 选修 ON 学生.学号=选修.学号)
JOIN 课程 ON 课程.课程号=选修.课程号
WHERE
成绩<60
本文详细介绍了MySQL视图的概念,视图作为虚拟表,存储的是查询定义而非数据。视图的作用包括集中数据、简化查询、提供数据安全和方便数据导出。创建视图时需要注意列数限制、名称冲突等问题,并可以通过`WITH CHECK OPTION`进行更新检查。修改视图示例演示了如何改变显示信息。删除视图的正确操作。最后,通过示例展示了如何使用视图进行数据操作,强调了对视图的操作需考虑与基表的一致性。
3605

被折叠的 条评论
为什么被折叠?



