数据库视图讲解(view)

一、为什么需要视图

二、视图的讲解

三、总结


一、为什么需要视图

视图一方面可以帮我们使用表的一部分而不是所有的表,另一方面也可以针对不同的用户制定不同的查询视图。

比如,针对一个公司的销售人员,我们只想给他看部分数据,而某些特殊的数据,比如采购的价格,则不会提供给他。

再比如,人员薪酬是个敏感的字段,那么只给某个级别以上的人员开放,其他人的查询视图中则不提供这个字段。

刚才讲的只是视图的一个使用场景,实际上视图还有很多作用。

二、视图的讲解

2.1 视图的核心概念

  • 定义:

视图(View)是数据库中的一种虚拟表,基于一个或多个基表的 SQL 查询结果集 动态生成数据。它本身不存储数据,而是实时从基表中提取数据。

  • 特点:

动态性:每次查询视图时,都会执行其背后的 SQL 语句。

逻辑抽象:隐藏底层表的复杂性,提供简化的接口。

安全性:通过权限控制限制用户直接访问敏感数据。

2.2. 视图的作用

(1) 简化复杂查询

将多表 JOIN、聚合计算、子查询等复杂逻辑封装成视图,用户可直接查询视图,无需重复编写复杂 SQL。

sql 复制代码
-- 创建一个统计各部门平均工资的视图
CREATE VIEW dept_avg_salary AS
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id;
(2) 数据安全性

通过视图限制用户访问基表的特定列或行。

sql 复制代码
-- 创建一个只显示员工姓名和部门的视图(隐藏薪资信息)
CREATE VIEW employee_info AS
SELECT name, department_id
FROM employees;

(3) 逻辑独立性

当基表结构变更时(如字段重命名或删除),可通过修改视图减少对应用程序的影响。

(4) 重用 SQL 逻辑

将常用的查询逻辑封装为视图,供多个业务场景复用。

2.3. 视图的分类

2.4. 创建与管理视图的语法

(1) 创建视图

sql 复制代码
CREATE [OR REPLACE] VIEW view_name AS
SELECT column1, column2, ...
FROM base_table
WHERE condition;

(2) 查询视图

sql 复制代码
SELECT * FROM view_name;

(3) 修改视图

  • 直接使用 CREATE OR REPLACE VIEW 覆盖原有定义。
  • 部分数据库支持 ALTER VIEW 语法。

(4) 删除视图

sql 复制代码
DROP VIEW view_name;

2.5. 使用场景

  • 数据汇总:生成部门统计、销售报表等聚合视图。
  • 字段过滤:隐藏敏感字段(如密码、薪资)。
  • 简化 JOIN:预定义多表关联逻辑,降低查询复杂度。
  • 兼容性适配:屏蔽底层表结构变更对业务的影响。

2.6 . 示例:综合应用

场景:统计订单总额并按地区分组

sql 复制代码
-- 创建基表
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    region VARCHAR(50),
    amount DECIMAL(10, 2)
);

-- 插入示例数据
INSERT INTO orders VALUES (1, 'North', 100.00), (2, 'South', 200.00);

-- 创建视图
CREATE VIEW region_sales AS
SELECT region, SUM(amount) AS total_sales
FROM orders
GROUP BY region;

-- 查询视图
SELECT * FROM region_sales;

2.7. 不同数据库的视图特性

三、总结

视图优点

1. 操作简单

将经常使用的查询操作定义为视图,可以使开发人员不需要关心视图对应的数据表的结构、表与表之间的关联关系,也不需要关心数据表之间的业务逻辑和查询条件,而只需要简单地操作视图即可,极大简化了开发人员对数据库的操作。

2. 减少数据冗余

视图跟实际数据表不一样,它存储的是查询语句。所以,在使用的时候,我们要通过定义视图的查询语句来获取结果集。而视图本身不存储数据,不占用数据存储的资源,减少了数据冗余。

3. 数据安全

MySQL将用户对数据的访问限制在某些数据的结果集上,而这些数据的结果集可以使用视图来实现。用户不必直接查询或操作数据表。这也可以理解为视图具有隔离性。视图相当于在用户和实际的数据表之间加了一层虚拟表。

同时,MySQL可以根据权限将用户对数据的访问限制在某些视图上, 用户不需要查询数据表,可以直接通过视图获取数据表中的信息 。这在一定程度上保障了数据表中数据的安全性。

4. 适应灵活多变的需求

当业务系统的需求发生变化后,如果需要改动数据表的结构,则工作量相对较大,可以使用视图来减少改动的工作量。这种方式在实际工作中使用得比较多。

5. 能够分解复杂的查询逻辑

数据库中如果存在复杂的查询逻辑,则可以将问题进行分解,创建多个视图获取数据,再将创建的多个视图结合起来,完成复杂的查询逻辑。

视图不足

如果我们在实际数据表的基础上创建了视图,那么, 如**果实际数据表的结构变更了,我们就需要及时对相关的视图进行相应的维护 。**特别是嵌套的视图(就是在视图的基础上创建视图),维护会变得比较复杂,可读性不好,容易变成系统的潜在隐患。因为创建视图的 SQL 查询可能会对字段重命名,也可能包含复杂的逻辑,这些都会增加维护的成本。

实际项目中,如果视图过多,会导致数据库维护成本的问题。

相关推荐
不羁。。2 小时前
【撸靶笔记】第七关:GET - Dump into outfile - String
数据库·笔记·oracle
yangchanghua1114 小时前
pgsql 如何查询今天范围内的数据(当天0点0分0秒 - 当天23点59分59秒....)
数据库·pgsql
larance4 小时前
SQLAlchemy 的异步操作来批量保存对象列表
数据库·python
python_chai4 小时前
从数据汇总到高级分析,SQL 查询进阶实战(下篇)—— 分组、子查询与窗口函数全攻略
数据库·sql·mysql
在努力的前端小白4 小时前
Spring Boot 敏感词过滤组件实现:基于DFA算法的高效敏感词检测与替换
java·数据库·spring boot·文本处理·敏感词过滤·dfa算法·组件开发
未来之窗软件服务4 小时前
自建知识库,向量数据库 (九)之 量化前奏分词服务——仙盟创梦IDE
数据库·仙盟创梦ide·东方仙盟·自建ai·ai分词
冒泡的肥皂7 小时前
MVCC初学demo(一
数据库·后端·mysql
.Shu.8 小时前
Redis Reactor 模型详解【基本架构、事件循环机制、结合源码详细追踪读写请求从客户端连接到命令执行的完整流程】
数据库·redis·架构
yatingliu20199 小时前
HiveQL | 个人学习笔记
hive·笔记·sql·学习
薛晓刚11 小时前
当MySQL的int不够用了
数据库