MySQL · 视图

简介

视图是虚拟的表,与包含数据的表不一样,视图只包含使用时动态检索数据的查询 SQL。一般情况下,应该将视图用于检索(SELETE),而不用于更新(INSRTEUPDATEDELETE)。

视图具有表结构文件,但不存在数据文件。

优点

  • 简化,隐藏复杂的 SQL ,简化复杂 SQL 的数据处理,还可以重新格式化数据
  • 安全,保护数据,可以给用户授予表的特定部分的访问权限而不是整个表的访问权限

缺点

  • 性能相对较差

性能问题:因为视图不包含数据,所以每次使用视图时,都必须处理查询执行时所需的任何一个检索。如果你用多个联结和过滤创建了复杂的视图或者嵌套了视图,就会发现性能下降得很厉害,主要原因是不能建立索引

权限

  • CREATE VIEW:创建视图
  • SHOW VIEW:查看视图

操作

创建视图

1
2
3
CREATE [ALGORITHM = {MERGE | TEMPTABLE | UNDEFINED}]
VIEW [database_name].[view_name]
AS [SELECT statement]

MySQL 有三种视图策略, 分别是 MERGETEMPTABLEUNDEFINED

  • MERGE,先将输入的查询语句和视图的声明语句进行合并,然后执行合并后的语句并返回。
  • TEMPTABLE,先基于视图的声明创建一张 temporary table,当输入查询语句时会直接查询这张 temporary tableTEMPTABLE 的效率要比 MERGE 低。
  • UNDEFINED,如果创建视图的时候不指定策略,默认使用此策略。UNDEFINED 会自动选择使用上述两种策略中的一个,优先选择 MERGE 策略,无法使用则转为 TEMPTABLE 策略。

显示视图

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查询单个视图
show create view view_name;

mysql> show create view cosmo_zzwk_2048.yangjisaomiao_view\G
*************************** 1. row ***************************
View: yangjisaomiao_view
Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`wms`@`%` SQL SECURITY DEFINER VIEW `cosmo_zzwk_2048`.`yangjisaomiao_view` AS select distinct `a`.`ORDER_NO` AS `order_id`,`a`.`OUT_CODE` AS `sm_id`,`a`.`BARCODE` AS `sern`,`a`.`SCAN_TIME` AS `scandate`,`a`.`SCANED_BY` AS `scanuser`,'10.138.228.165' AS `database_ip`,'90J0' AS `SAP_Plant`,'黄岛智慧厨电' AS `sap_description` from `cosmo_zzwk_2048`.`ods_pro_yj_sn` `a` where (`a`.`SCAN_TIME` >= (curdate() - interval 30 day))
character_set_client: utf8
collation_connection: utf8_general_ci
1 row in set (0.00 sec)

# 查询所有视图
SELECT * FROM information_schema.views;

删除视图

1
drop view view_name;