【MySQL视图特性】
2023-12-29 15:35:06
前言
剑指offer:一年又12天 |
---|
视图
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图也是带有名称的列和行内容,对视图内容的修改会影响到基表,对基表内容的修改也会影响到视图。
基本使用
创建视图
CREATE VIEW view_name AS SELECT语句;
案例:
-- 两张测试表:课程表和学生表
mysql> select * from course;
+------+--------------+-----------+
| cid | cname | teacher |
+------+--------------+-----------+
| 101 | C语言 | 王老师 |
| 102 | 数据结构 | 王老师 |
| 103 | 操作系统 | 李老师 |
+------+--------------+-----------+
3 rows in set (0.00 sec)
mysql> select * from stu;
+------+-----------+------+
| sid | sname | cid |
+------+-----------+------+
| 1 | 陈平安 | 101 |
| 2 | 宁姚 | 101 |
| 3 | 陈暖树 | 103 |
| 4 | 小米粒 | 103 |
| 5 | 裴钱 | 103 |
| 6 | 陈灵均 | 102 |
+------+-----------+------+
6 rows in set (0.00 sec)
-- 查看学生的选课情况
mysql> select cname, sname from stu inner join course on stu.cid = course.cid;
+--------------+-----------+
| cname | sname |
+--------------+-----------+
| C语言 | 陈平安 |
| C语言 | 宁姚 |
| 操作系统 | 陈暖树 |
| 操作系统 | 小米粒 |
| 操作系统 | 裴钱 |
| 数据结构 | 陈灵均 |
+--------------+-----------+
6 rows in set (0.00 sec)
-- 如果我们频繁地查看这两列信息,就可以为他们创建一个视图
mysql> create view c_s_name as select cname, sname from stu inner join course on stu.cid = course.cid;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+----------------------+
| Tables_in_enterprise |
+----------------------+
| c_s_name | -- 在mysql看来,视图c_s_name也是一张表
| course |
| dept |
| emp |
| exam |
| salgrade |
| stu |
| stu1 |
+----------------------+
8 rows in set (0.00 sec)
在Linux下的存储方式:
查看视图内容
-- 和表的操作一样
mysql> select * from c_s_name;
+--------------+-----------+
| cname | sname |
+--------------+-----------+
| C语言 | 陈平安 |
| C语言 | 宁姚 |
| 操作系统 | 陈暖树 |
| 操作系统 | 小米粒 |
| 操作系统 | 裴钱 |
| 数据结构 | 陈灵均 |
+--------------+-----------+
6 rows in set (0.04 sec)
修改内容测试
-- 修改视图数据
mysql> update c_s_name set sname = '崔东山' where sname = '陈灵均';
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from c_s_name;
+--------------+-----------+
| cname | sname |
+--------------+-----------+
| C语言 | 陈平安 |
| C语言 | 宁姚 |
| 操作系统 | 陈暖树 |
| 操作系统 | 小米粒 |
| 操作系统 | 裴钱 |
| 数据结构 | 崔东山 | -- 视图数据改了
+--------------+-----------+
6 rows in set (0.00 sec)
mysql> select * from stu;
+------+-----------+------+
| sid | sname | cid |
+------+-----------+------+
| 1 | 陈平安 | 101 |
| 2 | 宁姚 | 101 |
| 3 | 陈暖树 | 103 |
| 4 | 小米粒 | 103 |
| 5 | 裴钱 | 103 |
| 6 | 崔东山 | 102 | -- 基表stu数据也改了
+------+-----------+------+
6 rows in set (0.00 sec)
-- 修改基表数据
mysql> update course set cname = 'Linux' where cname = '操作系统';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from course;
+------+--------------+-----------+
| cid | cname | teacher |
+------+--------------+-----------+
| 101 | C语言 | 王老师 |
| 102 | 数据结构 | 王老师 |
| 103 | Linux | 李老师 | -- 基表course数据改了
+------+--------------+-----------+
3 rows in set (0.00 sec)
mysql> select * from c_s_name;
+--------------+-----------+
| cname | sname |
+--------------+-----------+
| C语言 | 陈平安 |
| C语言 | 宁姚 |
| Linux | 陈暖树 | -- 视图数据也改了
| Linux | 小米粒 |
| Linux | 裴钱 |
| 数据结构 | 崔东山 |
+--------------+-----------+
6 rows in set (0.00 sec)
这个很好理解,上面我们已经看到在Linux中对于视图只保存了它的格式(.frm文件)而没有存储数据(.ibd文件),因此视图使用的仍然是基表的数据。
删除视图
DROP view view_name;
mysql> drop view c_s_name;
Query OK, 0 rows affected (0.00 sec)
视图规则和限制
- 与表一样,必须唯一命名(不能出现同名视图或表名)
- 创建视图数目无限制,但要考虑复杂查询创建为视图之后的性能影响
- 视图不能添加索引,也不能有关联的触发器或者默认值
- 视图可以提高安全性,必须具有足够的访问权限
- order by 可以用在视图中,但是如果从该视图检索数据 select 中也含有 order by ,那么该视图中的 order by 将被覆盖
- 视图可以和表一起使用
文章来源:https://blog.csdn.net/m0_66363962/article/details/134927402
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!