19.告别复杂SQL!用MySQL视图把逻辑拆成“变量”式操作

目录

一、视图的定义与核心思想

核心思想:

二、视图的语法

三、视图的创建与查询(示例)

[1. 准备工作:建库、建表、插入数据](#1. 准备工作:建库、建表、插入数据)

[2. 创建视图并查询](#2. 创建视图并查询)

四、视图的列指定(示例)

[五、视图的更新(修改原始表 ↔ 修改视图)](#五、视图的更新(修改原始表 ↔ 修改视图))

[1. 修改原始表 → 影响视图](#1. 修改原始表 → 影响视图)

[2. 修改视图 → 影响原始表](#2. 修改视图 → 影响原始表)

六、不可更新的视图

七、删除视图

八、视图的优点

总结(视图:是什么?为什么?怎么用?)


视图(View)是MySQL中一个非常实用的数据库对象,它本质上是一个**"虚拟的表"**,可以理解为一个"变量"。下面我们从定义、语法、操作、特性到优点,结合示例逐一讲解。

一、视图的定义与核心思想

视图是一个"虚拟的表":

  • 它把一条 SELECT语句封装 起来,这条 SELECT的结果构成了一个"虚拟表";

  • 视图不会真正占据存储空间 (没有在硬盘上创建"B+树"这样的结构),而是记录下对应的SQL语句

  • 后续可以针对这个视图进行查询、更新等操作(部分场景下)。

核心思想

  • 子查询的问题:违背"编程基本原则"(把简单逻辑组合成复杂逻辑);

  • 视图的优势:符合"编程基本原则"(把复杂逻辑拆成简单逻辑)。可以把复杂SQL的执行结果作为视图,再通过第二个SQL对视图操作,避免一次性写很复杂的SQL。

举个计算平均值的例子:

计算N个数的平均值 (a1 + a2 + a3 + ... + aN) / N,可以拆分为:

java 复制代码
sum = a1 + a2 + a3 + ... + aN  
sum / N

视图就像这个"变量" sum,先存中间结果,再复用。

二、视图的语法

创建视图的基本语法:

sql 复制代码
CREATE VIEW view_name [(column_list)] AS select_statement
  • view_name:视图名称;

  • column_list(可选):指定视图的列名;

  • select_statement:视图对应的查询语句。

三、视图的创建与查询(示例)

我们通过一个完整的示例来理解:

1. 准备工作:建库、建表、插入数据

sql 复制代码
-- 创建数据库
create database java117_3;  
use java117_3;  

-- 创建学生表
create table student(id int, name varchar(20));  

-- 插入数据
insert into student values(1, '张三'), (2, '李四'), (3, '王五');

2. 创建视图并查询

创建一个视图 v_student,只包含 id <= 2的学生:

sql 复制代码
create view v_student as  
select * from student where id <= 2;  

-- 查询视图
select * from v_student;

视图的本质:没有在硬盘创建B+树结构 ,只是记录了"v_student对应的SQL是 select * from student where id <= 2"。++查询视图时,会自动执行这个SQL,拿到视图的数据,再基于结果进行查询。++

四、视图的列指定(示例)

也可以给视图指定列名

sql 复制代码
create view v_student_2 (name) as  
select name from student;  

-- 查询视图
select * from v_student_2;

五、视图的更新(修改原始表 ↔ 修改视图)

视图和原始表是相互影响的:

1. 修改原始表 → 影响视图

sql 复制代码
-- 修改原始表student
update student set name = '张三三' where id = 1;  

-- 查询原始表
select * from student;  

-- 查询视图(会看到变化)
select * from v_student;

结论:修改原始表的数据,会影响视图的结果。

2. 修改视图 → 影响原始表

sql 复制代码
-- 修改视图v_student
update v_student set name = '张六' where id = 1;  

-- 查询原始表(会看到变化)
select * from student;

原理:更新视图时,相当于++按照视图的构建规则++ (比如 id <= 2),给 UPDATE语句加了条件。本质上还是在修改原始表。比如上面的 update v_student set name = '张六' where id = 1,等价于:

sql 复制代码
update student set name = '张六' where id <= 2 and id = 1;

六、不可更新的视图

有些视图是不能直接修改的,常见场景:

  • 创建视图时使用了聚合函数 (如 SUMCOUNT等);

  • 创建视图时使用了 DISTINCT

  • 创建视图时使用了 GROUP BY以及 HAVING子句;

  • 创建视图时使用了 UNIONUNION ALL

  • 查询列表中使用了子查询

  • FROM子句中引用了不可更新的视图

原因:这些操作会导致"视图中的行"和"原始表的行"无法一一对应(比如聚合会合并多行,子查询会嵌套逻辑),修改视图时无法确定原始表的行。

七、删除视图

删除视图的语法:

sql 复制代码
drop view 视图名;  

-- 示例:删除v_student和v_student_2
drop view v_student;  
drop view v_student_2;

八、视图的优点

比如:学生表含班级id(100,101,102),可创建视图,将每个班级的同学放到同一个视图中。那么大概率会更好操作(体现视图优点的简单性)

视图在开发中非常实用,核心优点有:

  1. 简单性(最重要):把复杂查询封装成简单查询。比如多表连接、联合查询等复杂逻辑,创建视图后,用户只需查视图,无需了解底层逻辑。

  2. 安全性:隐藏表中的敏感数据。比如用户表包含密码,可创建不含密码列的视图,普通用户只能访问视图,无法访问原始表。

  3. 逻辑数据独立性:底层表结构变化时,只需修改视图定义,依赖视图的应用程序无需改动(实现"应用与数据库解耦")。

  4. 重命名列:允许用户重命名列名,增强可读性。

总结(视图:是什么?为什么?怎么用?)

🌟视图是"虚拟表",本质是一段 SELECT语句的记录,不占存储空间,但能简化查询、提升安全、解耦逻辑。使用时要注意可更新视图的限制 ,删除视图用 DROP VIEW

相关推荐
技术钱5 小时前
向量数据库的介绍
数据库
Gauss松鼠会5 小时前
GaussDB(DWS) 日常维护命令
服务器·数据库·postgresql·性能优化·gaussdb·经验总结
Trouvaille ~5 小时前
【Redis篇】初识 Redis:特性、应用场景与版本演进
数据结构·数据库·redis·分布式·缓存·中间件·持久化
码上有光5 小时前
MySQL基本查询
数据库·mysql·oracle·期末快速复习
Agent手记6 小时前
安全生产巡检全流程自动化与隐患预警方案:2026工业Agent落地实战指南
数据库·人工智能·安全·ai·自动化
whn19776 小时前
查询日期报错,参数DATETIME_FMT_MODE
数据库·sql
Gauss松鼠会7 小时前
GaussDB(DWS) GUC参数修改、查看
java·数据库·sql·数据库开发·gaussdb
米高梅狮子7 小时前
Ceph 分布式存储 部署
linux·运维·数据库·分布式·ceph·docker·华为云
滴滴答答哒7 小时前
.NET Core 基于 AOP + Polly 实现数据库死锁自动重试
数据库·.netcore·sqlsugar