📑 目录
- [1. 📖 什么是视图?](#1. 📖 什么是视图?)
- [2. 🛠️ 视图的基本使用](#2. 🛠️ 视图的基本使用)
- [2.1 创建视图](#2.1 创建视图)
- [2.2 视图与基表的数据联动](#2.2 视图与基表的数据联动)
- [2.3 删除视图](#2.3 删除视图)
- [3. 📋 视图的规则和限制](#3. 📋 视图的规则和限制)
- [4. 🎯 实战 OJ:牛客网题目](#4. 🎯 实战 OJ:牛客网题目)
- [5. 💡 小总结](#5. 💡 小总结)
- [6. ❓ 经典面试题与解答](#6. ❓ 经典面试题与解答)
1. 📖 什么是视图
视图(View)是 MySQL 中一个非常实用的功能。简单来说,视图是一个虚拟表 ,它的内容是由一条 SELECT 查询语句定义的。
- 虚拟表:视图在数据库中并不实际存储数据,它只是保存了一条 SQL 查询语句。当你查询视图时,MySQL 会动态地执行这条查询语句,并将结果返回给你。
- 与真实表的关系:视图的数据来源于一个或多个真实的表(称为"基表")。对视图的操作(如查询、更新)会影响到基表,反之亦然。
- 把通过语句查到的表通过临时表的形式存储在内存中,便于后续使用。
一句话总结:视图就像是一个"窗口",透过它你可以看到基表中你关心的那部分数据,而无需直接操作复杂的多表查询。
2. 🛠️ 视图的基本使用
2.1 创建视图
创建视图的语法非常简单:
sql
CREATE VIEW 视图名 AS SELECT语句;
案例:创建员工-部门视图
假设我们有两个表:EMP(员工表)和 DEPT(部门表)。我们经常需要查询员工姓名及其对应的部门名称,每次都要写 JOIN 语句很麻烦。这时,我们可以创建一个视图来简化操作。
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;
查询结果:
| 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 |
可以看到,通过视图 v_ename_dname,我们轻松地获取了员工和部门的对应关系,避免了每次都写复杂的 JOIN 查询。
2.2 视图与基表的数据联动
视图和基表是"命运共同体",一方的数据变化会立刻影响到另一方。
场景一:修改视图,影响基表
sql
-- 1. 修改视图中的数据:将员工 'CLARK' 的名字改为 'TEST'
UPDATE v_ename_dname SET ename='TEST' WHERE ename='CLARK';
-- 2. 查询基表 EMP,看看 'CLARK' 还在不在
SELECT * FROM EMP WHERE ename='CLARK';
-- 结果:空,因为 'CLARK' 已经被改成了 'TEST'
-- 3. 查询基表 EMP,看看 'TEST' 是否出现
SELECT * FROM EMP WHERE ename='TEST';
-- 结果:可以看到 'TEST' 这条记录
场景二:修改基表,影响视图
sql
-- 1. 修改基表:将员工 'JAMES' 的部门编号改为 10(原为 30)
UPDATE EMP SET deptno=10 WHERE ename='JAMES';
-- 2. 查询视图,看看 'JAMES' 的部门名称是否变化
SELECT * FROM v_ename_dname WHERE ename='JAMES';
查询结果:
| ename | dname |
|---|---|
| JAMES | RESEARCH |
核心理解:视图本身不存储数据,它只是一个"查询的映射"。当你通过视图修改数据时,实际上是在修改底层的基表;当基表数据变化时,再次查询视图,得到的结果也会随之更新。
2.3 删除视图
当视图不再需要时,可以使用 DROP VIEW 语句将其删除。
sql
DROP VIEW 视图名;
3. 📋 视图的规则和限制
在使用视图时,需要了解以下规则和限制,这有助于你更好地设计和优化数据库:
- 唯一命名:视图名必须唯一,不能与已有的表名或其他视图名重复。
- 数量限制:创建视图的数量没有限制,但要注意,将复杂的查询创建为视图可能会影响性能,因为每次查询视图都会执行其底层的 SQL。
- 索引与触发器:视图不能添加索引,也不能有关联的触发器或默认值。
- 安全性:视图可以提高数据安全性。你可以只授予用户访问视图的权限,而不授予其访问基表的权限,从而隐藏敏感数据。
- ORDER BY 覆盖 :可以在创建视图时使用
ORDER BY,但如果从该视图检索数据的SELECT语句中也含有ORDER BY,那么视图中的ORDER BY将被覆盖。 - 与表一起使用 :视图可以和表一起在查询中使用,例如
SELECT * FROM 表名, 视图名 WHERE ...。
4. 🎯 实战 OJ:牛客网题目
题目 :针对 actor 表创建视图 actor_name_view。
提示:这是一道常见的 SQL 练习题,旨在考察视图的创建。你需要根据题目要求,创建一个包含特定字段的视图。
5. 💡 小总结
- 视图的本质:视图是一个虚拟表,它封装了复杂的查询逻辑,让你可以像操作普通表一样操作查询结果。
- 核心特性:视图与基表数据联动,修改一方会影响另一方。
- 主要优点 :
- 简化查询:将复杂的多表关联查询封装成简单的视图。
- 提高安全性:可以隐藏基表中的敏感字段。
- 逻辑独立性:当基表结构发生变化时,可以通过修改视图来保持对外接口不变。
- 注意事项:视图不能添加索引,复杂的视图可能会影响查询性能。
6. ❓ 经典面试题与解答
1. 什么是视图?它和表有什么区别?
- 答 :视图是一个虚拟表,其内容由一条
SELECT查询语句定义。它不实际存储数据,只保存查询逻辑。而表是实际存储数据的物理结构。查询视图时,MySQL 会动态执行其定义的查询语句;而查询表时,是直接从存储介质中读取数据。
2. 对视图进行更新操作(INSERT、UPDATE、DELETE)会有什么影响?
- 答 :对视图的更新操作最终会作用于其底层的基表。例如,通过视图更新一条记录,实际上是在更新基表中的对应记录。但并非所有视图都可更新,例如包含
GROUP BY、DISTINCT、聚合函数等操作的视图通常是不可更新的。
3. 视图有哪些优点?
- 答 :
- 简化操作:将复杂的查询(如多表连接)封装起来,用户只需查询视图即可。
- 数据安全:可以只授予用户访问视图的权限,隐藏基表中的敏感列(如密码、工资等)。
- 逻辑独立性:当基表结构发生变化时,可以通过修改视图来保持应用程序的查询接口不变,减少代码改动。
4. 视图可以创建索引吗?为什么?
- 答:视图不能创建索引。因为视图不实际存储数据,它只是一个查询的映射。索引是建立在物理存储的数据结构上的,而视图没有自己的物理存储,所以无法为其创建索引。对视图的查询性能取决于其底层查询语句的执行效率。