SQL 进阶:让查询更强大
SQL 进阶让查询更强大一句话总结SQL 进阶的核心是多表连接JOIN把分散的数据拼起来用聚合函数COUNT/SUM/AVG/MAX/MIN做统计用 GROUP BY 做分组汇总用子查询和视图让复杂查询变得优雅可复用。一、为什么需要进阶 SQL上一篇学会了单表查询但真实世界的数据分散在多个表中。例如学生信息在学生表系名在系表——想知道张三属于哪个系需要跨表查询订单在订单表商品信息在商品表——想知道每笔订单买了什么需要跨表查询要统计每个系的平均成绩需要分组计算进阶 SQL 就是解决这些多表、统计、复杂条件问题的利器。二、多表连接JOIN 的艺术2.1 为什么需要连接假设有两张表学生表学号姓名系号001张三D1002李四D2003王五D1系表系号系名系主任D1计算机赵教授D2电子钱教授如何查询张三属于哪个系单靠学生表只能拿到D1但D1是什么意思需要查系表。JOIN 就是解决这个问题的。2.2 内连接INNER JOIN最常用只返回两表匹配的行。SELECT学生.学号,学生.姓名,系.系名FROM学生INNERJOIN系ON学生.系号系.系号;结果学号姓名系名001张三计算机002李四电子003王五计算机如果学生表中有系号 D3但系表里没有 D3这条记录不会出现在结果中。简写形式用 WHERE 实现相同效果SELECT学生.学号,学生.姓名,系.系名FROM学生,系WHERE学生.系号系.系号;推荐使用JOIN ... ON语法更清晰、更安全不易遗漏连接条件。2.3 左连接LEFT JOIN返回左表的所有行右表中没有匹配的行用 NULL 填充。SELECT学生.学号,学生.姓名,系.系名FROM学生LEFTJOIN系ON学生.系号系.系号;如果学生表中有D3而系表没有结果会显示学号姓名系名004赵六NULL适合场景查找没有分配系的学生、没有下过订单的客户等。2.4 右连接RIGHT JOIN与 LEFT JOIN 相反返回右表的所有行。SELECT学生.学号,学生.姓名,系.系名FROM学生RIGHTJOIN系ON学生.系号系.系号;实际中较少使用通常用 LEFT JOIN 调换表顺序即可替代。2.5 全外连接FULL OUTER JOIN返回两表的所有行没有匹配的行用 NULL 填充。SELECT学生.学号,学生.姓名,系.系名FROM学生FULLOUTERJOIN系ON学生.系号系.系号;⚠️ MySQL 不支持 FULL OUTER JOIN需要用 UNION 模拟。2.6 连接类型总结┌─────────────────────────────────────────────────┐ │ JOIN 类型图解 │ ├─────────────────────────────────────────────────┤ │ │ │ 左表 ○○○○○ 右表 □□□□□ │ │ │ │ INNER JOIN: ○○□□○ (交集) │ │ LEFT JOIN: ○○□□○○○ (左表全部 匹配) │ │ RIGHT JOIN: ○○□□□□□ (右表全部 匹配) │ │ FULL JOIN: ○○□□○○○○□□□ (并集) │ │ │ │ CROSS JOIN: ○○○○○ × □□□□□ 25 行 (笛卡尔积) │ │ │ └─────────────────────────────────────────────────┘2.7 自连接表连接自己有时候需要把同一张表连接两次。示例查找同一个系的学生即和我同系的同学SELECTa.姓名AS学生A,b.姓名AS学生B,a.系号FROM学生 aJOIN学生 bONa.系号b.系号ANDa.学号!b.学号;需要给表起别名a 和 b否则数据库分不清。2.8 多表连接三张或以上表连接只需继续 JOINSELECTs.姓名,d.系名,c.课程名,sc.成绩FROM学生 sJOIN系 dONs.系号d.系号JOIN选课 scONs.学号sc.学号JOIN课程 cONsc.课程号c.课程号WHEREs.姓名张三;给表起简短别名s, d, c, sc能大幅简化 SQL。三、聚合函数数据统计的瑞士军刀3.1 五大聚合函数函数功能示例COUNT(*)统计行数SELECT COUNT(*) FROM 学生;→ 总人数COUNT(列)统计非 NULL 行数SELECT COUNT(专业) FROM 学生;SUM(列)求和SELECT SUM(成绩) FROM 选课;AVG(列)平均值SELECT AVG(成绩) FROM 选课;MAX(列)最大值SELECT MAX(成绩) FROM 选课;MIN(列)最小值SELECT MIN(成绩) FROM 选课;3.2 GROUP BY分组统计需求统计每个系的男女生人数。SELECT系号,性别,COUNT(*)AS人数FROM学生GROUPBY系号,性别;结果系号性别人数D1男15D1女10D2男8D2女12GROUP BY 后SELECT 中只能出现聚合函数或分组列。3.3 HAVING分组后的筛选WHERE 是在分组前过滤行HAVING 是在分组后过滤组。-- 查找人数超过 10 人的系SELECT系号,COUNT(*)AS人数FROM学生GROUPBY系号HAVINGCOUNT(*)10;WHERE 和 HAVING 的顺序不可颠倒-- 完整执行顺序了解即可FROM→WHERE→GROUPBY→HAVING→SELECT→ORDERBY→LIMIT四、子查询查询嵌套查询4.1 什么是子查询子查询就是嵌套在另一个查询中的查询用括号()包裹。4.2 子查询作为条件示例查找计算机系的所有学生SELECT*FROM学生WHERE系号(SELECT系号FROM系WHERE系名计算机);4.3 子查询作为集合示例查找选修了课程 C01的学生SELECT*FROM学生WHERE学号IN(SELECT学号FROM选课WHERE课程号C01);4.4 相关子查询子查询依赖外层查询的值。示例查找成绩高于自己平均成绩的学生SELECTs.学号,s.课程号,s.成绩FROM选课 sWHEREs.成绩(SELECTAVG(成绩)FROM选课WHERE学号s.学号);相关子查询效率较低大数据量时慎用。4.5 子查询 vs JOIN很多子查询可以改写成 JOIN通常 JOIN 效率更高-- 子查询写法SELECT*FROM学生WHERE系号IN(SELECT系号FROM系WHERE系名计算机);-- 等价 JOIN 写法推荐SELECT学生.*FROM学生JOIN系ON学生.系号系.系号WHERE系.系名计算机;五、视图虚拟表的魅力5.1 什么是视图视图View是从一个或多个表导出的虚拟表不存储实际数据只保存查询定义。-- 创建视图计算机系学生视图CREATEVIEW计算机系学生ASSELECT学号,姓名,性别,年龄FROM学生WHERE系号D1;-- 使用视图就像查一张表SELECT*FROM计算机系学生WHERE年龄19;5.2 视图的优点简化复杂查询把复杂 JOIN 封装成视图查询时像查单表数据安全性只暴露部分列给用户如隐藏工资字段逻辑独立性底层表结构变化只需改视图不用改应用5.3 视图的限制不是所有视图都能更新涉及聚合、DISTINCT、GROUP BY 的视图通常不可更新视图查询本质是执行底层 SQL复杂视图可能影响性能六、动手练习练习 1多表连接给定学生表、课程表、选课表查询张三选修的所有课程名称及成绩。练习 2聚合与分组统计每个系的男生人数、女生人数、总人数每门课程的平均分、最高分、最低分找出平均分低于 60 分的课程练习 3子查询改写将以下子查询改写为 JOINSELECT姓名FROM学生WHERE学号IN(SELECT学号FROM选课WHERE成绩90);练习 4创建视图创建视图优秀学生包含成绩 90 分的学生的学号、姓名、课程名和成绩。七、常见错误与排错错误原因解决Column is ambiguous两表有同名列没指定表名加表名前缀a.系号Invalid use of group function聚合函数不能用在 WHERE 中用 HAVING 替代或把聚合放子查询Subquery returns more than one row子查询返回多行但用了改用IN或确保子查询只返回一行View is not updatable视图不可更新检查视图是否包含聚合、DISTINCT、GROUP BYJOIN 结果行数暴增忘了写连接条件产生笛卡尔积确保 JOIN 有 ON 条件八、下篇预告下一篇我们将学习数据库完整性约束——如何通过主键、外键、CHECK、NOT NULL 等机制在数据库层面守住数据质量底线防止脏数据、非法数据进入系统。

相关新闻

企业内网集成Twitter RSS的实战指南:基于办公室的信息流治理

企业内网集成Twitter RSS的实战指南:基于办公室的信息流治理

1. 项目概述:让内部协作平台“活”起来的 Twitter 内容集成实践 在企业内部协作平台的实际落地过程中,我见过太多“上线即沉寂”的案例——页面设计得再漂亮,功能模块堆得再齐全,如果信息流是静止的、单向的、脱离员工真实工作场…

2026/7/5 3:56:36阅读更多 →
MyBatis-Plus 批量操作与 rewriteBatchedStatements 优化

MyBatis-Plus 批量操作与 rewriteBatchedStatements 优化

目录 ① 导读卡片 ② 背景与目标 为什么学? 学完能怎样? ③ 核心概念与原理 3.1 saveBatch 的两种来源 3.2 默认行为:循环单条 INSERT 3.3 真正的"一条多值 INSERT" ④ 逻辑图谱与对比 4.1 四种批量插入方案对比 ⑤ 核心…

2026/7/5 3:56:36阅读更多 →
什么是开放平台

什么是开放平台

也许对于程序员来说,有一个概念一定不陌生,Open API,对,就是开放的应用程序接口。那么开放平台呢?我们不要把他想的那么神秘,简单来说就是Open API Platform,那么什么是Platform,简…

2026/7/5 3:56:36阅读更多 →
5分钟掌握SRWE:游戏窗口分辨率自由调整的终极指南

5分钟掌握SRWE:游戏窗口分辨率自由调整的终极指南

5分钟掌握SRWE:游戏窗口分辨率自由调整的终极指南 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 你是否遇到过这样的烦恼?想截取一张完美的游戏画面,却发现游戏分辨率限制让…

2026/7/5 5:06:40阅读更多 →
ComfyUI-WanVideoWrapper:解锁1025帧长视频生成的魔法工具箱 [特殊字符]

ComfyUI-WanVideoWrapper:解锁1025帧长视频生成的魔法工具箱 [特殊字符]

ComfyUI-WanVideoWrapper:解锁1025帧长视频生成的魔法工具箱 🎬 【免费下载链接】ComfyUI-WanVideoWrapper 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-WanVideoWrapper 想象一下,你正在制作一部微电影,需…

2026/7/5 5:06:40阅读更多 →
国家中小学智慧教育平台电子课本下载完整教程:快速获取PDF教材资源

国家中小学智慧教育平台电子课本下载完整教程:快速获取PDF教材资源

国家中小学智慧教育平台电子课本下载完整教程:快速获取PDF教材资源 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载,让您更方便地获取课本内容。…

2026/7/5 5:06:40阅读更多 →
家庭档案数字化:OCR技术应用与实战技巧

家庭档案数字化:OCR技术应用与实战技巧

1. 家庭档案数字化的痛点与解决方案每次搬家最让我头疼的就是那几大箱纸质档案——从房产证到体检报告,从老照片到孩子成长记录,这些承载着家庭记忆的重要文件既占空间又难管理。去年梅雨季发现部分文件受潮发霉后,我终于下定决心进行彻底的数…

2026/7/5 5:06:40阅读更多 →
WhatWeb:1800 多个插件,扫一眼就知道网站用了什么技术

WhatWeb:1800 多个插件,扫一眼就知道网站用了什么技术

文章目录 WhatWeb:1800 多个插件,扫一眼就知道网站用了什么技术1、 它能识别什么2、 四档攻击性,按需切换3、 输出格式够多4、 安装和基本用法5、 性能调优6、 适合谁用 WhatWeb:1800 多个插件,扫一眼就知道网站用了什…

2026/7/5 5:06:40阅读更多 →
Audacity音频编辑:从零开始掌握专业级免费音频处理工具

Audacity音频编辑:从零开始掌握专业级免费音频处理工具

Audacity音频编辑:从零开始掌握专业级免费音频处理工具 【免费下载链接】audacity Audio Editor 项目地址: https://gitcode.com/GitHub_Trending/au/audacity 想要进行音频编辑却苦于高昂的软件费用?Audacity为您提供了完美的解决方案——这是一…

2026/7/5 5:01:40阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/5 0:01:08阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/5 0:01:08阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/5 0:01:08阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/5 0:01:08阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/5 0:01:08阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/5 0:01:08阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/5 1:30:27阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/5 3:48:10阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/5 3:48:09阅读更多 →