如果想看其他有关于MySQL数据库的文章,请跳转到到MySQL自学目录
本节将介绍视图是什么,它们怎样工作以及何时使用他们。
为了大家更好的理解,我将例子中需要的sql文件上传到了百度网盘,供大家食用。
链接:https://pan.baidu.com/s/1dqQS2sQj8QoCKi3UfN1wVA 密码:h7hh
视图
- 视图是什么?
视图是由查询结果形成的虚拟的表。然后我们可以对这个虚拟的表进行一系列的操作。 - 为什么要是使用视图?
- 重用SQL语句。
- 简化复杂的SQL操作。在编写查询后,可以不需要知道其中的查询细节。
- 使用的是表的组成部分而不是整个表。
- 保护数据。可以给用户授予表的特定部分的访问限权而不是整个表的访问限权。
- 更改书的格式和表示。视图可返回与底层表的表示和格式不同的数据。
- 视图的操作
创建:create view 视图名 as select语句
查看建表语句:show create view 视图名
查看视图列的属性:desc 视图名
修改视图:alter view 试图名 as select语句
删除视图:drop view 视图名
举个栗子来更清楚的理解这些操作
mysql> # 创建视图
mysql> create view temp as
-> select vend_id,prod_name,prod_price from products
-> where prod_price < 10;
Query OK, 0 rows affected (0.17 sec)
mysql> # 查看视图
mysql> select * from temp;
+---------+---------------+------------+
| vend_id | prod_name | prod_price |
+---------+---------------+------------+
| 1001 | .5 ton anvil | 5.99 |
| 1001 | 1 ton anvil | 9.99 |
| 1003 | Carrots | 2.50 |
| 1002 | Fuses | 3.42 |
| 1002 | Oil can | 8.99 |
| 1003 | Sling | 4.49 |
| 1003 | TNT (1 stick) | 2.50 |
+---------+---------------+------------+
7 rows in set (0.00 sec)
mysql> # 查看建表语句
mysql> show create view temp;
+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| View | Create View | character_set_client | collation_connection |
+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
| temp | CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `temp` AS select `products`.`vend_id` AS `vend_id`,`products`.`prod_name` AS `prod_name`,`products`.`prod_price` AS `prod_price` from `products` where (`products`.`prod_price` < 10) | utf8 | utf8_general_ci |
+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------+----------------------+
1 row in set (0.13 sec)
mysql> # 查看列属性
mysql> desc temp;
+------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| vend_id | int(11) | NO | | NULL | |
| prod_name | char(255) | NO | | NULL | |
| prod_price | decimal(8,2) | NO | | NULL | |
+------------+--------------+------+-----+---------+-------+
3 rows in set (0.86 sec)
mysql> # 修改视图
mysql> alter view temp as
-> select vend_id,prod_name,prod_price from products
-> where prod_price < 8;
Query OK, 0 rows affected (0.19 sec)
mysql> # 查看表可以查看到视图
mysql> show tables;
+-----------------+
| Tables_in_test2 |
+-----------------+
| customers |
| orderitems |
| orders |
| productnotes |
| products |
| temp |
| vendors |
+-----------------+
7 rows in set (0.00 sec)
mysql> # 删除视图
mysql> drop view temp;
Query OK, 0 rows affected (0.14 sec)
4.视图的使用
视图的使用就相当于的表的使用,举个栗子
mysql> # 视图的使用
mysql> select * from temp where prod_price > 5;
+---------+--------------+------------+
| vend_id | prod_name | prod_price |
+---------+--------------+------------+
| 1001 | .5 ton anvil | 5.99 |
| 1001 | 1 ton anvil | 9.99 |
| 1002 | Oil can | 8.99 |
+---------+--------------+------------+
3 rows in set (0.11 sec)
mysql> select sum(prod_price) as sumprice from temp group by vend_id;
+----------+
| sumprice |
+----------+
| 15.98 |
| 12.41 |
| 9.49 |
+----------+
3 rows in set (0.14 sec)
5.视图的更新
分两个方面来看
- 当原表改变,视图是通过原表创建的虚拟的表,当原表更新时,我们的视图也会更新。
- 视图通常搭配select语句来使用,但是视图的数据是否能更新?视图是可更新的,因为视图是通过原表创建的,视图更新,原表的数据也将更新。但是,不是所有的视图都是可更新的。当视图不能正确地确定被更新的数据就不允许更新。一般来说,含有分组、联结、子查询、并、聚集函数等操作时就不允许被更新。
tips
- 视图需要的MySQL版本为MySQL5之后的版本