MySQL-视图

1-什么是视图

什么是视图(数据库视图 View)

一句话:视图是一张虚拟表 ,本身不存真实数据 ,只是保存了一条查询 SQL 语句

核心特点

  1. 虚拟表,无物理存储 数据还是来自原有的基础表,视图只是给查询结果起了个名字,不占额外存储空间。
  2. 本质是封装好的 SELECT 查询 创建视图时存的就是一段 SQL,每次查视图,都会实时执行这段 SQL,从原表拿最新数据。
  3. 用法和普通表一模一样 可以直接 SELECT * FROM 视图名,像查表一样用。

2-视图的功能是什么

视图的作用

  • 简化复杂查询:把多表联查、复杂条件封装成视图,不用每次写长 SQL
  • 权限控制:只给用户看部分字段 / 部分数据,隐藏敏感信息
  • 统一接口:底层表结构变了,只要改视图,上层查询不用改
  • 逻辑复用:多处要用的相同查询逻辑,封装成视图重复使用

3-视图的优缺点

一、优点

  1. 简化查询 复杂多表联查、条件筛选封装成视图,直接查表式使用,不用重复写长 SQL。

  2. 安全保密 可以隐藏敏感字段(身份证、薪资、手机号),只开放允许查看的列 / 行,做数据权限控制。

  3. 逻辑统一、复用性强 统一统计和查询口径,所有人用同一个视图,避免各自写 SQL 导致结果不一致。

  4. 程序与表结构解耦 底层表改结构、拆分、更名,只需修改视图定义,上层业务代码不用改动。

  5. 操作简单 使用方式和普通表完全一样,支持 SELECT,简单视图还能增删改。

  6. 便于权限管理 不用给原表授权,只给视图授权,管控更精细。


二、缺点

  1. 无独立存储,性能有损耗 视图不存数据,每次查询都实时执行底层 SQL,复杂视图多嵌套时,查询变慢。

  2. 更新限制多 聚合视图、分组、DISTINCT、多表联查视图,基本不能做增删改;只有单表简单视图可更新。

  3. 依赖基础表 底层原表一旦删除、改关键字段,视图直接失效,兼容性差。

  4. 调试排障麻烦 多层视图嵌套时,底层逻辑隐藏,出问题很难追踪原始 SQL 和性能瓶颈。

  5. 不能建索引(普通视图) 普通视图无法加索引,大数据量查询效率偏低(只有物化视图可解决,但占用存储空间)。

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;

现在规则生效:

  1. 修改:不能把工资改成 ≥5000,会报错
  2. 新增 :不能新增工资 ≥5000 的记录,会报错 保证视图里的数据永远符合视图条件,不会出现 "改完就从视图消失" 的情况。

四、核心作用

  1. 防止通过视图篡改超出视图范围的数据
  2. 保证视图数据的完整性和一致性
  3. 做行级数据权限控制,只能操作视图可见范围内的数据

五、使用前提

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);

❌ 也报错,不让插


核心结论

  1. 不加 WITH CHECK OPTION 可以通过视图修改 / 插入 不符合视图 WHERE 条件的数据,改完记录就跑出视图了。

  2. 加 WITH CHECK OPTION 强制约束: 通过视图新增、修改的数据,必须满足视图的 WHERE 条件,不满足直接拦截报错。

相关推荐
2301_812539671 小时前
golang如何使用Fiber高性能框架_golang Fiber框架入门教程
jvm·数据库·python
2401_880071401 小时前
html标签如何提升可访问性_aria-label与title区别【指南】
jvm·数据库·python
2401_850491651 小时前
如何管理多个监听器_listener.ora中非默认端口配置实战
jvm·数据库·python
2301_781571421 小时前
Go语言如何用sqlx_Go语言sqlx数据库操作教程【入门】
jvm·数据库·python
2401_880071401 小时前
mysql安装后如何进行初始化安全配置_mysql_secure_installation实操
jvm·数据库·python
m0_609160491 小时前
如何创建物化视图日志_CREATE MATERIALIZED VIEW LOG记录基表DML变更.txt
jvm·数据库·python
神明9311 小时前
如何利用 Service Worker 实现离线缓存?Vue 项目 PWA 入门实战教程
jvm·数据库·python
C137的本贾尼1 小时前
查询进阶:排序、过滤与分页
数据库·mysql
2301_781571421 小时前
c++怎么在写入文本文件时自动将所有的制表符统一转换为四格空格【实战】
jvm·数据库·python