• mysql核心知识之视图的应用


    什么是视图?视图的作用是什么?

    视图(view):是一种虚拟存在的表,是一个逻辑表,它本身是不包含数据的。作为一个select语句保存在数据字典中的。

    作用:通过视图,可以展现基表(用来创建视图的表叫做基表base table)的部分数据,说白了视图的数据就是来自于基表

    视图的优点是:

    1)简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。

    2)安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。

    3)数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。
      
    4)不占用空间:视图是逻辑上的表,不占用内存空间

    总而言之,使用视图的大部分情况是为了保障数据安全性,提高查询效率。

    创建的基本语法是:

    create view <视图名称> as select 语句;
    create view <视图名称> (字段) as select 语句;
    create or replace view <视图名称>;
    
    • 1
    • 2
    • 3

    create view <视图名称> as select 语句:

    mysql> select * from employee;
    +-------+--------+--------+------+------------+----------+--------+
    | empno | ename  | job    | mgr  | hiredate   | sal      | deptnu |
    +-------+--------+--------+------+------------+----------+--------+
    |  1004 | 猪八戒 | 经理   | 1009 | 2001-04-02 | 29750.00 |     20 |
    |  1006 | 猴子   | 经理   | 1009 | 2011-05-01 | 28500.00 |     30 |
    |  1007 | 张飞   | 经理   | 1009 | 2011-09-01 | 24500.00 |     10 |
    |  1008 | 诸葛亮 | 分析师 | 1004 | 2017-04-19 | 30000.00 |     20 |
    |  1013 | 林俊杰 | 分析师 | 1004 | 2011-12-03 | 30000.00 |     20 |
    |  1002 | 牛魔王 | 销售员 | 1006 | 2018-02-20 | 16000.00 |     30 |
    |  1003 | 程咬金 | 销售员 | 1006 | 2017-02-22 | 12500.00 |     30 |
    |  1005 | 后裔   | 销售员 | 1006 | 2011-09-28 | 12500.00 |     30 |
    |  1010 | 韩信   | 销售员 | 1006 | 2018-09-08 | 15000.00 |     30 |
    |  1012 | 安琪拉 | 文员   | 1006 | 2011-12-03 | 9500.00  |     30 |
    |  1014 | 甄姬   | 文员   | 1007 | 2019-01-23 | 7500.00  |     10 |
    |  1011 | 妲己   | 文员   | 1008 | 2018-05-23 | 11000.00 |     20 |
    |  1001 | 小乔   | 文员   | 1013 | 2018-12-17 | 8000.00  |     20 |
    |  1009 | 唐僧   | 董事长 | NULL | 2010-11-17 | 50000.00 |     10 |
    +-------+--------+--------+------+------------+----------+--------+
    14 rows in set (0.03 sec)
    
    mysql> create view employ as select ename,sal from employee;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> show tables;
    +----------------+
    | Tables_in_test |
    +----------------+
    | dept           |
    | employ         |
    | employee       |
    | kk             |
    | salgrade       |
    +----------------+
    5 rows in set (0.03 sec)
    
    mysql> select * from employ;
    +--------+----------+
    | ename  | sal      |
    +--------+----------+
    | 猪八戒 | 29750.00 |
    | 猴子   | 28500.00 |
    | 张飞   | 24500.00 |
    | 诸葛亮 | 30000.00 |
    | 林俊杰 | 30000.00 |
    | 牛魔王 | 16000.00 |
    | 程咬金 | 12500.00 |
    | 后裔   | 12500.00 |
    | 韩信   | 15000.00 |
    | 安琪拉 | 9500.00  |
    | 甄姬   | 7500.00  |
    | 妲己   | 11000.00 |
    | 小乔   | 8000.00  |
    | 唐僧   | 50000.00 |
    +--------+----------+
    14 rows in set (0.03 sec)
    
    mysql> update employ set sal='40000' where ename='唐僧';
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    • 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
    • 59
    • 60

    create or replace view <视图名称>;

    mysql> show tables;
    +----------------+
    | Tables_in_test |
    +----------------+
    | dept           |
    | employee       |
    | kk             |
    | salgrade       |
    +----------------+
    4 rows in set (0.03 sec)
    
    mysql> create or replace view employ as select ename,sal from employee;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select * from employ;
    +--------+----------+
    | ename  | sal      |
    +--------+----------+
    | 猪八戒 | 29750.00 |
    | 猴子   | 28500.00 |
    | 张飞   | 24500.00 |
    | 诸葛亮 | 30000.00 |
    | 林俊杰 | 30000.00 |
    | 牛魔王 | 16000.00 |
    | 程咬金 | 12500.00 |
    | 后裔   | 12500.00 |
    | 韩信   | 15000.00 |
    | 安琪拉 | 9500.00  |
    | 甄姬   | 7500.00  |
    | 妲己   | 11000.00 |
    | 小乔   | 8000.00  |
    | 唐僧   | 50000.00 |
    +--------+----------+
    14 rows in set (0.02 sec)
    
    mysql> create or replace view employ as select ename,sal,job from employee;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select * from employ;
    +--------+----------+--------+
    | ename  | sal      | job    |
    +--------+----------+--------+
    | 猪八戒 | 29750.00 | 经理   |
    | 猴子   | 28500.00 | 经理   |
    | 张飞   | 24500.00 | 经理   |
    | 诸葛亮 | 30000.00 | 分析师 |
    | 林俊杰 | 30000.00 | 分析师 |
    | 牛魔王 | 16000.00 | 销售员 |
    | 程咬金 | 12500.00 | 销售员 |
    | 后裔   | 12500.00 | 销售员 |
    | 韩信   | 15000.00 | 销售员 |
    | 安琪拉 | 9500.00  | 文员   |
    | 甄姬   | 7500.00  | 文员   |
    | 妲己   | 11000.00 | 文员   |
    | 小乔   | 8000.00  | 文员   |
    | 唐僧   | 50000.00 | 董事长 |
    +--------+----------+--------+
    14 rows in set (0.03 sec)
    
    • 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

    修改视图:

    alter view <视图名称> as select 语句;

    mysql> select * from employ;
    +--------+----------+
    | ename  | sal      |
    +--------+----------+
    | 猪八戒 | 29750.00 |
    | 猴子   | 28500.00 |
    | 张飞   | 24500.00 |
    | 诸葛亮 | 30000.00 |
    | 林俊杰 | 30000.00 |
    | 牛魔王 | 16000.00 |
    | 程咬金 | 12500.00 |
    | 后裔   | 12500.00 |
    | 韩信   | 15000.00 |
    | 安琪拉 | 9500.00  |
    | 甄姬   | 7500.00  |
    | 妲己   | 11000.00 |
    | 小乔   | 8000.00  |
    | 唐僧   | 50000.00 |
    +--------+----------+
    14 rows in set (0.04 sec)
    
    mysql> alter view employ as select ename,sal,job from employee;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> select * from employ;
    +--------+----------+--------+
    | ename  | sal      | job    |
    +--------+----------+--------+
    | 猪八戒 | 29750.00 | 经理   |
    | 猴子   | 28500.00 | 经理   |
    | 张飞   | 24500.00 | 经理   |
    | 诸葛亮 | 30000.00 | 分析师 |
    | 林俊杰 | 30000.00 | 分析师 |
    | 牛魔王 | 16000.00 | 销售员 |
    | 程咬金 | 12500.00 | 销售员 |
    | 后裔   | 12500.00 | 销售员 |
    | 韩信   | 15000.00 | 销售员 |
    | 安琪拉 | 9500.00  | 文员   |
    | 甄姬   | 7500.00  | 文员   |
    | 妲己   | 11000.00 | 文员   |
    | 小乔   | 8000.00  | 文员   |
    | 唐僧   | 50000.00 | 董事长 |
    +--------+----------+--------+
    14 rows in set (0.03 sec)
    
    • 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

    视图删除语法:

    drop view <视图名称> ;

    
    mysql> show tables;
    +----------------+
    | Tables_in_test |
    +----------------+
    | dept           |
    | employ         |
    | employee       |
    | kk             |
    | salgrade       |
    +----------------+
    5 rows in set (0.03 sec)
    
    mysql> drop view employ;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> show tables;
    +----------------+
    | Tables_in_test |
    +----------------+
    | dept           |
    | employee       |
    | kk             |
    | salgrade       |
    +----------------+
    4 rows in set (0.03 sec)
    
    
    • 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

    操作数据:

    (可以对比创建时的表发现唐僧的工资变为了40000)

    mysql> update employ set sal='40000' where ename='唐僧';
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> select * from employee;
    +-------+--------+--------+------+------------+----------+--------+
    | empno | ename  | job    | mgr  | hiredate   | sal      | deptnu |
    +-------+--------+--------+------+------------+----------+--------+
    |  1004 | 猪八戒 | 经理   | 1009 | 2001-04-02 | 29750.00 |     20 |
    |  1006 | 猴子   | 经理   | 1009 | 2011-05-01 | 28500.00 |     30 |
    |  1007 | 张飞   | 经理   | 1009 | 2011-09-01 | 24500.00 |     10 |
    |  1008 | 诸葛亮 | 分析师 | 1004 | 2017-04-19 | 30000.00 |     20 |
    |  1013 | 林俊杰 | 分析师 | 1004 | 2011-12-03 | 30000.00 |     20 |
    |  1002 | 牛魔王 | 销售员 | 1006 | 2018-02-20 | 16000.00 |     30 |
    |  1003 | 程咬金 | 销售员 | 1006 | 2017-02-22 | 12500.00 |     30 |
    |  1005 | 后裔   | 销售员 | 1006 | 2011-09-28 | 12500.00 |     30 |
    |  1010 | 韩信   | 销售员 | 1006 | 2018-09-08 | 15000.00 |     30 |
    |  1012 | 安琪拉 | 文员   | 1006 | 2011-12-03 | 9500.00  |     30 |
    |  1014 | 甄姬   | 文员   | 1007 | 2019-01-23 | 7500.00  |     10 |
    |  1011 | 妲己   | 文员   | 1008 | 2018-05-23 | 11000.00 |     20 |
    |  1001 | 小乔   | 文员   | 1013 | 2018-12-17 | 8000.00  |     20 |
    |  1009 | 唐僧   | 董事长 | NULL | 2010-11-17 | 40000.00 |     10 |
    +-------+--------+--------+------+------------+----------+--------+
    14 rows in set (0.04 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    注意:当我们修改基表时视图也会发生改变

    mysql> select * from employee;
    +-------+--------+--------+------+------------+----------+--------+
    | empno | ename  | job    | mgr  | hiredate   | sal      | deptnu |
    +-------+--------+--------+------+------------+----------+--------+
    |  1004 | 猪八戒 | 经理   | 1009 | 2001-04-02 | 29750.00 |     20 |
    |  1006 | 猴子   | 经理   | 1009 | 2011-05-01 | 28500.00 |     30 |
    |  1007 | 张飞   | 经理   | 1009 | 2011-09-01 | 24500.00 |     10 |
    |  1008 | 诸葛亮 | 分析师 | 1004 | 2017-04-19 | 30000.00 |     20 |
    |  1013 | 林俊杰 | 分析师 | 1004 | 2011-12-03 | 30000.00 |     20 |
    |  1002 | 牛魔王 | 销售员 | 1006 | 2018-02-20 | 16000.00 |     30 |
    |  1003 | 程咬金 | 销售员 | 1006 | 2017-02-22 | 12500.00 |     30 |
    |  1005 | 后裔   | 销售员 | 1006 | 2011-09-28 | 12500.00 |     30 |
    |  1010 | 韩信   | 销售员 | 1006 | 2018-09-08 | 15000.00 |     30 |
    |  1012 | 安琪拉 | 文员   | 1006 | 2011-12-03 | 9500.00  |     30 |
    |  1014 | 甄姬   | 文员   | 1007 | 2019-01-23 | 7500.00  |     10 |
    |  1011 | 妲己   | 文员   | 1008 | 2018-05-23 | 11000.00 |     20 |
    |  1001 | 小乔   | 文员   | 1013 | 2018-12-17 | 8000.00  |     20 |
    |  1009 | 唐僧   | 董事长 | NULL | 2010-11-17 | 40000.00 |     10 |
    +-------+--------+--------+------+------------+----------+--------+
    14 rows in set (0.04 sec)
    
    mysql> update employee set sal='50000' where ename='唐僧';
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> select * from employ;
    +--------+----------+
    | ename  | sal      |
    +--------+----------+
    | 猪八戒 | 29750.00 |
    | 猴子   | 28500.00 |
    | 张飞   | 24500.00 |
    | 诸葛亮 | 30000.00 |
    | 林俊杰 | 30000.00 |
    | 牛魔王 | 16000.00 |
    | 程咬金 | 12500.00 |
    | 后裔   | 12500.00 |
    | 韩信   | 15000.00 |
    | 安琪拉 | 9500.00  |
    | 甄姬   | 7500.00  |
    | 妲己   | 11000.00 |
    | 小乔   | 8000.00  |
    | 唐僧   | 50000.00 |
    +--------+----------+
    14 rows in set (0.04 sec)
    
    • 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

    视图的缺点:

    1)性能差:sql server必须把视图查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么,即使是视图的一个简单查询,sql server也要把它变成一个复杂的结合体,需要花费一定的时间。

    2)修改限制:当用户试图修改试图的某些信息时,数据库必须把它转化为对基本表的某些信息的修改,对于简单的试图来说,这是很方便的,但是,对于比较复杂的试图,可能是不可修改的。

  • 相关阅读:
    JavaWeb之异常处理
    SOME/IP 协议介绍(二)
    有什么手机软件能分离人声和音乐?
    分享丨写在工作13年后,个人的一点软件测试经历及感想……
    修复MybatisX1.4.17版本插件误报@Mapkey is required错误
    【wordPress】WordPress删除index.php后缀【亲测有效】(手把手教学)
    从零开始写 Docker(八)---实现 mydocker run -d 支持后台运行容器
    控制DAIKIN大金比例压力溢流阀放大器
    pthread_create
    一个基于角色的访问控制(RBAC)的简单示例
  • 原文地址:https://blog.csdn.net/weixin_43432438/article/details/124917936