第十四章:视图

第十四章:视图

14.1:常见的数据库对象

对象 描述
表(TABLE) 表示存储数据的逻辑单元,以行和列的形式存在,列就是字段,行就是记录
数据字典 就是系统表,存放数据库相关信息的表。系统表的数据通常由数据库系统维护,程序员通常不应该修改,只可查看
约束(CONSTRAINT) 执行数据效验的规则,用于保证数据完整性的规则
视图(VIEW) 一个或者多个数据表里的数据的逻辑显示,视图并不存储数据
索引(INDEX) 用于提高查询性能,相当于书的目录
存储过程(RPOCEDURE) 用于完成一次完整的业务处理,没有返回值,但可通过传出参数将多个值传给调用还环境
存储函数(FUNCTION) 用于完整一次特殊的计算,具有一个返回值
触发器(TRIGGER) 相当于一个事件监听器,当数据库发生特定事件后,触发器被触发,完成相应的处理

14.2:视图概述

  1. 视图的理解
    • 视图是一种虚拟表,本身是不具有数据的,占用很少的内存空间,它是SQL中的一个重要概念。
    • 视图建立在已有表的基础上,视图赖以建立的这些表称为基表
    • 视图的创建和删除只影响视图本身,不影响对应的基表。但是当对视图中的数据进行增加、删除和修改操作时,数据表中的数据会相应地发生变化,反之亦然。
    • 向视图提供内容的语句为SELECT语句,可以将视图 理解为存储起来的SELECT语句
    • 视图,是向用户提供基表数据的另一种表现形式。通常情况下,小型项目的数据库可以不使用视图,但是在大型项目中,以及数据表比较复杂的情况下,视图的价值就凸显出来了,它可以帮助我们把经常查询的结果集放到虚拟表中,提升使用效率。理解和使用起来都非常方便。

14.3:创建视图

  1. 语法

    • CREATE VIEW语句中嵌入子查询

      CREATE [OR REPLACE]
      [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
      VIEW 视图名称
      AS 查询语句
      [WITH [CASCADED | LOCAL] CHECK OPTION ]
      
    • 精简版

      CREATE VIEW 视图名称
      AS 查询语句
      
  2. 创建单表视图

    • 在创建视图时,没有视图名后面指定字段列表,则视图中字段列表默认和SELECT语句中的字段列表一致。如果SELECT语句中给字段取了别名,那么视图中的字段名和别名相同。

      # 视图字段与表的字段一致
      CREATE VIEW vu_emp1
      AS
      SELECT employee_id, last_name, salary
      FROM emps;
      
      SELECT * FROM vu_emp1;
      # 确定视图中字段名的方式1:
      CREATE VIEW vu_emp2
      AS 
      SELECT employee_id emp_id, last_name lname, salary #查询语句中字段的别名会作为视图中字段的名称出现
      FROM emps
      WHERE salary > 8000;
      
      SELECT * FROM vu_emp2;
      #确定视图中字段名的方式2:
      CREATE VIEW vu_emp3(emp_id, NAME, monthly_sal) #小括号内字段个数与SELECT中字段个数相同
      AS
      SELECT employee_id, last_name, salary
      FROM emps
      WHERE salary > 8000;
      
      SELECT * FROM vu_emp3;
      
      #视图中的字段在基表中可能没有对应的字段
      CREATE VIEW vu_emp_sal
      AS
      SELECT department_id, AVG(salary) avg_sal
      FROM emps
      WHERE department_id IS NOT NULL
      GROUP BY department_id;
      
      SELECT * FROM vu_emp_sal;
      
  3. 创建多表联合视图

    CREATE VIEW vu_emp_dept
    AS
    SELECT e.employee_id, e.department_id, d.department_name
    FROM emps e JOIN depts d
    ON e.department_id = d.department_id;
    
    SELECT * FROM vu_emp_dept;
    
    #利用视图对数据进行格式化
    CREATE VIEW vu_emp_dept1
    AS
    SELECT CONCAT(e.last_name, '(', d.department_name, ')') emp_info
    FROM emps e JOIN depts d
    ON e.department_id = d.department_id; 
    
    SELECT * FROM vu_emp_dept1;
    
  4. 基于视图创建视图

    • 当我们创建好一张视图之后,还可以在它的基础上继续创建视图

      CREATE VIEW vu_emp4
      AS
      SELECT employee_id, last_name
      FROM vu_emp1;
      
      SELECT * FROM vu_emp4;
      

14.4:查看视图

  1. 查看数据的表对象、视图对象

    SHOW TABLES;
    
  2. 查看视图的结构

    # 语法
    DESC / DESCRIBE 视图名称;
    # 举例
    DESC / DESCRIBE vu_emp1;
    
  3. 查看视图的属性信息

    # 语法
    SHOW TABLE STATUS LIKE '视图名称';
    # 举例
    SHOW TABLE STATUS LIKE 'vu_emp1';
    

    注意:执行结果显示,注释CommentVIEW,说明该表为视图,其他的信息为NULL,说明这是这个虚表。

  4. 查看视图的详细定义信息

    # 语法
    SHOW CREATE VIEW 视图名称;
    # 举例
    SHOW CREATE VIEW vu_emp1;
    

14.5:更新视图的数据

  1. 一般情况

    • MySQL支持使用INSERTUPDATEDELETE语句对视图中的数据进行插入、更新和删除操作。当视图中的数据发生变化时,数据表中的数据也会发生变化,反之亦然。

      SELECT * FROM vu_emp1;
      
      SELECT employee_id, last_name, salary
      FROM emps;
      
      #更新视图的数据,会导致基表中数据的修改
      UPDATE vu_emp1
      SET salary = 20000
      WHERE employee_id = 101;
      
      #同理,更新表中的数据,也会导致视图中的数据的修改
      UPDATE emps
      SET salary = 10000
      WHERE employee_id = 101;
      
  2. 不可更新的视图

    要使视图可更新,视图中的行和底层基本表中的行之间必须存在一对一的关系。另外当视图定义出现如下情况,视图不支持更新操作

    • 在定义视图的时候指定了ALGORITH = TEMPTABLE,视图将不支持INSERTDELETE操作。
    • 视图中不包含基表中所有被定义为非空又未指定默认值的列,视图将不支持INSERT操作。
    • 在定义视图的SELECT语句中使用了JOIN联合查询,视图将不支持INSERTDELETE操作。
    • 在定义视图的SELECT语句后的字段列表中使用了数学表达式或子查询,视图将不支持INSERT,也不支持UPDATE使用了数学表达式、子查询的字段值。
    • 在定义视图的SELECT语句后的字段列表中使用DISTINCT聚合函数GROUP BYHAVINGUNION等,视图将不支持INSERTUPDATEDELETE
    • 在定义视图的SELECT语句中包含了子查询,而子查询中引用了FROM后面的表,视图将不支持INSERTUPDATEDELETE
    • 视图定义基于一个不可更新视图
    • 常量视图。

14.6:删除、修改视图

  1. 修改视图

    • 语法

      ALTER VIEW 视图名称
      AS
      查询语句
      
    • 方式一:使用CREATE OR REPLACE VIEW子句修改视图

      CREATE OR REPLACE VIEW vu_emp1
      AS
      SELECT employee_id, last_name, salary, email
      FROM emps
      WHERE salary > 7000
      
    • 方式二:ALTER VIEW

      ALTER VIEW vu_emp1
      AS
      SELECT employee_id, last_name, salary, email, hire_date
      FROM emps;
      
  2. 删除视图

    • 语法

      DROP VIEW IF EXISTS 视图名称;
      
    • 举例

      DROP VIEW IF EXISTS vu_emp2, vu_emp3;
      
    • 基于视图a、b创建了新的视图c,如果将视图a或者视图b删除,会导致视图c的查询失败。这样的视图c需要手动删除或修改,否则影响使用。

你可能感兴趣的:(MySQL,数据库,sql,mysql)