视图是什么

  视图是一种虚拟存在的表,不会在数据库中实际存在。相比较普通的表,有如下优势

  • 简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集
  • 安全:使用视图的用户只能访问被允许查询的结果集,对表的管理权限并不能限制到某个行某个列,但是通过视图就可以简单地实现
  • 数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响

视图操作

  视图的操作包括创建或者修改视图、删除视图、以及查看视图定义

创建或者修改视图

  创建视图需要有CREATE VIEW的权限,并且对于查询涉及的列有SELECT权限。如果使用CREATE OR REPLACE或者ALTER修改视图,那么还需要该视图的DROP权限

创建视图的语法为:
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
  VIEW view_name [(column_list)]
  AS select_statement
  [WITH [CASCADED | LOCAL] CHECK OPTION]
修改视图的语法为:
ALTER [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
  VIEW view_name [(column_list)]
  AS select_statement
  [WITH [CASCADED | LOCAL] CHECK OPTION]

 

以northwind数据库示例中的产品表和供应商表为例创建一个视图:

mysql 视图可以提高查询效率吗_MySQL

 

MySQL的视图定义有一定的限制,如,在FROM关键字后面不能包含子查询。但可以将子查询的内容先定义成一个视图,再对该视图创建视图即可

视图更新 

视图的可更新性与视图中查询的定义是有关系的。以下类型的视图是不可更新的

  • 包含以下关键字的sql语句:聚合函数、DISTINCT、GROUP BY、HAVING、UNION或者UNION ALL
  • 常量视图
  • SELECT中包含子查询
  • JOIN
  • FROM一个不能更新的视图
  • WHERE字句的子查询引用了FROM字句中的表

WITH [CASCADED | LOCAL] CHECK OPTION 决定了是否允许更新数据使记录不再满足视图的条件

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

查看视图

在目前的MySQL版本中,已摒弃了使用SHOW VIEWS查看视图的方法,使用SHOW TABLES不仅可以显示表,同时也可显示视图

例如,重新创建一个"产品_供应商_view"视图,并且使用SHOW TABLES查看
 
CREATE OR REPLACE VIEW 产品_供应商_view AS
SELECT `产品`.`产品ID`, `产品`.`产品名称`, `产品`.`单位数量`, `供应商`.`公司名称`, `供应商`.`城市`
FROM `产品`, `供应商`
WHERE `产品`.`供应商ID` = `供应商`.`供应商ID`


使用SHOW TABLES查看结果:

mysql 视图可以提高查询效率吗_子查询_02

使用SHOW TABLE STATUS也可查看视图的信息

SHOW TABLE STATUS LIKE '产品_供应商_view' \G


mysql 视图可以提高查询效率吗_mysql 视图可以提高查询效率吗_03

查询定义视图的语句

mysql 视图可以提高查询效率吗_数据_04

 

视图数据查询

视图"产品_供应商_view"的数据结构如图所示

mysql 视图可以提高查询效率吗_子查询_05

现在通过视图查询出一些数据

mysql 视图可以提高查询效率吗_MySQL_06

也可以使用GROUP BY等条件限制查询

mysql 视图可以提高查询效率吗_MySQL_07

 

视图数据修改

使用UPDATE语句可对视图中的数据进行修改。如


UPDATE `产品_供应商_view` SET `产品名称` = '果粒橙' WHERE `产品ID` = 1


mysql 视图可以提高查询效率吗_MySQL_08

可以看到,视图中的第一条记录中的产品名称已变为"果粒橙",那么视图中的数据改变了,源表中的数据是不是也改变了呢?

mysql 视图可以提高查询效率吗_mysql 视图可以提高查询效率吗_09

事实上源表中的数据也发生了变化

视图数据删除

既然视图中的数据可以修改,而且源表也随之变化。那么,如果删除视图中的数据,源表会如何变化呢

mysql 视图可以提高查询效率吗_子查询_10

由于此视图是由产品表和供应商连接查询而创建的,所以为了保证数据的完整性,是不能够删除视图中的记录

删除视图

用户可以一次删除一个或多个视图,但要求用户必须有该视图的DROP权限

语法:DROP VIEW [IF EXISTS] view_name [, view_name]...[RESTRICT | CASCADE]

例如,要删除上文中创建的视图"产品_供应商_view"

mysql 视图可以提高查询效率吗_MySQL_11

此时,视图"产品_供应商_view"已被删除