26-视图

作者: 紫荆秋雪_文 | 来源:发表于2022-08-31 13:44 被阅读0次

    一、常见的数据库对象

    • 表:表是存储数据的逻辑单元,以行和列的形式存在,列就是字段,行就是记录
    • 数据字典:就是系统表,存放数据库相关信息的表。
    • 约束:执行数据校验的规则,用于保证数据完整性的规则
    • 视图:一个或者多个数据表里的数据的逻辑显示,视图并不存储数据
    • 索引:用于提高查询性能,相当于书的目录
    • 存储过程:用于完成一次完整的业务处理,没有返回值,但可通过传出参数将多个值传给调用环境
    • 存储函数:用于完成一次特定的计算,具有一个返回值
    • 触发器:相当于一个事件监听器,当数据库发生特定事件后,触发器被触发,完成相应的处理

    二、视图

    • 视图是一种 虚拟表,本身是 不具有数据 的,占用很少的内存空间,它是 SQL 中的一个重要概念
    • 视图建立在已有的表的基础上,视图赖以建立的这些表称为基表
    • 视图的创建和删除只影响视图本身,不影响对应的基表。但是当对视图中的数据进行增加、删除和修改操作时,数据表中的数据会相应的发生变化,反之亦然。
    • 视图是向用户提供基表数据的另一种表现形式。
    • 视图可以帮我们使用表的一部分而不是所有的表,另一方面也可以针对不同的用户指定不同的查询视图,从而保证了安全性(敏感信息)


      视图-基表.png

    三、创建视图

    • 语法格式
    CREATE [OR REPLACE] 
    [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] 
    VIEW 视图名称 [(字段列表)] 
    AS 查询语句 
    [WITH [CASCADED|LOCAL] CHECK OPTION]
    

    1、创建单表视图

    CREATE OR REPLACE VIEW view_emp
    AS
    SELECT id, name
    FROM emp;
    
    • 查询视图
    SELECT *
    FROM view_emp;
    
    • SELECT更加丰富(使用AVG函数)
    CREATE OR REPLACE VIEW view_emp_avg
    AS
    SELECT dep_id, AVG(salary)
    FROM emp
    GROUP BY dep_id;
    

    小结

    • 实际上就是在SQL查询语句的基础上封装了视图 VIEW,这样就会给予 SQL 语句的结果集形成一张虚拟表
    • 在创建视图时,没有在视图名后面指定字段列表,则视图中字段列表默认和 SELECT 语句中的字段列表一致。

    2、创建多表联合视图

    CREATE VIEW view_emp_dept(emp_id, emp_name, dept_name)
    AS
    SELECT e.id, e.name, t.name
    FROM emp e
             JOIN dept t ON e.dep_id = t.id;
    

    3、基于视图创建视图

    CREATE VIEW view_view_emp_dept(id, name, dept_name)
    AS
    SELECT ve.id, ved.emp_name, ved.dept_name
    FROM view_emp ve
             JOIN view_emp_dept ved ON ve.id = ved.emp_id;
    

    四、更新视图的数据

    1、新增数据

    • 通过视图来新增数据从而在基表中新增数据
    INSERT INTO view_emp
    VALUES (1, 'Raven');
    
    • 查询视图,多了一条数据
    SELECT *
    FROM view_emp
    ORDER BY id;
    
    通过视图来新增数据.png
    • 查看基表
    SELECT *
    FROM emp
    ORDER BY id;
    
    通过视图来新增数据从而在基表中新增数据.png

    小结

    • 通过视图新增数据,如同在基表新增数据
    • 通过视图新增数据,不一定可以给基表新增数据(视图中字段一般是少于基表中字段,如果少于的字段为非空时,就无法通过视图来保存数据)

    2、更新数据

    UPDATE view_emp
    SET name = '111'
    WHERE id = 1;
    

    3、删除操作

    DELETE
    FROM view_emp
    WHERE id = 1;
    

    小结

    虽然可以更新视图数据,但总的来说,视图作为 虚拟表,主要用于 方便查询 不建议更新视图的数据。对视图数据的更改,都是通过对实际数据表里数据的操作来完成的

    五、修改、删除视图

    1、修改视图

    • 方式一
    CREATE OR REPLACE VIEW view_emp_dept(emp_id, emp_name, salary, dept_name)
    AS
    SELECT e.id, e.name, e.salary, t.name
    FROM emp e
             JOIN dept t ON e.dep_id = t.id;
    
    • 方式二
    ALTER VIEW view_emp_dept(emp_id, emp_name, salary, dept_name)
    AS
    SELECT e.id, e.name, e.salary, t.name
    FROM emp e
             JOIN dept t ON e.dep_id = t.id;
    

    2、删除视图

    • 删除视图只是删除视图的定义,并不会删除基表的数据
    DROP VIEW IF EXISTS view_view_emp_dept;
    

    六、小结

    1、视图的优点

    • 1、操作简单:将经常使用的查询操作定义为视图
    • 2、减少数据冗余:视图与实际数据表不一样,它存储的是查询语句。
    • 3、数据安全:MySQL将用户对数据的 访问限制 在某些数据的结果集上,而这些数据的结果集可以使用视图来实现。用户不必直接查询或操作数据表。
    • 4、适应灵活多变的需求
    • 5、能够分解复杂的查询逻辑:数据库中如果存在复杂的查询逻辑,则可以将问题进行拆解,创建多个视图获取数据,再将创建的多个视图结合起来,完成复杂的查询逻辑

    2、视图的不足

    • 如果实际数据表的结构变更了,就需要及时对相关的视图进行相应的维护。特别是嵌套的视图,维护成本较高。

    七、练习

    #1. 使用表employees创建视图employee_vu,其中包括姓名(LAST_NAME),员工号(EMPLOYEE_ID),部门 号(DEPARTMENT_ID)
    CREATE VIEW employee_vu(last_name, emp_id, dept_id)
    AS
    SELECT last_name, employee_id, department_id
    FROM employee;
    
    #2. 显示视图的结构
    DESC employee_vu;
    
    # 3. 查询视图中的全部内容
    SELECT *
    FROM employee_vu;
    
    # 4. 将视图中的数据限定在部门号是80的范围内
    CREATE OR REPLACE VIEW employee_vu(last_name, emp_id, dept_id)
    AS
    SELECT last_name, employee_id, department_id
    FROM employee
    WHERE department_id = 80;
    
    # 准备
    CREATE TABLE IF NOT EXISTS employee
    AS
    SELECT *
    FROM atguigudb.employees;
    USE test;
    
    

    相关文章

      网友评论

        本文标题:26-视图

        本文链接:https://www.haomeiwen.com/subject/rncdnrtx.html