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)
当然也可以在各种客户端中查看已有的视图:
2.4 删除视图
删除视图的语法如下:
DROP VIEW [IF EXISTS] view_name [, view_name] ...[RESTRICT 1 | CASCADE]
如果想要删除上面创建的视图,可以使用如下命令:
drop view account_view;
即可。
3. 总结
视图的使用还是比较简单的,可以根据具体的业务场景和需要来构建合适的视图,既可以保护数据的安全性,又可以提升用户的体验。