当前课程知识点:MySQL数据库案例教程 > 第4章 查询与视图 > 4.6 视图 > 4-6视图视频2
前面讲过了学习了视图的创建
修改和删除的操作
下面我们就来学习如何使用视图
操作基本表中的数据
视图创建好了以后可以当作基本表一样来使用
可以视图对基本表数据完成查询
添加、修改和删除的操作
我们首先来查询数据
来看【案例3】
查询 女生的sid
sname,sex,department和年龄
那么这个查询可以从student表中去做查询
也可以通过刚刚创建的v1视图来查询
查询语句可以这样写
Select * from v1 where sex=’女’;
执行
查询完成
可以看到在这个查询里v1作为查询的数据源
下面我们通过视图来添加记录
来看【案例4】
通过v1插入如下记录
学号8888
姓名张敏敏
性别女
系部信息工程系
我们尝试着用视图来添加数据
语句可以这样写
Insert into v1
(sid,sname,sex,department)
Values(‘8888’,‘
张敏敏’,’女’,’信息工程系’)
我们来执行命令
目标视图不能进行插入操作
出现错误
不能插入记录
原因是什么呢?
原因是v1视图里有一个表达式
计算年龄的表达式
当视图的列包含表达式的时候
是不能通过视图往表中添加记录
我们再来通过v2插入如下记录
学号 9999
姓名张萌萌
课程号01
课程名大学英语
成绩90
V2视图的数据来自于三个表
如果命令这样写
Insert into v2
Values(‘9999’
张萌萌’,’01’,’大学英语’,90)
那么能不能把这些数据
同时插入到三个表中呢?
我们来尝试一下
运行是不可以的
不能插入数据到连接视图stu.v2中
也就是说不能通过视图
一次往多个表中添加数据
那能不能通过多表视图
往一个表中添加数据呢?
来看【案例6】
通过v2往course表插入如下记录
课程代号:55
课程名称:人工智能
在插入记录之前
我们先来查看视图v2的列来自于哪些表
可以看到cno和cname
这两个字段来自于course这个表
命令可以这样写
Insert into v2(cno,cname)
Values(‘55’, ‘人工智能’)
执行
可以看到一行受影响
我们再来看有没有插入到course表中
Select * from course;
可以看到55
人工智能这门课已经插入到cname表中
通过这个案例我们可以看到
通过多表视图往表中插入记录时
一次只能往一个表中插入数据
那接下来我们把v1做一下修改
去掉计算的列age
执行
成功
那我们接下来再来执行案例4
插入成功
再来看记录有没有插入到student表中
Select * from student
可以看到记录插入成功
通过视图往表中插入数据失败通常的原因
有这样几个
第一
定义视图的select语句后面
有数学表达式或聚合函数
第二
操作的视图定义在多个表上
第三
没有满足视图定义的基本条件
第四
定义视图的select语句中
使用了DISTINCT,UNION
TOP,GROUP BY等短语
这些都会导致视图往基本表中插入记录失败
请同学们在使用时一定要注意这些问题
那接下来我们来看
如何通过视图来修改基本表中的数据
如通过v1修改记录
将8888的学号修改为6688
语句可以这样写
Update v1
Set sid=’6688’
Where sid=’8888’;
点击执行
执行成功
来查看数据
Select * from student;
可以看到张敏敏学号已经修改为6688
还可以通过视图来删除基本表的数据
来看【案例8】
通过视图v1
将学号修改为“6688”的记录删除
语句可以这样写
Delete v1 where sid=’6688’
执行成功
来查看数据
Select * from student;
可以看到6688的记录已经不存在了
我们通过刚刚的几个案例来学习了
如何通过视图来
查看、添加、修改和删除表中的记录
下面我们来学习check option子句的使用
来看【案例9】
新建视图v3
查询score表中
result在70分以上的sid,cno,result
不启用检查约束
通过v3视图来插入如下记录
0306 ,01,60
V3视图已经创建完成
可以来看创建它的语法
CREATE VIEW`
stu`.`v3`AS (SELECT
sid,cno,result FROM score
WHERE result>=70);
接下来通过v3视图来插入记录
Insert into v3
Values(‘0306’,’01’,60)
请大家注意
这个60并不满足视图v3
创建时的成绩在70分以上的这个条件
那能不能插入进去呢?
我们尝试着执行一次
可以看到是能够执行成功的
请大家记住
0306,01,60这几个数据
来查看插入的数据
select* from v3;
并不能看到插入的新记录
那么它有没有插入到score表中去呢
执行select * from score;
可以看到新记录插入到score表中
请大家想一想是什么原因导致的呢?
就是v3视图看不到数据
但是插入到了score表中了
这是因为V3视图虽然有条件
但是没有启用检查约束
因此在操作数据时
数据是不受约束条件的影响
但是呢视图本身是查询满足条件的数据
我们再来看一个案例
【案例10】
新建视图v4
查询v3中的result在90分以下的
sid,cno,result,并使用
CASCADED检查约束
通过v4完成记录的添加
(1)0306 ,02,60;
(2)0306 ,02,80;
请同学们记住v3中的条件是70分以上
v4中的条件是90分以下
启用cascaded约束会有什么效果呢?
我们来看v4视图已经创建成功了
它的数据来源是v3视图
约束条件是result小于等于90
with cascaded check option
那我们接下来插入0306’,’02’,60
语句可以这样写
Insert into v4
Values(‘0306’,’02’,60)
执行失败
原因呢是成绩60不满足
v3视图的成绩在70分以上
和v4视图成绩90分以下的条件
那我们来插入
0306 ,02,80;
80在呢在70到90分之间
Insert into v4
Values(‘0306’,’02’,80)
执行成功
共一行受影响
我们来查看数据
Select * from score
可以看到
0306’,’02’,80
这一行记录插入到表中了
下面我们再来看一个案例
【案例11】
新建视图v5
查询v3中的result在90分以下的
sid,cno,result,并使用local检查约束
请同学们注意看
v5视图和v4视图
查询条件和数据源是一样的
只是启用的约束不同
v4启用cascaded约束
v5启用local检查约束
那通过v5视图完成记录添加
(1)0306 ,03,95;
(2)0306 ,03,60;
V5视图已经创建成功
数据源v3
条件result>90
检查约束采用的是local
下面我们就通过v5来添加记录
Insert into v5
Values(‘0306’,’03’,95)
执行失败
因为95不满足视图
v5自身的result小于
90分以下的约束条件所以插入失败
再来插入:0306 ,03,60;
60这个数据满足v5视图小于90分的条件
但是不满足v3大于70分的条件
能不能插入进去呢?
Insert into v5
Values(‘0306’,’03’,60)
执行成功
来查看数据有没有插入进去
可以看到‘0306’,’03’,60插入到表中了
通过这两个案例我们可以看出
当使用cascaded约束时
它既要满足v3视图的约束
也要满足v4视图的约束条件
当使用local检查约束时
它只需要满足v5视图的约束条件就可以了
接下来我们对本次课做个小结
本次课我们学习了
1. 视图的概念与优点
2. 视图的创建、修改与删除
3. 通过视图操作基本表的数据
尽管视图使用起来有很多优点
但是也存在性能差、修改限制等缺点
在实际工作中
合理设计和使用视图才能够提高效率
请同学们下载素材完成操作练习
本次课就讲到这里
谢谢
再见
-1.1 数据库基础知识
-1.2 MySQL的安装与运行
-第1章 测试
-2.1 数据库的基本操作
-2.2 表的基本操作
-2.3 MySQL数据类型
-2.4 约束设置
-2.5 索引
--2-5索引视频
--2-5索引课件
--2-5索引实训
-第2章测试
-3.1 插入记录
-3.2 修改记录
-3.3 删除记录
--3.3删除记录
-第3章 测试
-4.1 select语句
-4.2 单表查询
-4.3 多表查询
-4.4 子查询
--4-4子查询课件
--4-4子查询实训
-4.5 外键
--4-5外键视频
--4-5外键课件
--4-5外键实训
-4.6 视图
--4-6视图视频1
--4-6视图视频2
--4-6视图课件
--4-6视图实训
-第4章测试
-5.1 函数
--5-1系统函数
--5-1函数课件
--5-1 函数实训
-5.2 流程控制语句
-5.3 事务与游标
-5.4 存储过程
-5.5 触发器
--5-5触发器视频
--5-5触发器课件
--5-5触发器实训
-第5章测试
-6.1 数据库备份与还原
-6.2 异构数据源导入导出
-第6章测试
-7.1 用户管理
-7.2 权限管理
-7.3 应用实例开发
-第7章测试