首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【MySQL】视图

【MySQL】视图

作者头像
喜欢做梦
发布2025-07-12 09:58:14
发布2025-07-12 09:58:14
15700
代码可运行
举报
文章被收录于专栏:学习学习
运行总次数:0
代码可运行

🌟 一、什么是视图

✨1.概念

视图是一种虚拟的表,他是基于一个或者多个基本表或者其他视图的查询结果集。视图本身是不存在的,而是通过执行查询来动态生成数据。用户可以像操作普通表一样使用视图进行查询、更新和管理。视图本身并不占用物理存储空间,他仅仅是一个查询的逻辑表示,物理上他依赖于基础表中的数据。

✨2.特点

  • 虚拟性:视图就像一个虚拟的表,他在数据库中只存储了定义视图的查询语句,不存储实际的数据。数据仍然存储在原始的表中,视图只是提供了一种访问数据的方式。
  • 数据独立性:视图可以将数据的逻辑结构与物理结构分离。即使底层表结构发生变化,只需修改视图定义,而不用修改依赖视图的应用程序,提高了数据的独立性和应用程序的稳定性。
  • 安全性:可以根据用户的权限和需求,视图选择性的显示表中部分数据和列。可以隐藏表中的敏感数据,只想用户提供他们所需要的内容,增强了数据的安全性和保密性。
  • 重命名列:视图允许用户重命名列,增强数据的可读性。
  • 简单性:视图可以将复杂的查询封装成一个简单的查询。

🌟 二、视图的使用

✨1.视图的创建

语法
代码语言:javascript
代码运行次数:0
运行
复制
create view 视图名称[(自定义列名)] as 查询结果;
示例
代码语言:javascript
代码运行次数:0
运行
复制
-- 查询班级表中的信息
mysql> select * from class;
+----------+------------+
| class_id | class_name |
+----------+------------+
|        1 | 篮球       |
|        2 | 羽毛球     |
|        3 | 排球       |
|        4 | 乒乓球     |
+----------+------------+
4 rows in set (0.01 sec)

-- 查询学生表中的信息
mysql> select * from  students;
+----+--------+----------+
| id | name   | class_id |
+----+--------+----------+
|  1 | 小丽   |        1 |
|  2 | 莉莉   |        1 |
|  3 | 王刚   |        3 |
|  4 | 张亮   |        2 |
|  5 | 五五   |        5 |
+----+--------+----------+
5 rows in set (0.02 sec)

-- 查询两个表中班级相对应的相关信息
mysql>  select s.class_id,s.id,s.name,c.class_name from class c,students s where c.class_id=s.class_id order by class_id;
+----------+----+--------+------------+
| class_id | id | name   | class_name |
+----------+----+--------+------------+
|        1 |  1 | 小丽   | 篮球       |
|        1 |  2 | 莉莉   | 篮球       |
|        2 |  4 | 张亮   | 羽毛球     |
|        3 |  3 | 王刚   | 排球       |
+----------+----+--------+------------+
4 rows in set (0.00 sec)

-- 创建视图表:不指定列名,直接使用表中的列名。如果表中有重复的列名,那么就会创建失败
-- 将查询两个表中班级相对应的相关信息直接创建成一个视图,可以直接查询
mysql> create view v_students_class as select s.class_id,s.id,s.name,c.class_name from class c,students s where c.class_id=s.class_id order by class_id;
Query OK, 0 rows affected (0.07 sec)

-- 创建视图表:自定义视图列名,可以解决表中出现重复列名的情况
mysql> create view v1_srudents_class(class,id,name,class_name) as select s.class_id,s.id,s.name,c.class_name from class c,students s where c.class_id=s.class_id order by class_id;
Query OK, 0 rows affected (0.10 sec)

✨2.视图的查看

语法
代码语言:javascript
代码运行次数:0
运行
复制
show tables;
示例

查询所有表:

代码语言:javascript
代码运行次数:0
运行
复制
mysql> show tables;
+-------------------+
| Tables_in_java2   |
+-------------------+
| class             |
| new_class         |
| scores            |
| student_score     |
| students          |
| v1_srudents_class |
| v_students_class  |
+-------------------+
7 rows in set (0.00 sec)

✨3.视图的查询

语法
代码语言:javascript
代码运行次数:0
运行
复制
select * from 视图名称;
示例
代码语言:javascript
代码运行次数:0
运行
复制
mysql> select * from v_students_class;
+----------+----+--------+------------+
| class_id | id | name   | class_name |
+----------+----+--------+------------+
|        1 |  1 | 小丽   | 篮球       |
|        1 |  2 | 莉莉   | 篮球       |
|        2 |  4 | 张亮   | 羽毛球     |
|        3 |  3 | 王刚   | 排球       |
+----------+----+--------+------------+
4 rows in set (0.04 sec)

✨4.新增视图数据

语法
代码语言:javascript
代码运行次数:0
运行
复制
insert into 基础表名[(列名1,列名2...)] values(列1,列2...);
  • 只能通过增加基础表中的数据,才有可能改变视图中的数据;
  • 不可以通过改变视图中的数据来改变基础表,不能通过视图直接改变视图中的数据。
示例
代码语言:javascript
代码运行次数:0
运行
复制
-- 原来的视图结果
mysql> select * from v1_srudents_class;
+-------+----+--------+------------+
| class | id | name   | class_name |
+-------+----+--------+------------+
|     1 |  1 | 小丽   | 篮球       |
|     1 |  2 | 莉莉   | 篮球       |
|     2 |  4 | 张亮   | 羽毛球     |
|     3 |  3 | 王刚   | 排球       |
+-------+----+--------+------------+
4 rows in set (0.00 sec)

-- 在学生表中新增信息
mysql> insert into students(name,class_id) values('江江',4);
Query OK, 1 row affected (0.03 sec)

-- 查询视图结果,视图结果发生改变
mysql> select * from v1_srudents_class;
+-------+----+--------+------------+
| class | id | name   | class_name |
+-------+----+--------+------------+
|     1 |  1 | 小丽   | 篮球       |
|     1 |  2 | 莉莉   | 篮球       |
|     2 |  4 | 张亮   | 羽毛球     |
|     3 |  3 | 王刚   | 排球       |
|     4 |  6 | 江江   | 乒乓球     |
+-------+----+--------+------------+
5 rows in set (0.00 sec)

-- 不能直接通过视图改变结果
mysql> insert into v1_srudents_class values(5,9,'武义','排球');
ERROR 1394 (HY000): Can not insert into join view 'java2.v1_srudents_class' without fields list

✨5.修改视图

语法
代码语言:javascript
代码运行次数:0
运行
复制
update 视图名称 set 要修改的数据;
示例
代码语言:javascript
代码运行次数:0
运行
复制
-- 原来的学生表
mysql> select * from students;
+----+--------+----------+
| id | name   | class_id |
+----+--------+----------+
|  1 | 小丽   |        1 |
|  2 | 莉莉   |        1 |
|  3 | 王刚   |        3 |
|  4 | 张亮   |        2 |
|  5 | 五五   |        5 |
|  6 | 江江   |        4 |
+----+--------+----------+
6 rows in set (0.00 sec)

-- 修改失败:因为视图中包含order by,如果要修改要把order by移除
 update v_students_class set class_id=2 where name='江江';
ERROR 1221 (HY000): Incorrect usage of UPDATE and ORDER BY

-- 重新创建一个视图表:不包含order by
 create view v2_srudents_class(class,id,name,class_name) as select s.class_id,s.id,s.name,c.class_name from class c,students s where c.class_id=s.class_id;
Query OK, 0 rows affected (0.09 sec)

-- 再次进行修改,修改成功:将学生表中姓名为江江的学生班级更改为2班
mysql> update v2_srudents_class set class=2 where name='江江';
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

-- 查询更改后的视图结果
mysql> select * from v2_srudents_class;
+-------+----+--------+------------+
| class | id | name   | class_name |
+-------+----+--------+------------+
|     1 |  1 | 小丽   | 篮球       |
|     1 |  2 | 莉莉   | 篮球       |
|     3 |  3 | 王刚   | 排球       |
|     2 |  4 | 张亮   | 羽毛球     |
|     2 |  6 | 江江   | 羽毛球     |
+-------+----+--------+------------+
5 rows in set (0.00 sec)

-- 学生表中的数据也会发生改变
mysql> select * from students;
+----+--------+----------+
| id | name   | class_id |
+----+--------+----------+
|  1 | 小丽   |        1 |
|  2 | 莉莉   |        1 |
|  3 | 王刚   |        3 |
|  4 | 张亮   |        2 |
|  5 | 五五   |        5 |
|  6 | 江江   |        2 |
+----+--------+----------+
6 rows in set (0.00 sec)

✨6.删除视图

语法
代码语言:javascript
代码运行次数:0
运行
复制
drop view 视图名称;
示例
代码语言:javascript
代码运行次数:0
运行
复制
-- 删除视图v2_srudents_class
mysql> drop view v2_srudents_class;
Query OK, 0 rows affected (0.06 sec)

-- 查看所有的表
mysql> show tables;
+-------------------+
| Tables_in_java2   |
+-------------------+
| class             |
| new_class         |
| scores            |
| student_score     |
| students          |
| v1_srudents_class |
| v_students_class  |
+-------------------+
7 rows in set (0.00 sec)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-07-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🌟 一、什么是视图
    • ✨1.概念
    • ✨2.特点
  • 🌟 二、视图的使用
    • ✨1.视图的创建
      • 语法
      • 示例
    • ✨2.视图的查看
      • 语法
      • 示例
    • ✨3.视图的查询
      • 语法
      • 示例
    • ✨4.新增视图数据
      • 语法
      • 示例
    • ✨5.修改视图
      • 语法
      • 示例
    • ✨6.删除视图
      • 语法
      • 示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档