1. 视图概述
视图是从一个或多个表或视图中导出的表。
视图与表不同,数据来源的表可以称为基本表。
视图是虚表,视图所对应的数据不进行实际存储。
数据库中只存储视图的定义,对视图的数据进行操作是,系统根据视图的定义去操作与视图关联的基本表。
视图一经定义,可以像表一样进行增删改查。
使用视图有以下好处:
- 为用户集中数据,简化用户的数据查询和处理
- 屏蔽数据库的复杂性,用户不用去了解基本表的数据与结构
- 简化用户权限管理
- 便于数据共享
- 可以重新组织数据以便输出到其他应用程序中
2. 创建视图
CREATE OR REPLACE VIEW 视图名称
AS
SELECT 语句
-
视图名称后,可以子定义列名列表,注意列数要和查询出来的结果一致,如果省略,就用查询出来的列名列表
-
select 语句后,可跟WITH CHECK OPTION对更新数据进行验证。
案例1:创建视图,查询出学生基本信息,以及他所选修的课程名称和成绩
CREATE OR REPLACE VIEW stuInfo
AS
SELECT xs.*, kc.name AS courseName,xs_kc.score
FROM xs,kc,xs_kc
WHERE xs.stuno=xs_kc.stuno
AND kc.courseno=xs_kc.course;
注意:MySQL不区分大小写,所以驼峰命名stuInfo,他会保存成stuinfo,不利于识别,所以数据库中多个单词连接,推荐使用下划线规则stu_info
3. 查询视图
查询视图和查询表是一样的
案例2:从stuinfo视图中查询出王林的相关信息。
SELECT *
FROM stuInfo
WHERE name='王林';
4. 更新视图
1. 可更新视图
包含了以下子句的视图不可更新:
- 聚合函数
- distinct关键字
- group by 子句
- order by 子句
- having 子句
- union 子句
- 子查询
- 多表查询
- select 中有不可更新视图
综上,只剩了where子句和limit。
2. 插入数据
- 如果视图是可更新视图,插入视图数据时,会在基本表也插入数据。
- 如果视图后面加了WITH CHECK OPTION,在更新数据时会检查新数据是否复合视图定义中where子句的条件
- WITH CHECK OPTION只能和可更新视图一起使用
案例3:创建一个视图,只要学生的学号,姓名,专业和学分
CREATE OR REPLACE VIEW stu_credit
AS
SELECT stuno, name, major, credit
FROM xs
WITH CHECK OPTION;
向stu_credit插入一条数据
INSERT INTO stu_credit
VALUES('081304', '唐三', '锻造系', 55);
没加条件,WITH CHECK OPTION能通过,能添加
创建视图时加了条件
CREATE OR REPLACE VIEW stu_credit2
AS
SELECT stuno, name, major, credit
FROM xs
WHERE major='计算机'
WITH CHECK OPTION;
再添加一条数据,major不是计算机
INSERT INTO stu_credit2
VALUES('081305', '小舞', '控制系', 55);
插入失败
有条件是major='计算机',那么就只能插入计算机的人
CHECK OPTION failed 'xscj.stu_credit2
再添加一条数据,major是计算机
INSERT INTO stu_credit2
VALUES('081114', '叶凡', '计算机', 52);
插入成功
插入的时候,还要注意原表的需求,如stuno是主键不能省略
INSERT INTO stu_credit2(name, major, credit)
VALUES('刘备', '计算机', 60);
插入失败
Field of view 'xscj.stu_credit2'
underlying table doesn't have a default value
3. 修改数据
如果数据来自于单表,可以直接修改数据
创建一个视图叫stu_info,包含计算机学生的学号、姓名、专业、学分
CREATE OR REPLACE VIEW stu_info
AS
SELECT stuno, name, major, credit
FROM xs
WHERE major='计算机'
WITH CHECK OPTION;
将严红的学分改成50分
UPDATE stu_info
SET credit=50
WHERE name='严红';
当数据来自于多张表,一次只能修改一张表内容
创建一个视图course_info,查询出学生学号,和他所选课程的名字,和学分
CREATE OR REPLACE VIEW course_info
AS
SELECT stuno, kc.name, kc.credit
FROM kc, xs_kc
WHERE kc.courseno=xs_kc.course;
将801101的学号改为081104,并且计算机基础的学分改为4
UPDATE course_info
SET stuno='081104', credit='4'
WHERE stuno='081101'
AND credit='5';
结果报错:不能同时修改多张基本表
Can not modify more than one base table
through a join view 'xscj.course_info'
只能一张表一张表的修改内容:
UPDATE course_info
SET stuno='081104'
WHERE stuno='081101';
UPDATE course_info
SET credit='4'
WHERE name='计算机基础';
4. 删除数据
删除数据也只能删除单表形成的视图,不能删除多张表组成的视图
将stu_info中诸葛亮的数据删除(成功)
DELETE FROM stu_info
WHERE name='诸葛亮';
删除course_info中的关于计算机基础的信息(失败)
DELETE FROM course_info
WHERE name='计算机基础';
Can not delete from join view 'xscj.course_info'
不能从多表查询得到的视图中删除数据,因为数据来源于多张表
5. 修改视图定义
就是将定义视图时的create or replace 改成 alter
6. 删除视图
语法:DROP VIEW IF EXISTS 视图1,视图2...
网友评论