MySQL 视图详解

📑 目录

  • [1. 📖 什么是视图?](#1. 📖 什么是视图?)
  • [2. 🛠️ 视图的基本使用](#2. 🛠️ 视图的基本使用)
  • [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 BYDISTINCT、聚合函数等操作的视图通常是不可更新的。

3. 视图有哪些优点?

    1. 简化操作:将复杂的查询(如多表连接)封装起来,用户只需查询视图即可。
    2. 数据安全:可以只授予用户访问视图的权限,隐藏基表中的敏感列(如密码、工资等)。
    3. 逻辑独立性:当基表结构发生变化时,可以通过修改视图来保持应用程序的查询接口不变,减少代码改动。

4. 视图可以创建索引吗?为什么?

  • :视图不能创建索引。因为视图不实际存储数据,它只是一个查询的映射。索引是建立在物理存储的数据结构上的,而视图没有自己的物理存储,所以无法为其创建索引。对视图的查询性能取决于其底层查询语句的执行效率。
相关推荐
qq_366086226 小时前
sql 查询中关于 null 值判断的问题
数据库·sql
测试修炼手册6 小时前
[测试技术] JUnit 6 入门与实战:断言、参数化与 Mockito
数据库·junit·sqlserver
祉猷并茂,雯华若锦6 小时前
Appium 3.x安卓按键与通知栏操作全指南
android·appium
吴声子夜歌7 小时前
Redis 3.x——集群故障转移
java·数据库·redis·集群
名不经传的养虾人7 小时前
从0到1:企业级AI项目迭代日记 Vol.71|系统显示正常,但实际上什么都没发生
数据库·人工智能·ai编程·ai工作流·企业ai
尽兴-7 小时前
企业数据库选型与演进:Oracle、达梦、MySQL 与分库分表实践
数据库·mysql·oracle·分库分表
码农coding7 小时前
android 12 SurfaceFlinger开机启动分析
android
hunterandroid7 小时前
Paging 3 RemoteMediator 实战:构建离线优先的分页列表
android·前端
码农coding7 小时前
android12 开机启动PMS
android