什么是数据库视图
视图是由从数据库的表中选出来的数据组成的逻辑窗口,它与表不同的是,视图是一个虚表。
数据库只存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。所以基本表中的数据发生变化,从视图中查询出的数据也就随之改变了。从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中自己感兴趣的数据及其变化。
视图中的数据行和列都是来自于基本表,是在视图被引用时动态生成的,每次select from 某个视图的时候,都会先执行一遍视图中定义的查询。
使用视图可以集中、简化和制定用户的数据库显示,用户可以通过视图来访问数据,而不必直接去访问该视图的基本表。
视图的应用
- 重用SQL语句
- 简化复杂的SQL操作。在编写查询后,可以方便地重用它而不必知道它的基本查询细节
- 使用表的组成部分而不是整个表
- 保护数据。可以给用户授权表的特定部分的访问权限而不是整个表的访问权限
- 更改数据格式和表示。视图可返回与底层表的表示和格式不同的数据
视图的分类
普通视图
特点:普通视图是基于 SELECT 查询创建的逻辑视图,不存储数据,而是在查询时动态执行原始 SQL。
适用场景:
简化复杂的查询语句
复用 SQL 逻辑
为用户提供安全的只读数据接口(通过限制权限)
CREATE VIEW employee_info AS
SELECT e.employee_id, e.name, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id;
可更新视图
特点:MySQL 中某些视图是可更新的,意味着你可以通过视图更新底层的基础表。可更新视图的基本条件是视图直接映射到基础表,而不涉及聚合、分组、子查询等复杂查询。
适用场景:
简化操作时直接通过视图更新、插入或删除数据
提供更简洁的接口用于对基础表的数据操作
CREATE VIEW basic_employee_info AS
SELECT employee_id, name, salary
FROM employees;
UPDATE basic_employee_info
SET salary = salary * 1.1
WHERE employee_id = 101;
只读视图
特点:如果视图不能满足更新条件或被明确定义为只读,那么该视图就是只读视图,不能通过它对基础表进行增删改操作。
适用场景:
提供安全的、不可更改的数据视图
避免用户无意中修改数据
CREATE VIEW department_stats AS
SELECT department_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id;
这是一个只读视图,不能用于修改 employees 表中的数据。
物化视图
特点:物化视图不同于普通视图,它不仅是查询的结果,还会将数据存储起来。物化视图在查询时不需要重新执行 SQL,而是直接访问存储的数据。MySQL 目前不原生支持物化视图,但可以通过手动维护或借助外部工具来模拟。
适用场景:
对于需要频繁查询且数据变化不频繁的场景,物化视图可以显著提高查询性能
在数据量特别大或查询非常复杂的情况下,避免每次查询时重新计算
模拟物化视图的方案:
可以通过定时任务或触发器,将查询结果定期存入表中。
CREATE TABLE department_stats AS
SELECT department_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id;
-- 每日定时更新数据
INSERT INTO department_stats
SELECT department_id, COUNT(*) AS employee_count
FROM employees
GROUP BY department_id;
视图的优缺点
优点
数据安全性
对不同的用户定义不同的视图,使用户只能看到与自己有关的数据。通过使用视图,可以限制用户对底层表的直接访问,只允许他们访问视图中定义的数据子集。这提供了一种机制来实现数据安全性和访问控制。
简化查询、代码复用
为复杂的查询建立一个视图,用户不必输入复杂的查询语句,只需针对此视图做简单的查询即可。那些被经常使用的查询可以被定义为视图,从而使用户不必为以后的操作每次都指定全部的条件。
逻辑独立性、数据抽象
视图可以使应用程序和数据库表在一定程度上独立。程序可以建立在视图之上,从而程序与数据库表被视图分割开来。当构成视图的基本表需要修改时,只需要修改视图定义的部分,而基于视图的查询不用改变。
缺点
性能:查询的时候得把视图的查询转化成对基本表的查询。
修改限制:当用户试图修改视图的某些行时,得把它转化为对基本表的某些行的修改,而且有些还是不能修改的。
创建视图的限制:定义视图的查询中不能含有ORDER BY\COMPURER\COMPUTER BY 子句和INTO关键字。