MySQL视图:虚拟表的实战技巧
个人主页Milestone-里程碑❄️个人专栏: 力扣hot100 CLinuxGitMySQL心向往之行必能至目录一、视图核心概念什么是视图二、视图基本使用创建、查询、更新、删除1. 创建视图CREATE VIEW2. 视图与基表的双向更新验证3. 删除视图DROP VIEW三、视图的规则和限制四、视图的核心价值为什么要使用视图五、实战 OJ牛客网 - 针对 actor 表创建视图 actor_name_view题目要求前置条件actor 表结构解题 SQL解题思路六、总结视图作为 MySQL 中重要的数据库对象是很多开发者在数据查询、权限管控场景下的得力工具。很多初学者会疑惑 “视图和普通表有什么区别”“使用视图有哪些注意事项”这篇文章就带大家从视图的核心概念出发一步步掌握它的创建、使用、删除以及实战技巧帮你彻底搞懂 MySQL 视图。一、视图核心概念什么是视图视图是一个虚拟表它本身并不存储实际的数据其内容完全由一条 SELECT 查询语句定义。从外观上看视图和真实的表毫无二致它包含一系列带有名称的列和行数据我们可以像操作普通表一样对视图执行 SELECT 查询甚至在满足条件时执行更新操作。这里要重点记住视图和基表视图对应的原始数据表的双向影响关系对视图中的数据进行合法修改会直接同步影响到对应的基表数据基表的数据发生变化新增、修改、删除也会实时反映在基于该基表创建的视图中。这种双向绑定的特性让视图在数据同步展示场景下极具价值。二、视图基本使用创建、查询、更新、删除视图的核心操作围绕 “创建 - 使用 - 更新 - 删除” 展开下面结合具体案例进行讲解案例中使用经典的 EMP员工表和 DEPT部门表。1. 创建视图CREATE VIEW创建视图的核心语法如下语法要求简洁清晰核心是后面的 SELECT 查询语句可以是简单单表查询也可以是多表联查、聚合查询等复杂查询。sql-- 基本语法 CREATE VIEW 视图名 AS SELECT 语句;实战案例创建一个视图 v_ename_dname用于展示员工姓名和对应的部门名称实现 EMP 表和 DEPT 表的联查。sql-- 创建多表联查视图 CREATE VIEW v_ename_dname AS SELECT ename, dname FROM EMP, DEPT WHERE EMP.deptnoDEPT.deptno; -- 多表关联条件视图创建成功后就可以像操作普通表一样使用 SELECT 语句查询视图中的数据sql-- 查询视图数据支持排序、筛选等操作 SELECT * FROM v_ename_dname ORDER BY dname;查询结果如下按部门名称排序可以看到视图完美展示了我们需要的关联数据无需每次都编写复杂的多表联查语句plaintext-------------------- | ename | dname | -------------------- | CLARK | ACCOUNTING | | KING | ACCOUNTING | | MILLER | ACCOUNTING | | SMITH | RESEARCH | | JONES | RESEARCH | | SCOTT | RESEARCH | | ADAMS | RESEARCH | | FORD | RESEARCH | | ALLEN | SALES | | WARD | SALES | | MARTIN | SALES | | BLAKE | SALES | | TURNER | SALES | | JAMES | SALES | --------------------2. 视图与基表的双向更新验证前面我们提到视图和基表是双向影响的下面通过两个实战案例来验证这一点。案例 1修改视图数据影响基表通过视图将员工 CLARK 的姓名修改为 TEST然后查询基表 EMP验证数据是否同步更新sql-- 修改视图中的数据 UPDATE v_ename_dname SET enameTEST WHERE enameCLARK; -- 查询基表EMP验证CLARK是否存在无结果 SELECT * FROM EMP WHERE enameCLARK; -- 查询基表EMP验证TEST是否存在有结果数据已同步更新 SELECT * FROM EMP WHERE enameTEST;执行上述 SQL 后会发现基表中的 CLARK 已经变成了 TEST说明对视图的修改操作直接同步到了基表中。案例 2修改基表数据影响视图通过基表 EMP 将员工 JAMES 的部门编号修改为 10原部门为 30然后查询视图验证数据是否同步更新sql-- 修改基表EMP的数据 UPDATE EMP SET deptno10 WHERE enameJAMES; -- 查询视图验证JAMES对应的部门名称是否变化 SELECT * FROM v_ename_dname WHERE enameJAMES;查询结果如下可以看到 JAMES 对应的部门已经从 SALES 变成了 ACCOUNTING部门 10 对应的部门名称说明基表的修改也实时反映到了视图中plaintext------------------- | ename | dname | ------------------- | JAMES | ACCOUNTING | -------------------3. 删除视图DROP VIEW当某个视图不再需要时可以使用 DROP VIEW 语句将其删除删除视图不会影响对应的基表数据仅删除视图的定义不删除原始数据这一点非常重要。sql-- 基本语法 DROP VIEW 视图名; -- 实战案例删除前面创建的视图v_ename_dname DROP VIEW v_ename_dname;注意如果视图不存在执行 DROP VIEW 会报错MySQL 中可以添加IF EXISTS关键字避免报错DROP VIEW IF EXISTS 视图名;三、视图的规则和限制视图虽然使用灵活便捷但并非没有约束在使用视图的过程中需要遵守以下核心规则和限制避免踩坑。命名唯一性约束视图的名称必须唯一不能与当前数据库中的其他表、其他视图重名遵循与表名相同的命名规范。创建数量无限制但需考虑性能理论上MySQL 对创建视图的数量没有硬性限制但如果视图基于复杂的多表联查、聚合查询GROUP BY、SUM 等创建查询视图时的性能会大打折扣因为视图每次被查询时都会重新执行底层的 SELECT 语句因此不建议将过于复杂的查询创建为视图。不支持索引、触发器和默认值视图是虚拟表无法为视图添加索引包括主键索引、普通索引也不能为视图的列设置默认值同时也无法创建与视图关联的触发器。如果需要优化查询性能应优化视图底层的基表如给基表添加索引。权限管控要求创建视图需要具备足够的数据库权限CREATE VIEW 权限查询、修改视图也需要对应的 SELECT、UPDATE 等权限这一特性也让视图可以用于提高数据安全性。ORDER BY 的覆盖规则视图的定义中可以包含 ORDER BY 语句但如果在查询视图时SELECT 语句中也包含了 ORDER BY那么视图中的 ORDER BY 会被覆盖最终以查询视图时的 ORDER BY 为准。可与普通表协同使用视图可以和普通表一起参与查询比如在多表联查中视图可以作为其中一个 “表” 与其他普通表、其他视图进行关联查询。四、视图的核心价值为什么要使用视图了解了视图的使用方法和规则后我们来总结一下视图的核心价值明白它在实际开发中的应用场景简化复杂查询这是视图最核心的价值对于经常使用的复杂查询多表联查、聚合查询等可以将其封装为视图后续使用时只需查询视图即可无需重复编写复杂的 SQL 语句提高开发效率。提高数据安全性可以通过视图向用户暴露指定的列和数据隐藏基表中的敏感数据如员工的薪资、身份证号等。例如只给普通用户开放 “员工姓名 部门名称” 的视图不开放完整的 EMP 表从而保护敏感数据。统一数据展示口径视图可以将分散在多个表中的数据整合为统一的展示口径确保所有用户查询到的数据格式、逻辑一致避免因个人编写 SQL 的差异导致数据结果不一致。降低数据耦合度业务系统中如果前端或其他服务依赖某一固定格式的数据可以通过视图封装数据结构后续如果基表的结构发生变化如字段更名、表结构调整只需修改视图的定义无需修改前端或服务的查询逻辑降低耦合度。五、实战 OJ牛客网 - 针对 actor 表创建视图 actor_name_view最后我们通过一个经典的牛客网 OJ 题目来巩固视图的创建技巧检验学习成果。题目要求针对 actor 表创建视图 actor_name_view视图中只包含 actor 表的 first_name 和 last_name 两列并且列名分别为 first_name_v 和 last_name_v。前置条件actor 表结构列名类型说明actor_idint(11)演员 IDfirst_namevarchar(45)名last_namevarchar(45)姓last_updatedatetime最后更新时间解题 SQLsql-- 创建视图指定列的别名满足题目要求的列名 CREATE VIEW actor_name_view AS SELECT first_name AS first_name_v, last_name AS last_name_v FROM actor;解题思路遵循 CREATE VIEW 的基本语法视图名指定为 actor_name_viewSELECT 语句中选择题目要求的 first_name 和 last_name 两列使用 AS 关键字为列设置别名满足题目要求的 first_name_v 和 last_name_v底层查询表为 actor 表无需复杂关联直接单表查询即可。六、总结视图是虚拟表由 SELECT 语句定义与基表双向同步影响修改一方会同步到另一方核心操作语法CREATE VIEW 视图名 AS SELECT 语句;创建、DROP VIEW 视图名;删除视图查询与普通表一致视图有明确的使用限制不支持索引、触发器复杂视图需考虑性能问题视图的核心价值是简化查询、提高数据安全性、统一数据口径在实际开发中应用广泛。