Mysql中的视图

 

如果一个较长、复杂的SQL语句经常被使用,那么视图View就派上用场了。它可以看成是查询语句的别名,用一个短短的名字就可以代表一大串长SQL。

使用视图

create view table_view as select ……

查询视图

show tables;

 

视图原理

视图就相当于某个查询语句的别名。

创建视图时并不会将创建其的查询语句结果集维护在硬盘or内存,而是mysql会将我们队视图的查询语句转换为对底层标的查询,再去执行操作。我们对视图的相关操作都会被映射到原本的查询语句对应的底层表上。
(注意:新建的视图名字不能与现有表或视图同名!)

创建视图时的查询语句中的查询列表,就是视图的列(也称虚拟列)。不仅是简单的查询语句,复杂的查询语句也可以使用视图;视图还可以和真实表一起使用;甚至,还可以利用视图来创建视图。实际上,我们可以把视图当做一个表去使用,它大大简化了SQL的书写。

创建视图时,可以为虚拟列自定义列名,一旦自定义了列名,后续对该视图的操作都需要基于这些自定义列名,如果还在使用旧的,就会报错。即:

create view table_view(no, n, m) as select ……

视图结构

mysql> show create view st1_v\G
*************************** 1. row ***************************
                View: st1_v
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `st1_v` AS select `st1`.`id` AS `id`,`st1`.`key1` AS `k1`,`st1`.`key3` AS `k3`,`st1`.`common_field` AS `kc` from `st1` limit 9,10
character_set_client: utf8
collation_connection: utf8_general_ci
1 row in set (0.00 sec)

 

可更新操作的视图

对视图的增删改操作,实际上就是对对应底层表的操作。但是注意,这是有个前提的——前提就是视图中的每一条记录必须与底层表的每条记录一一对应。啥叫一一对应呢?比方说简单的查询语句创建出来的视图,它的记录就是和底层表的记录是对应的,它没有对结果集做一些额外的操作。又比如声场视图的查询语句中包括一些汇总函数、去重、分组、并集等操作,那么视图的记录就和底层表记录不会对应。查询语句中包含以下内容时,视图不可更新:

  • 汇总函数(SUM()  MIN()  MAX()  COUNT()  ……)
  • DISTINCT
  • GROUP BY
  • HAVING
  • UNION 或UNION ALL
  • 带子查询
  • ……

删除视图

drop view view_name

 

posted @ 2021-12-20 22:41  我永远喜欢石原里美  阅读(50)  评论(0)    收藏  举报