MySQL视图详解:简化复杂查询的利器|转行学DB第11天

本文涉及的产品
RDS DuckDB + QuickBI 企业套餐,8核32GB + QuickBI 专业版
RDSClaw,2核4GB
RDS AI 助手,专业版
简介: 数据库小学妹带你轻松入门视图!视图是“虚拟表”,不存数据,只存SELECT语句,一键封装复杂查询(多表JOIN、聚合等),实现高效复用;还能控制字段暴露、统一数据接口。创建后如普通表使用,简洁安全又省力!

不用每次都写一大段SQL,视图帮你一键复用

大家好呀!我是​数据库小学妹​👋

前几篇我们学会了多表关联、子查询、聚合统计,写出来的SQL越来越长。在学习中我发现,如果遇到高频查询同样的内容,难道每次都要重写一样SQL吗?要如何提高我们的查询效率?

比如:如果有一个复杂的查询(比如JOIN了三张表还有子查询),我每次用都要重新写一遍吗?有没有办法把它“存”起来,下次直接用?

当然有!这就是​视图!​它就像PPT的“母版”功能,创建一次所有幻灯片自动应用;修改母版所有页面同步更新。

一、什么是视图?一张“虚拟表”

视图是一个​虚拟表​,它不存储真实数据,而是存储一个SELECT查询语句。

当我们查询视图时,数据库会执行这个查询并返回结果。

💡 把视图想象成​已经设置好筛选和计算的Excel“高级筛选”视图​。每次打开它,看到的是最新的原始数据,但你不用重复设置条件。

举个例子:

你经常要查“每个学生的姓名、班级、成绩、科目”。这需要JOIN学生表和成绩表。你可以把这个JOIN查询存成一个视图,以后直接 SELECT * FROM 学生成绩视图 就行。

二、视图怎么创建和使用?

1. 创建视图

CREATE VIEW 学生成绩视图 AS
SELECT 
    s.name,
    c.class_name,
    sc.subject,
    sc.score
FROM students s
INNER JOIN classes c ON s.class_id = c.id
INNER JOIN scores sc ON s.id = sc.student_id;
  • CREATE VIEW 视图名 AS 后面跟你的复杂查询
  • 视图名建议有意义,比如 学生成绩视图

2. 使用视图

SELECT * FROM 学生成绩视图 WHERE score > 90;

就像操作普通表一样,可以加 WHEREORDER BYGROUP BY

3. 查看所有视图

SHOW FULL TABLES WHERE TABLE_TYPE = 'VIEW';

4. 删除视图

DROP VIEW 学生成绩视图;

5. 修改视图

CREATE OR REPLACE VIEW 学生成绩视图 AS
-- 新的查询

三、视图的三大常见使用场景

🎯 场景1:简化复杂查询

-- 创建销售报表视图
CREATE VIEW sales_report AS
SELECT 
    c.name as customer_name,
    c.email,
    COUNT(o.id) as order_count,
    SUM(o.amount) as total_sales,
    AVG(o.amount) as avg_order_amount,
    MAX(o.order_date) as last_order_date
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
GROUP BY c.id, c.name, c.email;
-- 使用视图(超简单!)
SELECT * FROM sales_report WHERE total_sales > 5000;

🎯 场景2:数据安全(只暴露需要的字段)

-- 创建员工信息视图(隐藏敏感信息)
CREATE VIEW employee_public_info AS
SELECT 
    id,
    name,
    department,
    position,
    -- 不暴露:salary, phone, address等敏感字段
    email
FROM employees;
-- 其他人只能看到公开信息
SELECT * FROM employee_public_info;

🎯 场景3:统一查询接口

-- 创建活跃用户视图
CREATE VIEW active_users AS
SELECT 
    u.id,
    u.username,
    u.email,
    COUNT(o.id) as order_count,
    MAX(o.order_date) as last_order_date
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE u.status = 'active'
GROUP BY u.id, u.username, u.email
HAVING COUNT(o.id) > 0;
-- 团队所有人都用这个视图
SELECT * FROM active_users WHERE order_count > 5;

四、视图的核心特点

✅ 视图的优点

  • 简化复杂查询:将多表关联、聚合等封装成简单查询;
  • 数据安全:只暴露需要的字段,隐藏敏感信息
  • 查询重用:一次创建,多次使用
  • 逻辑独立:底层表结构变化,视图可以保持不变
  • 统一接口:为不同用户提供统一的数据视图

⚠️ 视图的限制

  • 不存储数据:视图是虚拟表,查询时才执行
  • 更新限制:不是所有视图都能更新
  • 依赖底层表:底层表删除,视图失效

五、视图 vs 表的区别?

11-1.jpg

💡 视图可更新的条件: 基于单表、没有聚合函数、无GROUP BY、无DISTINCT、无子查询等,通常是可以更新的。​复杂视图​(多表JOIN、有聚合)通常是只读的。

新手阶段,把视图当“只读的查询快捷方式用”​,只做SELECT,别想着通过视图改数据,避免踩坑。

✅ 可以更新的视图

-- 创建简单视图
CREATE VIEW customer_emails AS
SELECT id, name, email FROM customers;
-- 可以更新
UPDATE customer_emails 
SET email = 'newemail@email.com' 
WHERE id = 1;
-- 验证更新
SELECT * FROM customers WHERE id = 1;

❌ 不能更新的视图

-- 包含聚合函数的视图(不能更新)
CREATE VIEW customer_stats AS
SELECT 
    name,
    COUNT(*) as order_count,
    SUM(amount) as total_amount
FROM customers c
LEFT JOIN orders o ON c.id = o.customer_id
GROUP BY c.id, c.name;
-- 尝试更新会报错
UPDATE customer_stats SET total_amount = 10000 WHERE name = '张三';
-- ERROR: 视图不可更新

六、新手避坑指南(血泪总结)

11-2.png

七、今日学习心得

今天的内容总结成三句话:

  1. 视图是保存的SQL​​查询​,不存数据,像一张“虚拟表”
  2. 主要用于简化复杂查询​、权限控制、兼容旧结构
  3. 视图不是表​,更新有限制,性能可能不如直接查

👋 我是​数据库小学妹​,一个从设计转行数据库的菜鸟。我们一起,把复杂的技术变得简单有趣!💕


本文为个人学习总结,所有命令均在MySQL​ 8.0环境下验证。视图是提高生产力的好工具,但也别滥用,尤其是多层嵌套。

相关文章
|
15天前
|
人工智能 数据可视化 安全
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
本文详解如何用阿里云Lighthouse一键部署OpenClaw,结合飞书CLI等工具,让AI真正“动手”——自动群发、生成科研日报、整理知识库。核心理念:未来软件应为AI而生,CLI即AI的“手脚”,实现高效、安全、可控的智能自动化。
34799 40
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
|
9天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
9931 30
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
|
4天前
|
人工智能 JavaScript Ubuntu
低成本搭建AIP自动化写作系统:Hermes保姆级使用教程,长文和逐步实操贴图
我带着怀疑的态度,深度使用了几天,聚焦微信公众号AIP自动化写作场景,写出来的几篇文章,几乎没有什么修改,至少合乎我本人的意愿,而且排版风格,也越来越完善,同样是起码过得了我自己这一关。 这个其实OpenClaw早可以实现了,但是目前我觉得最大的区别是,Hermes会自主总结提炼,并更新你的写作技能。 相信就冲这一点,就值得一试。 这篇帖子主要就Hermes部署使用,作一个非常详细的介绍,几乎一步一贴图。 关于Hermes,无论你赞成哪种声音,我希望都是你自己动手行动过,发自内心的选择!
1973 21
|
26天前
|
人工智能 JSON 机器人
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
本文带你零成本玩转OpenClaw:学生认证白嫖6个月阿里云服务器,手把手配置飞书机器人、接入免费/高性价比AI模型(NVIDIA/通义),并打造微信公众号“全自动分身”——实时抓热榜、AI选题拆解、一键发布草稿,5分钟完成热点→文章全流程!
45684 155
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
|
2天前
|
人工智能 自然语言处理 安全
|
9天前
|
机器学习/深度学习 存储 人工智能
还在手写Skill?hermes-agent 让 Agent 自己进化能力
Hermes-agent 是 GitHub 23k+ Star 的开源项目,突破传统 Agent 依赖人工编写Aegnt Skill 的瓶颈,首创“自我进化”机制:通过失败→反思→自动生成技能→持续优化的闭环,让 Agent 在实践中自主构建、更新技能库,持续自我改进。
1625 5
|
16天前
|
人工智能 JSON 监控
Claude Code 源码泄露:一份价值亿元的 AI 工程公开课
我以为顶级 AI 产品的护城河是模型。读完这 51.2 万行泄露的源码,我发现自己错了。
5776 26
|
6天前
|
IDE Java 编译器
【全网最详细】JDK17下载安装图文教程 | Java17编程环境搭建步骤详解
JDK 17是Java官方长期支持(LTS)版本,提供编译、调试、运行Java程序的完整工具链。具备高稳定性、强安全性及现代语言特性(如密封类、模式匹配),广泛用于企业开发、教学入门与生产环境,是学习和实践Java的首选基础工具。(239字)
1163 15
下一篇
开通oss服务