一、 什么是视图?
视图(view)是一种虚拟存在的表,视图是一个逻辑表,本身并不包含数据。作为一个select语句保存在数据字典中的。
二、 为什么要用视图?
-
视图隐藏了底层的表结构, 简化了数据访问操作, 客户端不再需要底层表的机构及其之间的关系。
-
视图是一个查询结果集, 随实体数据表数据变化而变化。
-
视图提供了一个统一访问的接口。(即可以允许用户通过视图访问数据的安全机制, 而不授予用户直接访问底层表的权限), 从而加强了安全性, 使用户只能看到视图所显示的数据。
-
视图还可以被嵌套, 一个视图中可以嵌套另一个视图。
注意: 视图总是显示最新的数据!每当用户查询视图时, 数据库引擎通过使用视图的SQL语句重建数据。
三、 MySQL中视图的操作
DROP TABLE IF EXISTS student;
CREATE TABLE `student` (
`id` bigint NOT NULL AUTO_INCREMENT,
`code` int DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`flag` int DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
insert into student values(1,100,"小李",1);
insert into student values(2,100,"小李",1);
insert into student values(3,100,"小李",1);
insert into student values(4,101,"小张",0);
insert into student values(5,102,"小孙",0);
insert into student values(6,102,"小孙",0);
insert into student values(7,103,"小赵",0);
1、 创建视图
CREATE VIEW VIEW_STUDENT
AS SELECT * FROM STUDENT
WHERE FLAG = 1
WITH CHECK OPTION;
2、 查看视图
SELECT * FROM VIEW_STUDENT;
DESC VIEW_STUDENT;
SHOW CREATE VIEW VIEW_STUDENT;
3、 修改视图
ALTER VIEW VIEW_STUDENT
AS SELECT * FROM STUDENT
WHERE FLAG = 0
WITH CHECK OPTION;
SELECT * FROM VIEW_STUDENT;
4、删除视图
DROP VIEW VIEW_STUDENT;
四、视图的执行顺序
一个视图其实是SELECT语句的集合, 执行会提前编译好, 可以反复使用, 在底层执行顺序和SELECT语句是一样的。
- FROM子句组装数据
- WHERE子句进行条件筛选
- GROUP BY分组
- 使用聚合函数进行计算
- HAVING筛选分组
- 计算所有的表达式
- SELECT的字段
- ORDER BY排序
- LIMIT筛选
五、使用WITH CHECK OPTION
约束
对于可以执行DML操作的视图,定义时可以带上WITH CHECK OPTION约束
作用:对视图所做的DML操作的结果,不能违反视图的WHERE条件的限制。
首先我们往表里插入几条数据
insert into student values(8,104,"小马",1);
insert into student values(9,105,"小飞",1);
insert into student values(10,105,"小飞",1);
然后创建视图,获取FLAG为1的数据。
CREATE VIEW VIEW_STUDENT(`自增序号`,`编号`,`名字`,`状态码`)
AS SELECT * FROM STUDENT
WHERE FLAG = 1
WITH CHECK OPTION;
查询结果集
使用 UPDATE
对视图进行修改
UPDATE VIEW_STUDENT SET `状态码` = 2 WHERE `自增序号` = 1;
在这里插入图片描述
因为违反了视图中的WHERE FLAG = 1
子句,所以抛出异常;
利l用WITH CHECK OPTION
约束限制,保证更新视图是在该视图的权限范围之内。
使用WITH CHECK OPTION
约束时,(不指定选项则默认是CASCADED
)
可以使用CASCADED
或者LOCAL
选项指定检查的程度:
CASCADED
:检查所有的视图,会检查嵌套视图及其底层的视图
LOCAL
:只检查将要更新的视图本身,嵌套视图不检查其底层的视图
相关内容
ETL工具kettle的插入更新操作
https://blog.csdn.net/weixin_43932609/article/details/109065366
ETL工具Kettle的发送邮件功能:
https://blog.csdn.net/weixin_43932609/article/details/108766325
ETL工具Kettle的列转行组件:
https://blog.csdn.net/weixin_43932609/article/details/108795244
ETL工具Kettle性能优化:
https://blog.csdn.net/weixin_43932609/article/details/108749304
=========================================================
人生得意须尽欢,莫使金樽空对月!
__一个热爱说唱的程序员。
今日份推荐音乐:Kafe.Hu《经济舱》
=========================================================