文章标题:
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