MySQL【视图】

在数据库学习中,我们经常会遇到一个概念:视图 。其实,你可以简单地把视图理解为数据库里的"虚拟表" 。其内容由查询定义 , **同真实的表一样 , 视图包含一系列带有名称的列和行数据。**视图的数据变化会影响到基表,基表的数据变化也会影响到视图。

一、概念解析

想象一下,你有一张巨大的Excel表格(真实的数据表),里面存着几百列数据。但是,你平时工作只需要看其中的5列,或者需要把两张表的信息拼在一起看。

视图就是帮你解决这个问题的。它本质上是一个 "存储起来的查询语句" 。当你查询视图时,数据库会在后台自动执行那个查询语句,然后把结果展示给你。

核心特点:

  • 虚拟表:视图不直接存储数据,它只是保存了一条SQL规则。

  • 动态性:只要底层的真实数据表变了,你查询视图时,结果也会自动跟着变。

  • 双向影响:视图的数据变化会影响基表(原始表),基表的数据变化也会影响视图。

二、基本使用

2.1 创建视图:CREATE VIEW

复制代码
create view 视图名 as select查询语句;

2.2 实战案例:

复制代码
-- 创建一个视图,用来展示员工姓名和他所在的部门名称
CREATE VIEW myview AS 
SELECT ename, dname 
FROM EMP, DEPT 
WHERE EMP.deptno = DEPT.deptno;
  • CREATE VIEW v_ename_dname AS :这是创建视图的命令。v_ename_dname 是我们给视图起的名字。AS 后面就是我们定义的规则。

  • SELECT ename, dname:我们只关心员工的姓名和部门名称,所以只选这两列。

  • FROM EMP, DEPT :数据来自 EMP(员工表)和 DEPT(部门表)两张表。

  • WHERE EMP.deptno = DEPT.deptno:这是连接条件。因为两张表都有部门编号,通过这个条件,我们才能把"张三"正确地关联到"销售部",而不是"技术部"。

  • 创建视图 , 创建"表"
  • 修改视图,对基表有影响
  • 修改了基表,对视图有影响

使用视图和使用普通表一模一样,都是用 SELECT

复制代码
-- 查询我们刚刚创建的视图
SELECT * FROM myview;

-- 也可以在视图中使用排序
SELECT * FROM myview ORDER BY dname;
  • 删除视图

    drop view 视图名;

删除视图不会影响底层的 EMP 表和 DEPT 表的数据,它只是删除了这个"虚拟的规则"。

三、视图的规则和限制

规则/限制 详细解释
1. 唯一命名 视图在数据库中的名字必须是唯一的,不能和已有的表名或者其他视图名重复。
2. 性能影响 创建视图本身没有限制,但如果你的视图是基于一个非常复杂的多表查询(比如连接10张表),那么查询这个视图也会很慢。因为每次查询视图,都要执行这个复杂的查询。
3. 索引限制 视图不能添加索引,也不能有关联的触发器或默认值。想优化性能,必须去优化创建视图的那个 SELECT 语句。
4. 安全性 视图可以隐藏敏感数据。比如,你可以创建一个视图,只显示员工的基本信息,而不显示工资列,然后把视图的权限给HR专员,而不是给整个表的权限。
5. ORDER BY 覆盖 如果在定义视图时使用了 ORDER BY,在查询视图时又使用了 ORDER BY,那么查询时的 ORDER BY 会覆盖掉视图定义中的**。建议: 不要在定义视图时使用 ORDER BY,而应该在查询视图时按需排序。**
6. 混合使用 视图可以和表一起使用。你可以写一条SQL, JOIN 一张表和另一个视图。
相关推荐
2401_873587822 小时前
MySQL——事务管理
数据库·mysql
探索宇宙真理.2 小时前
SiYuan SQL漏洞 | CVE-2026-29073复现&研究
数据库·经验分享·sql·eureka·安全漏洞·siyuan
2501_945423542 小时前
工具、测试与部署
jvm·数据库·python
Oueii2 小时前
数据分析师的Python工具箱
jvm·数据库·python
TDengine (老段)2 小时前
TDengine IDMP 组态面板 —— 工具箱
大数据·数据库·时序数据库·tdengine·涛思数据
weixin_421922692 小时前
使用Scikit-learn进行机器学习模型评估
jvm·数据库·python
Liu628882 小时前
如何为开源Python项目做贡献?
jvm·数据库·python
烟花巷子2 小时前
使用Kivy开发跨平台的移动应用
jvm·数据库·python