当前位置: 首页 > news >正文

【MySQL 数据库】视图

在日常 MySQL 开发中,你是否经常遇到重复编写复杂多表查询需要控制数据访问权限想简化业务 SQL 逻辑的场景?

这时候,视图(View)就是你的绝佳解决方案。

本文基于 MySQL 视图核心特性,从概念、基本使用、规则限制、实战案例全方位讲解,帮你彻底掌握视图,写出更简洁、安全、易维护的 SQL。


一、什么是 MySQL 视图?

官方定义:视图是一个虚拟表,内容由查询定义。和真实表一样,视图包含带名称的列和行数据,但不物理存储数据,只存储查询语句本身。

核心特性

  1. 虚拟性:不存数据,数据来自底层基表,查询时动态执行 SQL 生成结果集。
  2. 联动性:视图数据变化会影响基表;基表数据变化也会同步到视图。
  3. 封装性:把复杂查询(多表连接、筛选、排序)封装成简单 “表”,复用极高。
  4. 安全性:可只暴露部分字段,隐藏敏感信息,控制数据访问范围。

一句话总结:视图 = 固化的 SELECT 查询 + 虚拟表外壳,查视图就像查普通表,背后自动跑复杂 SQL。


二、视图基本使用(增删改查全流程)

1. 创建视图(CREATE VIEW)

语法

sql

CREATE VIEW 视图名 AS SELECT 列1, 列2, ... FROM 基表 WHERE 条件;

经典案例员工表EMP+ 部门表DEPT,关联查询员工姓名和部门名称:

sql

CREATE VIEW v_ename_dname AS SELECT ename, dname FROM EMP, DEPT WHERE EMP.deptno = DEPT.deptno;

创建后,直接像表一样查询:

sql

SELECT * FROM v_ename_dname ORDER BY dname;

查询结果示例:

表格

enamedname
CLARKACCOUNTING
KINGACCOUNTING
SMITHRESEARCH
ALLENSALES

2. 查询视图

和查询普通表完全一样,支持WHEREORDER BYLIMIT等:

sql

-- 查询销售部员工 SELECT * FROM v_ename_dname WHERE dname = 'SALES';

3. 更新视图(联动基表)

视图是虚拟表,更新视图会直接修改基表数据

示例:把视图中姓名 CLARK 改为 TEST

sql

UPDATE v_ename_dname SET ename = 'TEST' WHERE ename = 'CLARK';

查询基表 EMP:

sql

SELECT * FROM EMP WHERE ename = 'TEST';

会发现基表数据已同步修改。

同理,修改基表,视图也会自动更新

sql

-- 修改基表 JAMES 的部门为 10 UPDATE EMP SET deptno = 10 WHERE ename = 'JAMES'; -- 查询视图,数据已同步变化 SELECT * FROM v_ename_dname WHERE ename = 'JAMES';

4. 删除视图(DROP VIEW)

删除视图不会影响基表数据,只删除视图定义:

sql

DROP VIEW 视图名;

示例:

sql

DROP VIEW v_ename_dname;

三、视图规则与限制(必看,避坑关键)

使用视图时,必须遵守以下规则,否则容易报错或出现性能问题:

  1. 命名唯一视图名不能与现有表名、其他视图名重复。

  2. 数量无上限,但注意性能可创建任意多个视图,但复杂查询封装成视图,频繁查询可能有性能损耗。

  3. 无索引、无触发器、无默认值视图不能创建索引,也不能绑定触发器、设置字段默认值。

  4. 依赖权限必须拥有基表的查询权限,才能创建和使用视图,可用于提升数据安全性。

  5. ORDER BY 会被外层覆盖视图里写了ORDER BY,外层查询又写ORDER BY视图的排序失效,以外层为准。

  6. 可与表混用视图可以和真实表一起关联查询,语法无限制。


四、视图实战 OJ 案例(牛客真题)

题目:针对actor表创建视图actor_name_view,只保留first_namelast_name字段,要求视图字段名显示为first_name_vlast_name_v

实战OJ链接:针对actor表创建视图actor_name_view_牛客题霸_牛客网

解题 SQL

sql

CREATE VIEW actor_name_view AS SELECT first_name AS first_name_v, last_name AS last_name_v FROM actor;

说明

  • AS给视图列重命名,适配业务展示需求。
  • 视图只暴露指定字段,实现数据脱敏与安全控制。

五、视图使用场景与优势

1. 简化复杂 SQL

多表连接、子查询、聚合计算,封装成视图,下次直接SELECT * FROM 视图,大幅减少重复代码。

2. 提升数据安全性

不给用户开放全表权限,只开放视图,隐藏密码、身份证等敏感字段。

3. 统一业务逻辑

多处使用相同查询逻辑,只需修改视图定义,所有调用处自动同步,避免多处修改出错。

4. 解耦业务与表结构

基表结构调整时,可通过视图保持对外接口不变,业务代码不用大面积修改。


六、总结

  1. 视图是虚拟表,不存数据,只存查询 SQL
  2. 视图与基表数据联动,改视图 = 改基表,改基表 = 改视图。
  3. 核心操作:CREATE VIEW创建、SELECT查询、UPDATE更新、DROP VIEW删除。
  4. 注意:无索引、命名唯一、排序会被外层覆盖。
  5. 价值:简化查询、保障安全、统一逻辑、提升可维护性。

学会视图,你的 MySQL 开发效率和代码质量会直接上一个台阶!

http://www.jsqmd.com/news/825079/

相关文章:

  • 世界风景名胜区必去的十大自然奇观有哪些
  • Neovim集成Gemini AI:CLI插件配置与自动化编程实践
  • 企业内统一管理多个项目的AI模型密钥与访问审计日志
  • 行业首个支持18语种双向实时同传的AI翻译系统,企业级部署需避开这7个隐蔽兼容性陷阱
  • 贪心算法的核心基石:选择与结构的艺术
  • 基于RAG架构的智能FAQ系统:从传统文档到智能对话的实战指南
  • 2026年Deepseek搜索结果优化服务商TOP3权威测评:谁能让品牌在DeepSeek中脱颖而出? - 博客湾
  • FL Studio 2025.2.5.5319中文安装激活安装激活图文教程
  • 基于CircuitPython与CLUE开发板的桌面自动浇花机器人DIY指南
  • 用8050三极管和FR107二极管,手把手教你搭建一个简易ZVS振荡电路(附实测波形)
  • 告别龟速!手把手教你用Motrix+Chrome插件免费提速下载百度网盘文件
  • 别再乱搜了!BitLocker恢复密钥对不上?可能是你的微软账户登录错了(附正确备份姿势)
  • 继承不是“拿来用“:is-a 关系与组合
  • 2026年文心一言GEO推广服务商TOP3权威测评:谁能让品牌在百度AI搜索中实现增长突破? - 博客湾
  • claw-kits:开源开发者工具箱的设计理念与实战应用
  • 嵌入式设备自定义字体转换:从TTF到优化位图字体实战
  • 【Oracle数据库指南】第47篇:Oracle 11g在Linux下的安装详解
  • 2×2mm LGA封装+14位分辨率:SMA131在紧凑汽车钥匙中的集成方案
  • 手把手复现IDEA加密:用Python从零理解128位密钥的轮运算
  • 成员函数与 this 指针:函数属于数据
  • 2026年竹盐厂商综合实力深度解析与选择指南 - 2026年企业推荐榜
  • 基于Rust与Hyper构建高性能MCP协议服务器框架
  • 【仅限前500名设计师获取】Midjourney未来主义风格私藏资源包:含87组版权可商用材质贴图+动态光效LORA模型+失效预警提示库
  • 构建智能监控防护系统:从Prometheus到自动化运维闭环
  • 【Oracle数据库指南】第48篇:Oracle 11g在Windows下的安装与配置
  • Python 数据库优化:查询与索引优化
  • 从 ConcurrentLinkedDeque 与 LinkedBlockingDeque 透视 Synchronized 与 CAS 的底层原理
  • 嵌入式Python高效数据处理:迭代器与生成器实战指南
  • 深度探索网易游戏NPK解包:从入门到精通的完整指南
  • SpringBoot集成BouncyCastle实现AES/CBC/PKCS7Padding加解密实战