视图

视图

1.1 概述

视图是指计算机数据库中的视图,是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。——百度百科

关系型数据库中的数据是由一张一张的二维关系表所组成,简单的单表查询只需要遍历一个表,而复杂的多表查询需要将多个表连接起来进行查询任务。对于复杂的查询事件,每次查询都需要编写MySQL代码效率低下。为了解决这个问题,数据库提供了视图(view)功能。

视图是虚拟表,本身不存储数据,而是按照指定的方式进行查询。

1.2 视图的基本使用

操作指令代码
创建视图 CREATE VIEW 视图名(列1,列2...) AS SELECT (列1,列2...) FROM ...;
使用视图 当成表使用就好
修改视图 CREATE OR REPLACE VIEW 视图名 AS SELECT [...] FROM [...];
查看数据库已有视图 >SHOW TABLES [like...];(可以使用模糊查找)
查看视图详情 DESC 视图名或者SHOW FIELDS FROM 视图名
视图条件限制 [WITH CHECK OPTION]
删除视图 DROP VIEW [IF EXISTS] 视图名1

1.3 创建视图

创建视图: CREATE VIEW 视图名 AS

 -- 准备一张表
 SET FOREIGN_KEY_CHECKS=0;
 ​
 -- ----------------------------
 -- Table structure for sys_job
 -- ----------------------------
 DROP TABLE IF EXISTS `sys_job`;
 CREATE TABLE `sys_job` (
   `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '岗位ID',
   `name` varchar(255) NOT NULL COMMENT '岗位名称',
   `enabled` bit(1) NOT NULL COMMENT '岗位状态',
   `job_sort` int(5) DEFAULT NULL COMMENT '排序',
   `is_deleted` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '逻辑删除 1(true)已删除, 0(false)未删除',
   `create_time` datetime NOT NULL COMMENT '创建日期',
   `create_by` varchar(20) NOT NULL COMMENT '创建人',
   `update_time` datetime NOT NULL COMMENT '更新时间',
   `update_by` varchar(20) NOT NULL COMMENT '更新人',
   `version` bigint(32) NOT NULL COMMENT '版本',
   PRIMARY KEY (`id`) USING BTREE,
   UNIQUE KEY `uniq_name` (`name`),
   KEY `inx_enabled` (`enabled`)
 ) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT COMMENT='岗位';
 ​
 -- ######################################################################
 -- 创建视图
 CREATE VIEW v_job AS 
     SELECT * FROM sys_job;
 ​
 -- 查询结果
 SELECT * FROM v_job;

 

总结: 使用视图和使用表完全一样,只需要把视图当成一张表就OK了。视图是一张虚拟表。

1.4 修改视图

修改和创建视图可以使用代码 : CREATE OR REPLACE VIEW 视图名 AS SELECT [...] FROM [...]

 -- 修改视图(只需要查询id、name)
 CREATE OR REPLACE VIEW v_job AS 
     SELECT id,name FROM sys_job;
     
 -- 查询结果
 SELECT * FROM v_job;

 

1.5 查看视图

 -- 查看数据库已有视图(可以使用模糊查找)
 SHOW TABLES; -- 得到所有的表和视图
 SHOW TABLES LIKE 'v_%';
 ​
 -- 查看视图详情{(desc 视图名)/(show fields from 视图名)}
 DESC v_job;
 SHOW FIELDS FROM v_job;

总结: 通过show tables;反馈得到所有的表和视图。同样的,我们可以通过模糊检索的方式专门查看视图,这个时候,视图的命令统一采用v视图名v视图名的优势就体现出来了。

1.6 视图与数据变更

1.6.1 表格数据变更

将表 v_job 中的数据进行更新,在通过视图检索:

 -- 表格数据变更
 UPDATE v_job SET name = '视图修改' WHERE id = 16;
 ​
 SELECT * FROM v_job;

 

总结:视图不是表,不保存数据,只是一张虚拟表;

1.6.2 表格数据插入

 

1.6.3 WITH CHECK OPTION约束

如果在创建视图的时候制定了“WITH CHECK OPTION”,那么更新数据时不能插入或更新不符合视图限制条件的记录。

作用:对视图所做的DML操作的结果,不能违反视图的WHERE条件的限制。

总结:因为违反了视图中的where author_id = 1子句,所以抛出异常; 利用with check option约束限制,保证更新视图是在该视图的权限范围之内。 使用WITH CHECK OPTION约束时,(不指定选项则默认是CASCADED) 可以使用CASCADED或者LOCAL选项指定检查的程度: CASCADED:检查所有的视图,会检查嵌套视图及其底层的视图 LOCAL:只检查将要更新的视图本身,嵌套视图不检查其底层的视图

1.7 删除视图

删除视图是指删除数据库中已存在的视图,删除视图时,只能删除视图的定义,不会删除数据,也就是说不会影响基表

 DROP VIEW  IF EXISTS  v_job;

 

原文地址:https://www.cnblogs.com/mmdz/p/15406713.html