Skip to content

面试速答(先看这里)

**一句话结论:**所谓视图,其实就是一个数据快照 ,他并不是一个物理的存储,而是一个逻辑表。

60秒标准回答:

所谓视图,其实就是一个数据快照 ,他并不是一个物理的存储,而是一个逻辑表。它是基于一个或多个实际表或其他视图的查询结果集

举个例子,比如我的表中有各种业务的数据,他们彼此之间是通过租户 ID 进行逻辑隔离的,但是当我们在做数据分析或者报表的时候,需要给某个租户提供一些数据,这时候就可以做个视图,把只属于他的数据给他看,不属于他的数据就不包含在这个视图中,他就看不到

通过上面的例子就能知道,视图有这么几个好处

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**举个例子,比如我的表中有各种业务的数据,他们彼此之间是通过租户 ID 进行逻辑隔离的,但是当我们在做数据分析或者报表的时候,需要给某个租户提供一些数据,这时候就可以做个视图,把只属于他的数据给他看,不属于他的数据就不包含在这个视图中,他就看不到。
  • **要点2:**通过上面的例子就能知道,视图有这么几个好处:
  • **要点3:**数据安全 :通过视图可以限制用户对表中全量数据的访问,用户只能看到视图中定义的数据,而不能直接访问或修改基础表中的数据。
  • **要点4:**数据独立性 :视图可以提供与底层表结构无关的数据接口,如果基础表结构发生变化,只需要修改视图定义,而不需要更改使用视图的应用程序。
  • **要点5:**创建视图使用 CREATE VIEW 语句:

**记忆锚点:**MySQL → 无关的数据接口 → CREATE → Oracle → 数据独立性 → 数据安全

关键取舍:

  • 通过上面的例子就能知道,视图有这么几个好处: 数据安全 :通过视图可以限制用户对表中全量数据的访问,用户只能看到视图中定义的数据,而不能直接访问或修改基础表中的数据。
  • 如果视图包含复杂的查询或涉及大量数据,可能会影响性能。

易错提醒:

  • 通过上面的例子就能知道,视图有这么几个好处: 数据安全 :通过视图可以限制用户对表中全量数据的访问,用户只能看到视图中定义的数据,而不能直接访问或修改基础表中的数据。

加分表达:

  • 数据独立性 :视图可以提供与底层表结构无关的数据接口,如果基础表结构发生变化,只需要修改视图定义,而不需要更改使用视图的应用程序。
  • 调试和维护复杂 : 由于视图是基于查询的抽象层,调试和优化视图可能比直接操作基础表更加复杂。

追问准备:

  • 围绕「MySQL」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「无关的数据接口」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「CREATE」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

所谓视图,其实就是一个数据快照,他并不是一个物理的存储,而是一个逻辑表。它是基于一个或多个实际表或其他视图的查询结果集。

举个例子,比如我的表中有各种业务的数据,他们彼此之间是通过租户 ID 进行逻辑隔离的,但是当我们在做数据分析或者报表的时候,需要给某个租户提供一些数据,这时候就可以做个视图,把只属于他的数据给他看,不属于他的数据就不包含在这个视图中,他就看不到。

通过上面的例子就能知道,视图有这么几个好处:

数据安全:通过视图可以限制用户对表中全量数据的访问,用户只能看到视图中定义的数据,而不能直接访问或修改基础表中的数据。这可以增强数据安全性。

数据独立性:视图可以提供与底层表结构无关的数据接口,如果基础表结构发生变化,只需要修改视图定义,而不需要更改使用视图的应用程序。

创建视图使用 CREATE VIEW 语句:

plain
CREATE VIEW emp_dept_view AS
SELECT e.employee_id, e.first_name, e.last_name, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id;

查询视图就和查询普通表一样:

plain
SELECT * FROM emp_dept_view;

其实,视图不仅仅 Oracle 中支持,MySQL 也是支持的,但是一般在 MySQL 用的比较少而已,主要是因为他并不是完美无缺的,他还有一些问题的,比如:

  1. 性能问题:
  • 视图是基于查询的逻辑表,每次访问视图时都会执行其定义的查询。如果视图包含复杂的查询或涉及大量数据,可能会影响性能。
  1. 更新限制:
  • 并非所有视图都可以更新。对于包含聚合函数、复杂联接、子查询等的视图,通常无法直接进行插入、更新或删除操作。
  1. 调试和维护复杂:
  • 由于视图是基于查询的抽象层,调试和优化视图可能比直接操作基础表更加复杂。
  • 如果视图定义过于复杂或依赖多个其他视图或表,维护起来也会更加困难。