前言
视图(View)是从一个表或多个表中导出的一种虚拟存在的表,对于使用视图的用户来跟使用正常的数据表一样操作。视图并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的
需求描述:
在看MySQL的视图,对于视图的定义,进行基本的了解,在此记录下.
概念解释:
视图:存储的查询语句,当调用的时候,产生结果集,视图充当的是虚拟表的角色
测试过程:
说明:
如果要对一张表或者多张表进行查询,可以通过写复杂的SQL语句来实现
如果要这些SQL语句存储为视图,那么查询的时候,就直接查询这个视图就可以了.
一丶视图的优势
1.简化查询:使用视图的用户不需要关心视图对应的表的结构、关联条件和筛选条件,只管使用已经过滤好的复合条件的结果集就好。
2.安全作用:数据库中的权限设计,并不能限制访问某一行、某一列,通过使用视图,我们能做到让用户仅能访问他们被允许查询的记录数据
3.逻辑独立性:视图的来源表添加新列对视图没有影响;假如必须修改来源表的列名,我们可以修改视图来解决。这样我们的应用程序代码可以不做处理,正常运行
二、视图的使用场景
1.经常查询的一部分数据,抽象了有时非常复杂的查询细节
2.运营人员需要经常关注最新的推广数据,而这部分数据的获取需要关联很多张表
计算列的需要,数据库设计范式要求我们减少冗余字段,因此现在很多数据表都没有计算列字段,如采购单:有价格、数量、税率、含税金额,多半没有不含税金额、税额,而这些字段在很多报表中有都会用到,所以我们可以创建一个含有计算列字段的视图来解决这个问题
3.公司的人事系统给外包公司新增功能,但是不能暴露敏感数据,比如薪资、人事家庭地址
三、具体实例
1.创建表,插入数据,并且执行查询
mysql> CREATE TABLE t (qty INT, price INT);
Query OK, 0 rows affected (0.09 sec)
mysql> INSERT INTO t VALUES(3, 50), (5, 60);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM t;
+------+-------+
| qty | price |
+------+-------+
| 3 | 50 |
| 5 | 60 |
+------+-------+
2 rows in set (0.00 sec)
2.创建视图,视图中的查询根据具体的情况有相应的表达式
mysql> CREATE VIEW v AS SELECT qty, price, qty*price AS value FROM t;
Query OK, 0 rows affected (0.01 sec)
3.查询视图
mysql> SELECT * FROM v;
+------+-------+-------+
| qty | price | value |
+------+-------+-------+
| 3 | 50 | 150 |
| 5 | 60 | 300 |
+------+-------+-------+
2 rows in set (0.00 sec)
对于视图的查询也可以加上过滤条件:
mysql> SELECT * FROM v WHERE qty = 5;
+------+-------+-------+
| qty | price | value |
+------+-------+-------+
| 5 | 60 | 300 |
+------+-------+-------+
1 row in set (0.00 sec)
备注:所以仅仅查询这个视图,和执行定义语句中的SQL语句的效果相同.即就相当于查询了一张表.同时,视图也就等同于后面的查询语句,视图是存储在数据库中的,所以就理解了开头说的存储的查询.
4.查看当前库下所有的视图
mysql> show full tables where table_type like 'VIEW';
+----------------+------------+
| Tables_in_test | Table_type |
+----------------+------------+
| v | VIEW |
| vw_01 | VIEW |
+----------------+------------+
2 rows in set (0.00 sec)
5.基于其他的视图来创建视图
mysql> select * from vw_01; #vw_01是一个视图.
+---+------+
| a | b |
+---+------+
| 1 | NULL |
| 2 | NULL |
| 3 | NULL |
| 4 | NULL |
+---+------+
4 rows in set (0.00 sec)
mysql> create view v01 as select a,b from vw_01; #基于视图来创建视图,也就是说,视图定义中的SELECT查询的是另外的视图.
Query OK, 0 rows affected (0.02 sec)
mysql> select * from v01;
+---+------+
| a | b |
+---+------+
| 1 | NULL |
| 2 | NULL |
| 3 | NULL |
| 4 | NULL |
+---+------+
4 rows in set (0.00 sec)