7.3视图
7.3视图概述
1. 视图的概念
视图是指从一个或多个表(或视图)导出的表,它与基本表不同,是虚拟表。
2 . 视图的分类
(1)基于单表的视图:从单个表中导出的视图。在基于单表的视图中若只是去了基本表的某些行或某些列,但保留了主键,这种视图称为行列子集视图。
(2)基于多表的视图:从多个表中导出的视图。
(3)基于视图的视图:从一个或多个视图中导出的视图。
(4)基于表和视图的视图:从基本表和视图中导出的视图
3. 视图的优点
(1)视图能够简化用户的的操作。
(2)视图为重构数据库提供了一定程度的逻辑独立性。
(3)视图能够对机密数据提供安全保护。
7.4 MySQL 视图管理
7.4.1 视图的建立
1. 创建基于单表的视图
语法格式:
CREATE VIEW 视图名
AS
SELECT 查询语句 ;
例如建立视图view_sdept,包含系别信息。
CREATE VIEW view_sdept
AS
SELECT DISTINCT sdept FROM student;
视图中定义了DISTINCT,因此视图中的每个系别只出现一次。
语法格式:
CREATE VIEW 索引名
AS
SELECT 复杂查询语句;
例如建立计算机系学生的视图view_cs,包含sno,sname,sdept,birthday,totalcredit ,remarks。
CREATE VIEW view_cs
AS
SELECT sno,sname,sdept,birthday,totalcredit,remarks
FROM student
WHERE sdept='计算机';
语法格式:
CREATE VIEW 视图名
AS
SELECT 复杂查询语句
WITH CHECK OPTION;
例如建立通信工程系学生的视图view_ce,包含sno,sname,sdept,birthday,totalcredit ,remarks,并要求进行修改和插入操作后仍保证该视图只有通信工程系的学生。
CREATE VIEW view_ce
AS
SELECT sno,sname,sdept,sex,birthday,totalcrdeit,remarks
FROM student
WHERE sdept='通信工程'
WITH CHECK OPTION ;
定义view_ce视图时加上了WITH CHECK OPTION参数,这样对视图进行插入、修改和删除操作时,RDBMS会自动加上dept=‘通信工程’的调件。
以上3个基于单表的视图,view_cs和view_ce保留了主键,均为行列子集视图;view_sdept视图不包含主键,不是行列子集视图。
建立反映学生年龄的视图view_age,包含sno ,sname,age。
CREATE VIEW view_age(sno,sname,age )
AS
SELECT sno,sname,YEAR(curdate())-YEAR(birthday)
FROM student;
年龄需要使用表达式YEAR(curdate()) - YEAR(birthday)。
可在SELECT语句中为表达式的列名,则视图会使用别名作为默认名。
CREATE VIEW view_age
AS
SELECT sno,sname,YEAR(curdate())-YEAE(birthday) as age
FROM student;
创建反映学生平均成绩的视图view_avgscore,包含sno,avgscore。
CREATE VIEW view_avgscore
AS
SELECT sno ,AVG(grade) as avgscore
FROM score group by sno;
平均 成绩需要使用聚集函数得到,view_avgscore是分组视图。
2. 创建基于多表的视图
例如建立计算机选修了102号课程的学生的视图view_cs_102,包含sno,sname,grade.
CREATE VIEW view_cs_102
AS
SELECT student.sno ,sname,grade FROM student,score
WHERE student.sno = score.sno and sdept='计算机' and cno='102';
3. 创建基于视图的视图
例如计算机系选修了102号课程且成绩不低于90分的学生的视图view_cs_102_90,包含sno,snam,grade。
CREATE VIEW view_cs_102_90
AS
SELECT sno ,sname,grade
FROM view_cs_102
WHERE grade>=90;
7.4.2 视图的查看
1. 使用DESCRIBE语句查看视图
使用DESCRIBE 或DESC语句不仅可以查看表的基本字段信息,还可以查看视图的字段信息,包含字段名、字段类型等信息。
语法格式:
DESCRIBE 视图名;
例如查看view_cs的字段信息。
DESCRIBE view_cs;
- Field: 字段名。
- Type: 字段的数据类型。
- Null: 表示该列是否可以为空。
- Key: 表示该列是否已有索引。
- Default: 表示该列是否有默认值。
- Extral: 表示获得到的与给定列相关的附加信息。
2. SHOW CREATE VIEW 语句查看视图
使用SHOW CREATE VIEW 语句不仅可以查看创建视图的语句,还可以查看视图的字符编码。
语法格式:
SHOW CREATE VIEW 视图名
例如查看视图view_ce的创建语句。
SHOW CREATE VIEW view_ce;
3. 在views表中查看视图
所有视图的定义都存储在information_schema数据库下的views 表中,也可以在这个表中查看视图的详细信息。
语法格式:
SELECT * FROM information_schema.views WHERE table_name=‘视图名’;
例如查看视图view_cs_102的信息
SELECT * FROM information_schema.views
WHERE table_name='view_cs_102';
7.4.3 视图的修改
1. 使用CREATE OR REPLACE 语句修改视图
例如修改视图view_cs,删除备注字段remarks.
create or replace view view_cs
as
select sno,sname,sdept,birthday,totalcredit
from student
where sdept='计算机';
2. 使用ALTER 语句修改视图
语法格式:
ALTER VIEW 视图名
AS
SELCET(复杂查询语句)
alter view view_cs
as
select sno,sname,sdept,birthday,totalcredit
from student
where sdept='计算机';
7.4.4 视图的更新
1. 通过视图插入数据
语法格式:
INSERT
INTO 视图名
VALUES(‘字段1的值’,‘字段2的值’ …‘字段n的值’)
例如在view_ce插入一条数据,其中sno=‘1208’,sname=‘李小荣’,dept=‘通信工程’,ssex=‘女’,birthday=‘2004-4-3’,totalcredit=0;
INSERT
INTO view_ce
VALUES ('1208', '李小荣', '通信工程', '女', '2004-4-3', 0);
2. 通过视图修改数据\
语法格式:
UPDATE 视图名
SET 字段名=新字段值
WHERE
例如将视图view_ce中sno为1208的学生的remarks修改为“优秀团员”
update view_ce
set remarks='优秀团员'
where sno='1208'l;
3. 通过视图删除数据
例如使用delete语句将通信工程系学生视图view_ce中sno为1208的学生删除。
delete
from view_ce
where sno='1208';
7.4.5 视图的删除
语法格式:
DROP VIEW 视图名
例如删除视图view_cs_102.`
drop view view_cs_102;