• 视图


    视图

    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;

     

  • 相关阅读:
    AVL树的java实现
    request和response的setCharacterEncoding()方法
    几种常用数据库连接池的使用
    String类、static关键字、Arrays类、Math类
    QT学习笔记(day02)
    QT学习笔记(day01)
    STL中栈和链表的不同实现方式的速度对比
    C++泛化双端队列
    C++泛化队列
    C++泛化栈
  • 原文地址:https://www.cnblogs.com/mmdz/p/15406713.html
Copyright © 2020-2023  润新知