• 【MySQL】浅谈视图


    1. 视图概述

    什么是视图?

    • 视图(view)是一个虚拟表,非真实存在,其本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用视图名称即可获取结果集,并可以将其当作表来使用。
    • 数据库中只存放了视图的定义,而并没有存放视图中的数据。这些数据存放在原来的表中
    • 使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。因此,视图中的数据是依赖于原来的表中的数据的。一旦表中的数据发生改变,显示在视图中的数据也会发生改变。

    视图有什么特点?

    1. 当视图来自多张基本表的时候,不允许添加和删除数据
    2. 视图的建立和删除不影响基本表。
    3. 对视图内容的更新(添加,删除和修改)直接影响基本表。

    视图有什么优点?

    • 简化复杂查询
    • 数据库视图有助于限制对特定用户的数据访问
      • 如一张表中有很多数据,很多信息不希望让所有人看到,此时可以使用视图视,如:社会保险基金表,可以用视图只显示姓名,地址,而不显示社会保险号和工资数等,可以对不同的用户,设定不同的视图。

    视图有什么缺点?

    • 从性能方面来看,从视图查询数据可能会很慢,特别是视图是基于其他视图创建的时候。
    • 从表依赖关系看,将根据数据库的基础表创建一个视图**。每当更改与其相关联的表的结构时,都必须更改视图。**

    视图的使用场景有哪些?

    视图在开发中还是有蛮多场景的, 比如: 采购单:有价格、数量、税率、含税金额,多半没有不含税金额、税额,而这些字段在很多报表中有都会用到,所以我们可以创建一个含有计算列字段的视图来解决这个问题。


    2. 创建视图

    create [or replace] [algorithm = {undefined | merge | temptable}]
     
    view view_name [(column_list)]
     
    as select_statement
     
    [with [cascaded | local] check option]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    参数说明:

    1. algorithm:可选项,表示视图选择的算法。
    2. view_name :表示要创建的视图名称。
    3. column_list:可选项,指定视图中各个属性的名词,默认情况下与SELECT语句中的查询的属性相同。
    4. select_statement:表示一个完整的查询语句,将查询记录导入视图中。
    5. [with [cascaded | local] check option]:可选项,表示更新视图时要保证在该视图的权限范围之内。
    create or replace view view1_emp
    as 
    select ename,job from emp; 
    
    • 1
    • 2
    • 3

    3. 修改视图

    修改视图是指修改数据库中已存在的表的定义。当基本表的某些字段发生改变时,可以通过修改视图来保持视图和基本表之间一致。MySQL中通过CREATE OR REPLACE VIEW语句和ALTER VIEW语句来修改视图

    alter view view1_emp
    as 
    select a.deptno,a.dname,a.loc,b.ename,b.sal from dept a, emp b where a.deptno = b.deptno;
    
    • 1
    • 2
    • 3

    4. 更新视图

    某些视图是可更新的。也就是说,可以在UPDATE、DELETE或INSERT等语句中使用它们,以更新基表的内容。对于可更新的视图,在视图中的行和基表中的行之间必须具有一对一的关系。

    但是并不是所有的视图都可更新,比如视图包含下述结构中的任意一种,它就是不可更新的。

    • 聚合函数(SUM(), MIN(), MAX(), COUNT()等)
    • DISTINCT
    • GROUP BY
    • HAVING
    • UNION或UNION ALL
    • 位于选择列表中的子查询
    • JOIN
    • FROM子句中的不可更新视图
    • WHERE子句中的子查询,引用FROM子句中的表。
    • 仅引用文字值(在该情况下,没有要更新的基本表)
    --  ---------更新视图-------
    create or replace view view1_emp
    as 
    select ename,job from emp;
     
    update view1_emp set ename = '周瑜' where ename = '鲁肃';  -- 可以修改
    insert into view1_emp values('孙权','文员');  -- 不可以插入
    
    -- ----------视图包含聚合函数不可更新--------------
    create or replace view view2_emp
    as 
    select count(*) cnt from emp;
     
    insert into view2_emp values(100);
    update view2_emp set cnt = 100; 
    -- ----------视图包含distinct不可更新---------
    create or replace view view3_emp
    as 
    select distinct job from emp;
     
    insert into view3_emp values('财务');
     
    -- ----------视图包含goup by 、having不可更新------------------
     
    create or replace view view4_emp
    as 
    select deptno ,count(*) cnt from emp group by deptno having  cnt > 2;
     
    insert into view4_emp values(30,100);
    -- ----------------视图包含union或者union all不可更新----------------
    create or replace view view5_emp
    as 
    select empno,ename from emp where empno <= 1005
    union 
    select empno,ename from emp where empno > 1005;
     
    insert into view5_emp values(1015,'韦小宝');
    
    -- -------------------视图包含子查询不可更新--------------------
    create or replace view view6_emp
    as 
    select empno,ename,sal from emp where sal = (select max(sal) from emp);
     
    insert into view6_emp values(1015,'韦小宝',30000);
    -- ----------------------视图包含join不可更新-----------------
    create or replace view view7_emp
    as 
    select dname,ename,sal from emp a join  dept b  on a.deptno = b.deptno;
     
    insert into view7_emp(dname,ename,sal) values('行政部','韦小宝',30000);
     
    -- --------------------视图包含常量文字值不可更新-------------------
    create or replace view view8_emp
    as 
    select '行政部' dname,'杨过'  ename;
     
    insert into view8_emp values('行政部','韦小宝');
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    视图中虽然可以更新数据,但是有很多的限制。一般情况下,最好将视图作为查询数据的虚拟表,而不要通过视图更新数据。因为,使用视图更新数据时,如果没有全面考虑在视图中更新数据的限制,就可能会造成数据更新失败。


    5. 其他操作

    重命名视图

    -- rename table 视图名 to 新视图名; 
    rename table view1_emp to my_view1
    
    • 1
    • 2

    删除视图

    -- drop view 视图名[,视图名…];
    drop view if exists view_student;
    
    • 1
    • 2

    删除视图时,只能删除视图的定义,不会删除数据。


    参考:

  • 相关阅读:
    C/C++经典例题:百钱百鸡
    DP(动态规划)【2】 最大连续子列和 最长不降子序列
    目标检测算法——YOLOv5结合ConvNeXt结构
    一文详解|增长那些事儿
    [工具]工控机磁盘容量监控通知工具
    网易游戏 Flink SQL 平台化实践
    Clickhouse Join
    EasyAR使用
    Chatgpt人工智能对话源码系统分享 带完整搭建教程
    Day13 | 每天五道题
  • 原文地址:https://blog.csdn.net/weixin_51146329/article/details/127872903