目录

一、概述

二、创建视图

三、删除视图

四、修改视图定义

五、查看视图定义

六、更新视图数据

七、查询视图数据

八、视图的应用

九、视图的进一步说明


一、概述

  • 视图是从一个或多个表或视图中导出来的表,包含一系列带有名称的数据列和数据行
  • 视图不是数据库中真实存在的表,而是一张虚拟表
  • 视图不是以数据集的形式存储在数据库中
  • 视图是用来查看存储在别处数据的一种载体,其本身并不存储数据

视图的优点:

  1. 集中分散数据
  2. 简化查询语句
  3. 重用SQL语句
  4. 保护数据安全
  5. 共享所需数据
  6. 更改数据格式

二、创建视图

格式:

CREATE [OR REPLACE] VIEW 视图名 AS 查询语句 [WITH  [CASCADED|LOCAL]  CHECK OPTION]
  •  OR REPLACE:可选项,替换数据库中已有的同名视图
  • WITH CHECK OPTION:用于指定在视图上进行的修改操作需要满足查询语句所指定的限制条件,这样可以确保数据修改后仍可通过视图查询修改后的数据
  • WITH CHECK OPTION的两个参数:CASCADED和LOCAL
  • CASCADED:默认值,它会对所有视图进行检查
  • LOCAL:它只对定义的视图进行检查

Example: 

  • 不指定列名称
  •  指定列名称

查询语句的一些限制:

  1. 定义视图的用户除了被授予CREATE VIEW权限外,还应授予操作视图基础表等相关权限
  2. SELECT语句不能包含FROM子句中的子查询
  3. SELECT语句不能引用系统变量或用户变量
  4. SELECT语句不能引用预处理语句参数
  5. SELECT语句引用的表或视图必须存在
  6. 若SELECT语句引用的不是当前数据的表或视图,需要在该表或视图前加上数据库的名称作为限定前缀
  7. SELECT语句构造的视图可以使用ORDER BY子句
  8. 对于SELECT语句中的其它选项或子句,若创建的视图也包含这些选项,则语句执行效果未定义

  • 不能包含FROM字句中的子查询(好像又可以包含)

laravel mysql视图 作为模型 mysql视图类型_linq


laravel mysql视图 作为模型 mysql视图类型_字段名_02

  • WITH CHECK OPTION的说明

laravel mysql视图 作为模型 mysql视图类型_mysql_03

  •  下面的两个视图都是根据score_view定义的

1.WITH LOCAL CHECK OPTION

laravel mysql视图 作为模型 mysql视图类型_sql_04


laravel mysql视图 作为模型 mysql视图类型_mysql_05

  •  官方解释:
  • Local:仅会针对其自身的插入项进行测试

2.WITH CASCADED CHECK OPTION

laravel mysql视图 作为模型 mysql视图类型_数据_06


laravel mysql视图 作为模型 mysql视图类型_数据_07

  •  官方解释:
  • Cascaded:不仅会针对其自身的插入项进行测试,也会针对基本视图score_view的插入项进行测试

总结:二者好像并无差别

三、删除视图

格式:

DROP VIEW [IF EXISTS] 视图名...;
  • IF EXISTS:判断要删除的视图是否存在,防止因删除不存在的视图而出错 

Example:

laravel mysql视图 作为模型 mysql视图类型_linq_08

四、修改视图定义

格式:

ALTER VIEW 视图名[(字段名..)] AS SELECT 字段名 FROM 表名 WHERE 条件语句 [WITH CHECK OPTION];
  • 修改视图定义:还可用CREATE VIEW、CREATE OR  REPLACE VIEW来实现

Example:

laravel mysql视图 作为模型 mysql视图类型_linq_09

五、查看视图定义

格式:

SHOW CREATE VIEW 视图名 [\G];
  • \G:改变输出结果集的显示方式,更易看懂 

Example:

laravel mysql视图 作为模型 mysql视图类型_mysql_10

六、更新视图数据

格式:

INSERT INTO 视图名 VALUES(字段名...) VALUES(字段值...) [WHERE子句];
UPDATE 视图名 SET 字段名=字段值;
DELETE FROM 视图名 WHERE...;

Example:

 1.使用INSERT语句通过视图向基础表插入数据




  • WITH CHECK OPTION:更新数据时检查新数据是否符合WHERE子句的条件 
  • 性别不满足创建视图时WHERE子句的条件(‘男’)

2.使用UPDATE语句通过视图修改基础表的数据




3.使用DELETE语句通过视图删除基础表的数据




Explation:

  • 视图是一张虚拟表,所以可以对视图进行增删改查,但视图的操作是受限制的,只有满足可更新条件的视图才能进行数据更新,否则会导致系统出现不可预期的结果
  • 对于可更新的视图,视图中的行和基础表中的行具有一对一的关系
  • 视图包含下述任何一种SQL语句结构,则视图是不可更新的
  • 聚合函数
  • DISTINCT关键字
  • GROUP BY子句
  • ORDER BY子句
  • HAVING子句
  • UNION运算符
  • 位于选择列表中的子查询
  • FROM子句中包含多个表
  • SELECT语句中引用了不可更新的视图
  • WHERE字句中的子查询,引用FROM字句中的表

七、查询视图数据

格式:

SELECT 字段名 FROM 表名 [WHERE 条件语句];
  • 虚拟表,所以对视图进行查询,就相当于对基本表的操作

Example:

laravel mysql视图 作为模型 mysql视图类型_linq_11

八、视图的应用

  • 利用视图可以简化复杂的表连接
  • 使用视图可以重新格式化检索出的数据
  • 使用视图可以过滤掉不想要的数据

九、视图的进一步说明

  • 创建视图必须要有足够的访问权限
  • 对于创建视图的数目没有限制
  • 视图可以嵌套,即可从其它视图检索查询得来的数据构造一个新的视图
  • ORDER BY子句可用在视图中,如果原SELECT语句中也有ORDER BY子句,则该ORDER BY被覆盖
  • 视图不能有索引、触发器、默认值
  • 视图可以和表一起使用