0

0

mysql视图是什么_mysql视图使用场景说明

P粉602998670

P粉602998670

发布时间:2026-01-04 05:09:16

|

309人浏览过

|

来源于php中文网

原创

MySQL视图是存储的SELECT语句,不占磁盘空间,仅作为查询快捷方式;支持简化多表查询、隔离敏感字段、屏蔽结构变更三大场景;但含聚合、JOIN、子查询等时不可更新。

mysql视图是什么_mysql视图使用场景说明

视图就是一条被存起来的 SELECT 语句

MySQL 视图不是真实表,也不占磁盘空间,它只是把一段 SELECT 查询语句“记下来”,每次查视图时,数据库才真正去执行那条语句、从底层表动态拉数据。你可以把它理解成一个带名字的查询快捷方式。

  • 创建视图用 CREATE VIEW view_name AS SELECT ...,删掉它只影响这个“快捷方式”,不影响原表
  • 视图字段名必须唯一,不能有重复列别名(比如两个 id 都没加 AS 别名会报错)
  • 视图不支持索引,所以如果底层表没优化好,查视图可能比直接查表还慢
  • Navicat 里右键数据库 →「新建视图」→ 粘贴 SQL → 保存,就能图形化操作,但本质仍是执行那条 CREATE VIEW

什么时候该用视图:三个高频真实场景

不是所有项目都需要视图,但它在以下三类问题中几乎是“开箱即用”的解法:

  • 简化多表关联查询:比如电商要查「用户+订单+商品名+下单时间」,每次写 JOIN user JOIN order JOIN product 容易漏条件或写错别名;建个 v_order_detail 视图后,业务代码只需 SELECT * FROM v_order_detail WHERE create_time > '2025-01-01'
  • 隔离敏感字段user 表有 phoneid_card 字段,给客服角色授权时,只给 v_user_public 视图的 SELECT 权限(只含 idnamecreated_at),他们连原表都看不见
  • 屏蔽表结构变更:如果下游报表系统依赖 SELECT id, name, dept FROM employee,而你后来把 dept 拆成 department_id 并关联 departments 表,只需改视图定义:ALTER VIEW employee AS SELECT e.id, e.name, d.name AS dept FROM employee e JOIN departments d ON e.department_id = d.id,业务代码完全不用动

哪些操作会让视图“不可更新”?

虽然理论上能对视图做 INSERT/UPDATE/DELETE,但 MySQL 实际限制很严——只要视图定义里出现以下任一情况,就禁止修改:

  • GROUP BYHAVINGDISTINCTUNIONWITH ROLLUP
  • 使用聚合函数COUNT()SUM()AVG() 等)
  • 包含子查询(尤其在 SELECT 列表或 WHERE 中)
  • 基于多个基表(如 JOIN 了两张表),即使没聚合也不允许 INSERTDELETE
  • 字段来自表达式(如 price * quantity AS amount)或常量(如 'active' AS status

错误示例:ERROR 1394 (HY000): Can't update table 'v_sales_summary' in stored function/trigger because it is being used by statement which invoked this stored function/trigger. —— 这类报错往往是因为视图定义触发了上述任一限制。

柒源写作
柒源写作

降AI率;降重复率;一键初稿;一键图表

下载

修改和删除视图的实操要点

视图改名不能用 RENAME,只能删了重建;而 ALTER VIEW 本质是“删+建”原子操作,但要注意权限和依赖:

  • ALTER VIEW 前,确保你有原视图的 CREATE VIEWDROP 权限
  • 如果其他视图依赖当前视图(比如 v2 是基于 v1 创建的),ALTER VIEW v1 不会影响 v2 的定义,但下次查 v2 时会按新 v1 结果计算——这点容易引发隐性逻辑错误
  • 删除视图用 DROP VIEW IF EXISTS view_name,加 IF EXISTS 可避免脚本执行中断
  • 想看所有视图列表?查系统表:SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_SCHEMA = 'your_db_name';

最常被忽略的一点:视图没有行级锁、不参与事务回滚,它的“虚拟性”意味着任何对视图的增删改,都是实时穿透到底层表的——所以别在视图上做“试探性修改”,后果立竿见影。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

676

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

320

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

346

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1090

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

356

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

674

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

570

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

411

2024.04.29

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

1

2026.01.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.6万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 779人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号