MySQL视图的深度解析

文章标题:

MySQL视图的全面剖析

文章内容:

MySQL视图的深度解析

个人空间♡爱幻想的人

欢迎 👍点赞 ➕关注 ❤️收藏 💬留言


目录

🌟 一、视图的基本概念

✨1.概念

✨2.特点

🌟 二、视图的操作方法

✨1.视图的创建

语法

示例

✨2.视图的查看

语法

示例

✨3.视图的查询

语法

示例

✨4.视图数据的新增

语法

示例

✨5.视图的修改

语法

示例

✨6.视图的删除

语法

示例


🌟 一、视图的基本概念

✨1.概念

视图是一种虚拟存在的表,它基于一个或多个基础表或者其他视图的查询结果构建而成。视图自身并不实际存储数据,而是通过执行查询来动态生成相应内容。用户可以像操作普通表一样对视图进行查询、更新等操作。视图不会占用物理存储空间,它仅仅是查询的逻辑展现,其数据实际上依赖于基础表中的数据。

✨2.特点

  • 虚拟属性:视图好似一个虚拟的表,它在数据库中只保存定义该视图的查询语句,并不存储真实的数据。数据依旧存储在原始的表中,视图只是提供了一种访问数据的方式。
  • 数据独立性:视图能够将数据的逻辑结构与物理结构相分离。即便底层表的结构发生变化,只需对视图定义进行修改,无需改动依赖该视图的应用程序,从而提升了数据的独立性以及应用程序的稳定性。
  • 安全性:可以依据用户的权限和需求,视图有选择性地展示表中的部分数据和列。能够隐藏表中的敏感数据,仅向用户提供他们所需的内容,增强了数据的安全性和保密性。
  • 列重命名性:视图允许用户对列进行重命名,以增强数据的可读性。
  • 简洁性:视图能够把复杂的查询封装成一个简洁的查询。

🌟 二、视图的操作方法

✨1.视图的创建

语法

create view 视图名称[(自定义列名)] as 查询结果;

示例

-- 查询班级表中的信息
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.视图的查看

语法

show tables;

示例

查询所有表:

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.视图的查询

语法

select * from 视图名称;

示例

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.视图数据的新增

语法

insert into 基础表名[(列名1,列名2...)] values(列1,列2...);
  • 只能通过增加基础表中的数据,才有可能改变视图中的数据;
  • 不可以通过改变视图中的数据来改变基础表,不能通过视图直接改变视图中的数据。

示例

-- 原来的视图结果
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.视图的修改

语法

update 视图名称 set 要修改的数据;

示例

-- 原来的学生表
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.视图的删除

语法

drop view 视图名称;

示例

-- 删除视图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)

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/13071.html

(0)
LomuLomu
上一篇 1天前
下一篇 1天前

相关推荐

  • WxPython跨平台开发框架之列表数据的通用打印处理

    在WxPython跨平台开发框架中,我们大多数情况下,数据记录通过wx.Grid的数据表格进行展示,其中表格的数据记录的显示和相关处理,通过在基类窗体 BaseListFrame 进行统一的处理,因此对于常规的数据记录打印,我们也可以在其中集成相关的打印处理,本篇随笔介绍如何利用WxPython内置的打印数据组件实现列表数据的自定义打印处理,以及对记录进行分…

    2024 年 12 月 31 日
    33000
  • ChatGPT-Plus共享账号,全网最高性价比!

    系统界面展示,原汁原味的官方ChatGPT-Plus! 这可能不是我用过最便宜的ChatGPT共享账号,但绝对是性价比最高,用起来最稳定的平台,没有之一! 我们有专业的技术团队,已经稳定运营一年之久。我们的维护成本很大,基本大家下单的钱都用于账号购买和技术升级,基本没有多少的利润,只为给大家提供一个安全/稳定的GPT服务。如果网站体验好,请帮我们宣传,足够的…

    2024 年 7 月 10 日
    1.8K00
  • 2024 IDEA最新激活码,IDEA永久免费激活码2025-02-10 更新

    IDEA 2024最新激活码 以下是最新的IDEA激活码,更新时间:2025-02-10 🔑 激活码使用说明 1️⃣ 复制下方激活码 2️⃣ 打开 IDEA 软件 3️⃣ 在菜单栏中选择 Help -> Register 4️⃣ 选择 Activation Code 5️⃣ 粘贴激活码,点击 Activate ⚠️ 必看!必看! 🔥 获取最新激活码: 实时更…

    2025 年 2 月 10 日
    47800
  • 2025年最新DataGrip永久破解教程(附激活码/注册码)🔥

    还在为DataGrip的试用期到期而烦恼吗?🤔 本教程将手把手教你如何轻松破解DataGrip,让你的开发工具一直用到2099年!💪 适用于所有Jetbrains全家桶软件,包括IDEA、PyCharm、Goland等,赶快收藏起来吧! 先睹为快:破解成功效果 先给大家看看最新版本的破解成果,有效期直接延长到2099年,简直不要太爽!🎉 准备工作:下载Dat…

    DataGrip激活码 2025 年 6 月 29 日
    25800
  • 华为OD机试E卷 –寻找符合要求的最长子串 –24年OD统一考试(Java & JS & Python & C & C++)

    文章目录 题目描述 输入描述 输出描述 用例 题目解析 JS算法源码 Java算法源码 python算法源码 c算法源码 c++算法源码 题目描述 给你一个字符串 s,字符串 s 首尾相连成一个环形,请你在环中找出 ‘l’、‘o’、‘x’ 字符都恰好出现了偶数次最长子字符串的长度。 输入描述 输入是一串小写的字母组成的字符串 输出描述 输出是一个整数 备注•…

    未分类 2025 年 1 月 12 日
    32000

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信