1-什么是视图
什么是视图(数据库视图 View)
一句话:视图是一张虚拟表 ,本身不存真实数据 ,只是保存了一条查询 SQL 语句。
核心特点
- 虚拟表,无物理存储 数据还是来自原有的基础表,视图只是给查询结果起了个名字,不占额外存储空间。
- 本质是封装好的 SELECT 查询 创建视图时存的就是一段 SQL,每次查视图,都会实时执行这段 SQL,从原表拿最新数据。
- 用法和普通表一模一样 可以直接
SELECT * FROM 视图名,像查表一样用。
2-视图的功能是什么
视图的作用
- 简化复杂查询:把多表联查、复杂条件封装成视图,不用每次写长 SQL
- 权限控制:只给用户看部分字段 / 部分数据,隐藏敏感信息
- 统一接口:底层表结构变了,只要改视图,上层查询不用改
- 逻辑复用:多处要用的相同查询逻辑,封装成视图重复使用
3-视图的优缺点
一、优点
简化查询 复杂多表联查、条件筛选封装成视图,直接查表式使用,不用重复写长 SQL。
安全保密 可以隐藏敏感字段(身份证、薪资、手机号),只开放允许查看的列 / 行,做数据权限控制。
逻辑统一、复用性强 统一统计和查询口径,所有人用同一个视图,避免各自写 SQL 导致结果不一致。
程序与表结构解耦 底层表改结构、拆分、更名,只需修改视图定义,上层业务代码不用改动。
操作简单 使用方式和普通表完全一样,支持
SELECT,简单视图还能增删改。便于权限管理 不用给原表授权,只给视图授权,管控更精细。
二、缺点
无独立存储,性能有损耗 视图不存数据,每次查询都实时执行底层 SQL,复杂视图多嵌套时,查询变慢。
更新限制多 聚合视图、分组、DISTINCT、多表联查视图,基本不能做增删改;只有单表简单视图可更新。
依赖基础表 底层原表一旦删除、改关键字段,视图直接失效,兼容性差。
调试排障麻烦 多层视图嵌套时,底层逻辑隐藏,出问题很难追踪原始 SQL 和性能瓶颈。
不能建索引(普通视图) 普通视图无法加索引,大数据量查询效率偏低(只有物化视图可解决,但占用存储空间)。
4-
WITH CHECK OPTION 通俗易懂详解
一、是什么
在可更新视图 创建时加上
WITH CHECK OPTION,作用: 强制要求:通过视图 新增 / 修改 的数据,必须满足视图本身的 WHERE 过滤条件,否则报错禁止操作。二、不加 WITH CHECK OPTION 会怎样?
举例子: 有员工表
emp,创建只查工资小于 5000的视图:sql
CREATE VIEW v_emp_low AS SELECT id,name,salary FROM emp WHERE salary < 5000;不加校验时 : 你可以通过这个视图,把某人工资改成 6000。 改完后,这条数据从视图里消失了,但真实表已经被改乱了。
三、加上 WITH CHECK OPTION
sql
CREATE VIEW v_emp_low AS SELECT id,name,salary FROM emp WHERE salary < 5000 WITH CHECK OPTION;现在规则生效:
- 修改:不能把工资改成 ≥5000,会报错
- 新增 :不能新增工资 ≥5000 的记录,会报错 保证视图里的数据永远符合视图条件,不会出现 "改完就从视图消失" 的情况。
四、核心作用
- 防止通过视图篡改超出视图范围的数据
- 保证视图数据的完整性和一致性
- 做行级数据权限控制,只能操作视图可见范围内的数据
五、使用前提
WITH CHECK OPTION只对可更新视图有效 以下视图不能用、也不能更新:
- 包含
GROUP BY、聚合函数DISTINCT- 多表复杂联表
- 包含子查询
5-
WITH CHECK OPTION 实操演示(一步一步看懂区别)
1. 先建测试表
sql
CREATE TABLE emp ( id INT, name VARCHAR(20), salary INT ); -- 插两条数据 INSERT INTO emp VALUES (1,'张三',3000), (2,'李四',4000);2. 创建不加 WITH CHECK OPTION 的视图
只看工资小于 5000 的人:
sql
CREATE VIEW v_emp1 AS SELECT id,name,salary FROM emp WHERE salary < 5000;测试:通过视图改工资
sql
UPDATE v_emp1 SET salary=6000 WHERE id=1;✅ 可以修改成功 结果:
- 真实表中张三工资变成 6000
- 再查
v_emp1,张三消失了问题:通过视图改出了视图的过滤范围,数据乱了。
3. 创建加 WITH CHECK OPTION 的视图
sql
CREATE VIEW v_emp2 AS SELECT id,name,salary FROM emp WHERE salary < 5000 WITH CHECK OPTION;同样尝试修改
sql
UPDATE v_emp2 SET salary=9000 WHERE id=2;❌ 直接报错,禁止修改
尝试插入超范围数据
sql
INSERT INTO v_emp2 VALUES(3,'王五',7000);❌ 也报错,不让插
核心结论
不加 WITH CHECK OPTION 可以通过视图修改 / 插入 不符合视图
WHERE条件的数据,改完记录就跑出视图了。加 WITH CHECK OPTION 强制约束: 通过视图新增、修改的数据,必须满足视图的 WHERE 条件,不满足直接拦截报错。