Node系列 · 数据库:视图

发布时间:2026/10/16 22:26:10

Node系列 · 数据库:视图 Node系列 · 数据库视图视图View是虚拟表——查询时按定义动态生成结果不存储实际数据。视图能简化复杂 JOIN、控制数据访问权限、抽象业务规则——但性能与可维护性有 trade-off需要明确何时该用、何时该拆。一、什么是视图视图是包装好的 SELECT 语句对外表现像一张表-- 创建一个视图学生 班级 综合成绩 CREATE VIEW v_student_score AS SELECT s.id AS student_id, s.name AS student_name, s.class_id AS class_id, c.name AS class_name, sc.subject, sc.score FROM student s JOIN class c ON c.id s.class_id JOIN score sc ON sc.student_id s.id;之后可以像查表一样查视图SELECT*FROMv_student_scoreWHEREclass_name高三一班;::: info视图不存储数据。每次查视图MySQL 都会执行它背后的 SELECT 语句。数据始终在原表里。:::二、视图的核心作用2.1 简化复杂查询把多表 JOIN、聚合、过滤封装成视图业务代码直接SELECT * FROM v_xxx-- 没有视图每次都要写完整 JOIN SELECT s.name, SUM(sc.score) AS total FROM student s JOIN score sc ON sc.student_id s.id WHERE s.class_id 3 GROUP BY s.id; -- 有视图业务代码只关心简单查询 SELECT student_name, SUM(score) AS total FROM v_student_score WHERE class_id 3 GROUP BY student_id;2.2 数据权限隔离让不同角色看到不同字段-- 给运营看的视图脱敏手机号 CREATE VIEW v_student_for_ops AS SELECT s.id, s.name, s.class_id, CONCAT(LEFT(s.phone, 3), ****, RIGHT(s.phone, 4)) AS phone_masked FROM student s; -- 运营账号只有 v_student_for_ops 的权限看不到真实手机号2.3 抽象业务规则“近 30 天活跃用户” 这种业务口径经常变。封装成视图调用方不感知CREATE VIEW v_active_users_30d AS SELECT DISTINCT user_id FROM login_log WHERE created_at DATE_SUB(NOW(), INTERVAL 30 DAY);三、创建与管理视图3.1 创建CREATEVIEWv_xxxASSELECT...;3.2 替换已有视图CREATEORREPLACEVIEWv_xxxASSELECT...;3.3 删除DROPVIEWIFEXISTSv_xxx;3.4 查看视图定义SHOWCREATEVIEWv_xxx;四、视图的限制4.1 视图不一定能更新视图背后是 SELECT有些视图是只读的不能INSERT/UPDATE/DELETE视图定义是否可更新单表、无聚合、无 DISTINCT、无 GROUP BY✅ 可更新多表 JOIN❌ 不可更新含聚合函数COUNT/SUM❌ 不可更新含DISTINCT/GROUP BY/HAVING❌ 不可更新含UNION❌ 不可更新子查询引用FROM的表❌ 不可更新::: warningMySQL 允许看似可更新的视图背后静默失败——比如INSERT INTO v_xxx没报错但实际没生效。生产环境对视图的写操作要谨慎最好绕过视图直接改原表。:::4.2 视图性能不一定好每次查视图都执行一次底层 SELECT。如果视图背后 JOIN 了 5 张表又没建索引比直接写 JOIN 更慢。EXPLAINSELECT*FROMv_student_scoreWHEREclass_name高三一班;-- typeALL rows100 万 → 全表扫描性能差优化方法给底层表的关键字段建索引视图里加WHERE条件过滤用物化视图MySQL 不支持但可以定时 INSERT INTO 一张真实表4.3 视图嵌套有上限MySQL 视图嵌套层数有上限默认不高复杂业务不要套太多层。五、视图 vs 临时表 vs 子查询维度视图临时表子查询存储不存储虚拟存储在内存 / 磁盘不存储复用多查询可复用会话内复用单查询内索引不能加索引能加索引不能适用稳定抽象层复杂中间计算一次性查询-- 视图稳定抽象全局可复用 CREATE VIEW v_top_students AS SELECT student_id, AVG(score) AS avg_score FROM score GROUP BY student_id HAVING avg_score 90; -- 临时表会话内的中间结果可建索引 CREATE TEMPORARY TABLE tmp_score AS SELECT student_id, AVG(score) AS avg_score FROM score GROUP BY student_id; ALTER TABLE tmp_score ADD INDEX idx_avg (avg_score); -- 子查询一次性 SELECT * FROM ( SELECT student_id, AVG(score) AS avg_score FROM score GROUP BY student_id ) t WHERE avg_score 90;六、Node 端使用视图视图对应用层是透明的——当表用const mysql require(mysql2/promise); // 视图对 Node 来说就是一张普通表 const [rows] await pool.execute( SELECT * FROM v_student_score WHERE class_id ? ORDER BY score DESC LIMIT 10, [3] );七、何时用视图✅适合用复杂 JOIN 的复用不同业务都要查同一份数据权限隔离不同角色看不同字段业务口径封装活跃用户等❌不适合性能关键的查询视图不能加索引复杂视图性能差频繁变更的业务逻辑改视图定义比改应用代码麻烦多层嵌套层数多难调试八、小结视图 包装好的 SELECT对外是虚拟表不存储数据三大作用简化查询 / 权限隔离 / 抽象业务规则多表 JOIN、聚合、DISTINCT 视图不能更新视图性能 底层 SELECT 性能复杂视图要靠索引优化与临时表 / 子查询的取舍视图是稳定抽象层临时表是会话中间计算子查询是一次性
延伸阅读

更多相关文章

2026/10/16 18:32:07

Grok Bot 技术架构拆解:四个支柱撑起一个会干活的AI队友

上一篇我聊了 Grok Bot 的定位——「拥有自己云电脑的 AI 队友」。很多人看完追问:它到底是怎么做到的?为什么别的 AI 还停在「问答」,它已经能「执行」了? 这篇不谈营销话术,只拆技术架构。把 Grok Bot 拆开看&#…

2026/10/17 18:25:55

Java Swing生日礼物开发:粒子动画与音频同步实战

简介:这是一份面向Java初学者与浪漫程序员的创意实践项目资源,用代码为心爱之人定制专属生日礼物。项目融合音乐播放、蛋糕动画、飘落爱心、玫瑰绘制与个性化文字(如GMY缩写)等交互元素,完整呈现了Java Sound API、Swi…

2026/10/17 18:25:55

蓝桥杯U10计算思维真题解析:六类模型与三阶段刷题法

简介:本资源为十四届蓝桥杯国赛计算思维 U10 组真题与答案合集,面向备战蓝桥杯国赛、训练计算思维的中小学生及指导教师,可用于赛前模拟、真题复盘与思维专项提升。包内共 1 个 pdf 文件,压缩包约 1.04MB,内容以完整赛…

2026/10/17 18:25:55

从零实现安全通信协议:对称与非对称加密、密钥交换及防重放实战

1. 安全协议到底在解决什么问题1.1 从一个真实踩坑案例说起去年帮一个做物联网设备的朋友排查问题,他们的设备在出厂测试阶段一切正常,到了客户现场却频繁出现指令被篡改的情况。抓包一看,设备与网关之间的通信完全是明文传输,任何…

2026/10/17 18:25:55

Unity安卓串口通信实战:USB Host桥接实现手机直连单片机

简介:一份面向 Unity 开发者的安卓串口收发代码包,用于解决 Unity 应用与 Arduino、树莓派等外部硬件设备的数据交互问题。压缩包共 30 个文件,大小约 124KB,包含 JNI 桥接相关的 C/C 源文件(.c/.h)、Andro…

2026/10/17 18:25:55

LiteVGGT实测:轻量Transformer实现10倍加速视觉定位与三维重建

做视觉定位和三维重建的朋友,这两年应该没少被VGGT刷屏。它把多视角图像的相机位姿估计、内参预测和3D点生成全部塞进一个端到端Transformer,一个前向网络跑完,场景结构直接出来,省掉了特征匹配、RANSAC、全局优化这一整套传统SfM…

2026/10/16 5:33:43

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/16 4:03:48

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/17 14:20:58

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/17 0:04:32

PlanarSLAM:面向曼哈顿世界的点线面联合SLAM系统

简介:本资源是面向机器人视觉与SLAM研究者的C开源RGB-D SLAM系统实现,专为结构化室内场景(如办公室、走廊)设计,通过融合点、线、平面三类几何特征并引入“曼哈顿世界”假设,显著提升位姿跟踪鲁棒性与稠密地…

2026/10/17 0:04:32

TDH Workflow调度实战:从DAG依赖驱动到任务编排与故障排查

1. 从一个调度脚本说起:TDH Workflow到底在解决什么问题第一次接触TDH的Workflow,是在一个数据清洗项目里。当时团队每天要跑几十个ETL任务,任务之间有严格的先后依赖——A表清洗完才能跑B表的关联,B表跑完才能触发C表的聚合。最开…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑