目录
[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;
六、不可更新的视图
有些视图是不能直接修改的,常见场景:
-
创建视图时使用了聚合函数 (如
SUM、COUNT等); -
创建视图时使用了
DISTINCT; -
创建视图时使用了
GROUP BY以及HAVING子句; -
创建视图时使用了
UNION或UNION ALL; -
查询列表中使用了子查询;
-
在
FROM子句中引用了不可更新的视图。
原因:这些操作会导致"视图中的行"和"原始表的行"无法一一对应(比如聚合会合并多行,子查询会嵌套逻辑),修改视图时无法确定原始表的行。
七、删除视图
删除视图的语法:
sql
drop view 视图名;
-- 示例:删除v_student和v_student_2
drop view v_student;
drop view v_student_2;
八、视图的优点
比如:学生表含班级id(100,101,102),可创建视图,将每个班级的同学放到同一个视图中。那么大概率会更好操作(体现视图优点的简单性)
视图在开发中非常实用,核心优点有:
-
简单性(最重要):把复杂查询封装成简单查询。比如多表连接、联合查询等复杂逻辑,创建视图后,用户只需查视图,无需了解底层逻辑。
-
安全性:隐藏表中的敏感数据。比如用户表包含密码,可创建不含密码列的视图,普通用户只能访问视图,无法访问原始表。
-
逻辑数据独立性:底层表结构变化时,只需修改视图定义,依赖视图的应用程序无需改动(实现"应用与数据库解耦")。
-
重命名列:允许用户重命名列名,增强可读性。
总结(视图:是什么?为什么?怎么用?)
🌟视图是"虚拟表",本质是一段 SELECT语句的记录,不占存储空间,但能简化查询、提升安全、解耦逻辑。使用时要注意可更新视图的限制 ,删除视图用 DROP VIEW。