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 一张表和另一个视图。
相关推荐
闪电悠米1 天前
黑马点评-优惠券秒杀-01_redis_global_id
数据库·redis·缓存
Irene19911 天前
SQL示例(使用差分数组 + 窗口函数)统计并发数量问题(处理边界:当开始时间和结束时间相同时,应该先+1再-1,才能正确统计峰值)
mysql
牧羊狼的狼1 天前
MySQL 提升SQL查询性能的全套实战优化方法
数据库·sql·mysql
weixin_489690021 天前
企业微信 PC 端本地数据库结构中的巧妙设计
数据库·oracle·企业微信
运维行者_1 天前
Applications Manager中的Redis监控
大数据·服务器·数据库·人工智能·网络协议
悦数图数据库1 天前
图数据库选型指南 2026:从架构、性能、AI 适配三个维度看 悦数科技
数据库·人工智能·架构
handler011 天前
【MySQL】常用命令总结(库与表增删查改)
运维·数据库·mysql·命令·总结
week@eight1 天前
Linux - Doris
linux·运维·数据库·mysql
cdbqss11 天前
VB2026 菜单生成基类 BqGetMenuStrip
数据库·经验分享·学习·oracle·vb