19.MySQL之视图

如果想看其他有关于MySQL数据库的文章,请跳转到到MySQL自学目录

本节将介绍视图是什么,它们怎样工作以及何时使用他们。

为了大家更好的理解,我将例子中需要的sql文件上传到了百度网盘,供大家食用。
链接:https://pan.baidu.com/s/1dqQS2sQj8QoCKi3UfN1wVA 密码:h7hh
视图
  1. 视图是什么?
    视图是由查询结果形成的虚拟的表。然后我们可以对这个虚拟的表进行一系列的操作。
  2. 为什么要是使用视图?
    • 重用SQL语句。
    • 简化复杂的SQL操作。在编写查询后,可以不需要知道其中的查询细节。
    • 使用的是表的组成部分而不是整个表。
    • 保护数据。可以给用户授予表的特定部分的访问限权而不是整个表的访问限权。
    • 更改书的格式和表示。视图可返回与底层表的表示和格式不同的数据。
  3. 视图的操作
    创建: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之后的版本
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值