什么是视图?当然是用实际的例子来理解是最直接的了,话不多说,开始。

一、视图的创建和使用
在学习连接查询时,我们有写过这样的SQL:
mysql> select u.id,u.username,ua.mobile,ua.province,ua.city,ua.district,ua.detail from users u inner join user_address ua on u.id = ua.user_id;
+------------------+-----------------+-------------+----------+--------+-----------+----------------------+
| id | username | mobile | province | city | district | detail |
+------------------+-----------------+-------------+----------+--------+-----------+----------------------+
| 190815GTKCBSS7MW | fossi | 13333333333 | 北京 | 北京 | 东城区 | 幸福小区12号街 |
| 190816HH9RDPD6Y8 | 我去个地方 | 13666666666 | 北京 | 北京 | 海淀区 | 阳光里街道 |
+------------------+-----------------+-------------+----------+--------+-----------+----------------------+
2 rows in set (0.00 sec)
这个SQL乍一眼看起来的感觉就是比较长,每次都这么来敲一遍实在有点受不了。视图,可以帮助我们来简化一些工作。那什么是视图呢?
我们可以把视图理解为一个查询语句的别名,创建视图的语句如下:
CREATE VIEW 视图名 AS 查询语句
比如我们针对如上的SQL创建一个视图:
mysql> create view user_and_address_view as select u.id,u.username,ua.mobile,ua.province,ua.city,ua.district,ua.detail from users u inner join user_address ua on u.id = ua.user_id;
Query OK, 0 rows affected (0.03 sec)
下面,我们就可以使用user_and_address_view来替代很长的SQL了。
视图也可以被称为虚拟表,因为我们可以对视图进行一些类似表的增删改查操作,只不过我们对视图的相关操作都会被映射到那个又臭又长的查询语句对应的底层的表上。那一串又臭又长的查询语句的查询列表可以被当作视图的虚拟列,比方说user_and_address_view这个视图对应的查询语句中的查询列表是u.id,u.username,ua.mobile,ua.province,ua.city,ua.district,ua.detail,它们就可以被当作user_and_address_view视图的虚拟列。
我们平时怎么从真实表中查询信息,就可以怎么从视图中查询信息,比如这么写:
mysql> select * from user_and_address_view;
+------------------+-----------------+-------------+----------+--------+-----------+----------------------+
| id | username | mobile | province | city | district | detail |
+------------------+-----------------+-------------+----------+--------+-----------+----------------------+
| 190815GTKCBSS7MW | fossi | 13333333333 | 北京 | 北京 | 东城区 | 幸福小区12号街 |
| 190816HH9RDPD6Y8 | 我去个地方 | 13666666666 | 北京 | 北京 | 海淀区 | 阳光里街道 |
+------------------+-----------------+-------------+----------+--------+-----------+----------------------+
2 rows in set (0.01 sec)
当然了,我们也可以指定查询视图时返回的结果列,并且基于之前实际的SQL基础上增加一些判断条件,比如:
mysql> select id,username,mobile from user_and_address_view where username='fossi';
+------------------+----------+-------------+
| id | username | mobile |
+------------------+----------+-------------+
| 190815GTKCBSS7MW | fossi | 13333333333 |
+------------------+----------+-------------+
1 row in set (0.00 sec)
结合这个示例,这里想强调的是:视图其实就相当于是某个查询语句的别名!创建视图的时候并不会把那个又臭又长的查询语句的结果集维护在硬盘或者内存里!在对视图进行查询时,MySQL服务器将会帮助我们把对视图的查询语句转换为对底层表的查询语句然后再执行,比如说上边这个查询语句其实可以被转换成下边这个查询语句去执行:
mysql> select u.id,u.username,ua.mobile from users u inner join user_address ua on u.id = ua.user_id where u.username='fossi';
+------------------+----------+-------------+
| id | username | mobile |
+------------------+----------+-------------+
| 190815GTKCBSS7MW | fossi | 13333333333 |
+------------------+----------+-------------+
1 row in set (0.00 sec)
当然,视图还有其他的玩法,比如可以基于视图再去创建新的视图,或者基于视图做更多有意思的查询和数据修改,这里就不展开说明了,重要的是要清楚视图的概念和最基本的用法。

二、视图的查看和删除
上面说过,视图也可以被称为虚拟表,因为我们可以对视图进行一些类似表的增删改查操作,只不过我们对视图的相关操作都会被映射到那个又臭又长的查询语句对应的底层的表上。
所以,视图的查看跟查看有哪些表的方法是一样的:
mysql> show tables;
+-----------------------+
| Tables_in_yummy_shop |
+-----------------------+
| carousel |
| category |
| items |
| items_comments |
| items_img |
| items_param |
| items_spec |
| order_items |
| order_status |
| orders |
| pay_info |
| user_address |
| user_and_address_view |
| users |
+-----------------------+
14 rows in set (0.01 sec)
可以看到有一张叫做user_and_address_view的表。需要注意的是,因为视图是一张虚拟表,所以新创建的视图的名称不能和当前数据库中的其他视图或者表的名称冲突!
视图是一张虚拟表,用来查看视图结构的语句和用来查看表结构的语句比较类似,是这样的:
SHOW CREATE VIEW 视图名;
mysql> show create view user_and_address_viewG
*************************** 1. row ***************************
View: user_and_address_view
Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `user_and_address_view` AS select `u`.`id` AS `id`,`u`.`username` AS `username`,`ua`.`mobile` AS `mobile`,`ua`.`province` AS `province`,`ua`.`city` AS `city`,`ua`.`district` AS `district`,`ua`.`detail` AS `detail` from (`users` `u` join `user_address` `ua` on((`u`.`id` = `ua`.`user_id`)))
character_set_client: utf8
collation_connection: utf8_general_ci
1 row in set (0.01 sec)
我们核心关注Create View字段,里面告诉了我们这个视图对应的实际SQL是什么。
最后,如果某个视图我们不想要了,可以使用这个语句来删除掉它:
DROP VIEW 视图名
mysql> DROP VIEW user_and_address_view;
Query OK, 0 rows affected (0.00 sec)
关于视图,只想介绍这么多,原因是在实际的开发过程中是不会使用视图的(至少我是没见过),我们的代码都是基于框架开发,不存在一个SQL重复写的问题,毕竟代码基于分层思想封装是可以复用的。不过为了知识体系的完整性,我们需要明白视图是个什么玩意,我们基于它可以实现什么,这就足够了。知识是无限的,精力是有限的,如何合理安排有限的精力去甄别并学习无限知识中的重点,也是我们学习的一个注意点。
原文始发于微信公众号(幕后哈土奇):16|第十六话:基础篇-MySQL之视图简介
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/112792.html