视图介绍
视图(View)是数据库中的一个虚拟表,它是基于一个或多个实际表的查询结果集。视图可以被视为一个逻辑表,它不存储实际的数据,而是根据定义的查询条件和规则在查询时动态生成结果。
视图提供了一种封装和抽象数据的方式,它可以隐藏底层表结构和复杂的查询逻辑,简化对数据的访问和操作。通过创建视图,可以将多个表的数据整合为一个逻辑视图,使得数据的访问更加方便和直观。
视图可以用于以下目的:
-
简化数据访问:通过视图可以隐藏底层表的复杂性,用户只需关注视图的结构和数据,而无需了解底层表的细节。
-
数据安全性控制:通过视图可以限制用户对数据的访问权限,只暴露特定的数据列或行,保护敏感数据的安全性。
-
数据模型的逻辑设计:通过创建视图可以对数据进行逻辑组织和重组,更好地满足应用程序的需求,简化数据模型的设计。
-
数据重用:通过视图可以将常用的查询逻辑封装为视图,方便其他查询或报表的复用。
视图的数据是基于其定义的查询规则和底层表的数据进行计算得出的。对视图的查询和操作实际上是对底层表的查询和操作。
视图创建删除
要创建视图,可以使用 CREATE VIEW
语句。
语法:
CREATE VIEW view_name AS
SELECT 语句...;
要删除视图,可以使用 DROP VIEW
语句。
语法:
DROP VIEW view_name;
例
以 scott 数据库为例,创建一个工资大于2000的员工的视图
create view hotdata as
select ename, job
from emp
where sal > 2000;
MariaDB [scott]> create view hotdata as -- 创建视图
-> select ename, job
-> from emp
-> where sal > 2000;
Query OK, 0 rows affected (0.01 sec)
MariaDB [scott]> show tables;
+-----------------+
| Tables_in_scott |
+-----------------+
| dept |
| emp |
| hotdata |
| salgrade |
+-----------------+
4 rows in set (0.00 sec)
MariaDB [scott]> select * from hotdata; -- 查看视图的内容
+-------+-----------+
| ename | job |
+-------+-----------+
| JONES | MANAGER |
| BLAKE | MANAGER |
| CLARK | MANAGER |
| SCOTT | ANALYST |
| KING | PRESIDENT |
| FORD | ANALYST |
+-------+-----------+
6 rows in set (0.00 sec)
修改视图数据
将视图中的员工名 JONES 改成小写
MariaDB [scott]> update hotdata set ename='jones' where ename='JONES';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
MariaDB [scott]> select * from hotdata;
+-------+-----------+
| ename | job |
+-------+-----------+
| jones | MANAGER |
| BLAKE | MANAGER |
| CLARK | MANAGER |
| SCOTT | ANALYST |
| KING | PRESIDENT |
| FORD | ANALYST |
+-------+-----------+
6 rows in set (0.00 sec)
MariaDB [scott]> select * from emp;
+--------+--------+-----------+------+---------------------+---------+---------+--------+
| empno | ename | job | mgr | hiredate | sal | comm | deptno |
+--------+--------+-----------+------+---------------------+---------+---------+--------+
| 007369 | SMITH | CLERK | 7902 | 1980-12-17 00:00:00 | 800.00 | NULL | 20 |
| 007499 | ALLEN | SALESMAN | 7698 | 1981-02-20 00:00:00 | 1600.00 | 300.00 | 30 |
| 007521 | WARD | SALESMAN | 7698 | 1981-02-22 00:00:00 | 1250.00 | 500.00 | 30 |
| 007566 | jones | MANAGER | 7839 | 1981-04-02 00:00:00 | 2975.00 | NULL | 20 |
| 007654 | MARTIN | SALESMAN | 7698 | 1981-09-28 00:00:00 | 1250.00 | 1400.00 | 30 |
| 007698 | BLAKE | MANAGER | 7839 | 1981-05-01 00:00:00 | 2850.00 | NULL | 30 |
| 007782 | CLARK | MANAGER | 7839 | 1981-06-09 00:00:00 | 2450.00 | NULL | 10 |
| 007788 | SCOTT | ANALYST | 7566 | 1987-04-19 00:00:00 | 3000.00 | NULL | 20 |
| 007839 | KING | PRESIDENT | NULL | 1981-11-17 00:00:00 | 5000.00 | NULL | 10 |
| 007844 | TURNER | SALESMAN | 7698 | 1981-09-08 00:00:00 | 1500.00 | 0.00 | 30 |
| 007876 | ADAMS | CLERK | 7788 | 1987-05-23 00:00:00 | 1100.00 | NULL | 20 |
| 007900 | JAMES | CLERK | 7698 | 1981-12-03 00:00:00 | 950.00 | NULL | 30 |
| 007902 | FORD | ANALYST | 7566 | 1981-12-03 00:00:00 | 3000.00 | NULL | 20 |
| 007934 | MILLER | CLERK | 7782 | 1982-01-23 00:00:00 | 1300.00 | NULL | 10 |
+--------+--------+-----------+------+---------------------+---------+---------+--------+
14 rows in set (0.00 sec)
我们发现,视图和基表的数据都成功修改了
同样的,改变基表的数据,视图也会跟着修改。
视图插入数据
对视图进行插入数据操作是有条件的。一般情况下,对视图进行插入数据是不允许的,因为视图是基于一个或多个底层表的查询结果集,它不具备直接存储数据的能力。
然而,有一些特殊情况下可以对视图进行插入操作,需要满足以下条件:
- 视图必须只包含一个底层表。即视图是直接基于单个表而不是多个表的联接结果。
- 视图的定义必须包含插入操作所需的必要列,即包含所有非空、非计算字段。
- 视图的定义不能包含以下情况:
- 聚合函数(如SUM、AVG等)
- DISTINCT 关键字
- GROUP BY 子句
- UNION 或 UNION ALL 操作符
注意,对视图进行插入操作时,实际上是对底层表进行插入操作,而不是直接向视图插入数据。因此,视图的插入操作可能会受到底层表定义的约束和触发器的限制。
视图的规则和限制
在使用视图时,有一些规则和限制需要注意:
- 视图的查询规则必须是有效的SQL语句,包括正确的SELECT语句、表达式、函数等。
- 视图的定义可能会受到底层表的约束和触发器的限制。例如,如果视图的定义包含了底层表的唯一性约束,那么在插入数据时必须遵守该约束。
- 视图的更新操作受限制。一般情况下,对视图进行插入、更新、删除操作是不允许的,特别是当视图是基于多个表的联接查询结果时。
- 视图可以嵌套使用,即在一个视图的定义中引用另一个视图。
- 视图的权限控制与底层表类似。用户必须具有足够的权限才能查询或操作视图数据。
- 视图不能添加索引,也不能有关联的触发器或者默认值
- 视图可以和表一起使用