一文理解Mysql中视图的使用

1. 概念

Mysql中的视图就是一种虚拟的表,它对于使用视图的用户来说是透明的。简单来说,视图也可以看做是一条查询语句执行后返回的结果集,而且结果集是动态生成的。关注于视图,其实就是关注于视图中的那条查询语句。

视图相对于直接对表进行查询具有如下的优势:

  • 简单:用户想要得到哪些相关的记录只需要使用相应的视图,而无需关心如何构造复杂的SQL语句和背后表的结构
  • 安全:使用视图的用户只能访问他们被允许看到的结果集,而不能直接管理具体的表
  • 数据独立:视图一旦确定,如果表结构发生变化,那么只需要修改视图中的SQL语句,对于使用视图的用户来说是不必关心具体发生的变化的

2. 使用视图

对于视图的使用也无非就是视图的创建、修改、删除等操作,下面分别介绍下相关的SQL语句。

2.1 创建视图

创建视图的SQL语句规范如下:

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]

例如,继续使用上一篇文章中的Account表来创建一个视图:

mysql> select * from account;
+----+----------+-------+
| id | name     | money |
+----+----------+-------+
|  1 | Forlogen |  1000 |
|  2 | Kobe     |   500 |
|  3 | James    |   800 |
+----+----------+-------+
3 rows in set (0.00 sec)
mysql> create or replace view account_view as
    -> select * from account where money >= 800;
Query OK, 0 rows affected (0.02 sec)

那么使用视图来查询money字段值大于800如下所示:

mysql> select * from account_view;
+----+----------+-------+
| id | name     | money |
+----+----------+-------+
|  1 | Forlogen |  1000 |
|  3 | James    |   800 |
+----+----------+-------+
2 rows in set (0.00 sec)
2.2 修改视图

修改视图的语法如下:

ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]

其中[WITH [CASCADED | LOCAL] CHECK OPTION]决定了是否允许更新数据使记录不再满足视图的条件,取值的含义如下:

  • LOCAL : 只要满足本视图的条件就可以更新
  • CASCADED : 默认值,必须满足所有针对该视图的所有视图的条件才可以更新
2.3 查看视图

使用show tables可以查看存在的视图:

mysql> show tables;
+---------------------+
| Tables_in_sql_store |
+---------------------+
| account             |
| account_view        |
+---------------------+
10 rows in set (0.00 sec)

或者使用show table status like 'view_name' \G;来查询指定名字的视图信息:

mysql> show table status like 'account_view' \G;
*************************** 1. row ***************************
           Name: account_view
         Engine: NULL
        Version: NULL
     Row_format: NULL
           Rows: NULL
 Avg_row_length: NULL
    Data_length: NULL
Max_data_length: NULL
   Index_length: NULL
      Data_free: NULL
 Auto_increment: NULL
    Create_time: 2020-08-23 21:54:48
    Update_time: NULL
     Check_time: NULL
      Collation: NULL
       Checksum: NULL
 Create_options: NULL
        Comment: VIEW
1 row in set (0.00 sec)

如果想要查看视图具体的定义,要使用shwo create view_name \G;

mysql> show create view account_view \G;
*************************** 1. row ***************************
                View: account_view
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `account_view` AS select `account`.`id` AS `id`,`account`.`name` AS `name`,`account`.`money` AS `money` from `account` where (`account`.`money` >= 800)
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

当然也可以在各种客户端中查看已有的视图:

image-20200823220347194

2.4 删除视图

删除视图的语法如下:

DROP VIEW [IF EXISTS] view_name [, view_name] ...[RESTRICT 1 | CASCADE]

如果想要删除上面创建的视图,可以使用如下命令:

drop view account_view;

即可。


3. 总结

视图的使用还是比较简单的,可以根据具体的业务场景和需要来构建合适的视图,既可以保护数据的安全性,又可以提升用户的体验。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值