SQL 专题:语法基础、查询、聚合、连接、子查询与常见面试题
SQL 是后端开发绕不开的基本功:学 MySQL 索引、执行计划和慢查询优化之前,必须先把查询语义、连接、聚合、子查询这些基础打牢。本专题收录一篇语法总结加五篇面试题,本文给出主题分组与推荐学习顺序。
适合谁
- 正在补数据库基础的后端开发者;
- 准备 SQL 笔试、面试中手写查询题的同学;
- 平时靠 ORM 写 CRUD,遇到多表关联和报表统计就发怵、想系统补齐的人。
主题分组
语法底盘:SQL语法基础知识总结。覆盖查询骨架与执行顺序、连接类型、聚合分组、子查询、窗口函数和 DDL 约束,是先读的主干,也是之后的速查手册。
面试题五连(按难度递进):
- 第 1、2 篇:基础查询、排序、过滤、常用函数,建立「看到需求能立刻翻译成 SELECT」的手感;
- 第 3 篇:多表连接、分组统计与子查询拆解,训练复杂需求的分解能力;
- 第 4 篇:窗口函数专场——组内 Top-N、相邻行比较、累计汇总,当前面试区分度最高的一块;
- 第 5 篇:NULL 空值处理、CASE WHEN 条件统计、正则筛选、分页与文本函数,全是业务 SQL 的日常坑。
推荐学习顺序
- 先通读语法总结,重点吃透 SELECT 逻辑执行顺序和
WHERE/HAVING分工; - 按 1→5 的顺序做题,每题先自己动手写,再对照解析找差距;
- 错题回到语法总结的对应章节查漏补缺,形成「题目-知识点」的回路;
- 学完后衔接 MySQL 专题,把写法与索引、执行计划联系起来——同一条 SQL,有没有索引可能差几个数量级。
练习方法
- 环境越轻越好:本地装一个 MySQL 8.0,建几张小表手写数据,比在图形界面点来点去有效得多;
- 每写完一条稍复杂的查询,跑一次
EXPLAIN看看是否全表扫描,尽早建立「语义正确」和「性能合理」的双重视角; - 复杂报表先拆成 CTE 或派生表分层写,可读性优先,优化后置;
- 手写 SQL 全程参数化思维:应用代码里绝不拼接用户输入,防注入是底线。
高频问题自检
学完后合上笔记,能否脱稿回答下面几个问题:SELECT 各子句的逻辑执行顺序是什么?WHERE 和 HAVING 的分工?INNER JOIN 与 LEFT JOIN 的差别,以及过滤条件放 ON 还是 WHERE?COUNT(*)、COUNT(1)、COUNT(列名) 各统计什么?UNION 与 UNION ALL 差在哪?子查询和 JOIN 怎么选?ROW_NUMBER、RANK、DENSE_RANK 的并列语义?深分页为什么慢、怎么优化?答不上来的点,就是下一轮复习的靶子。
常见误区提醒
- 只会 ORM,不会手写 JOIN 和 GROUP BY,面试现场直接露怯;
- 把
HAVING当WHERE用,或对未聚合列随意SELECT,依赖 MySQL 宽松模式的随机结果; - 忽视 NULL 的三值逻辑,
NOT IN子查询混入 NULL 导致结果集意外为空; - 在 8.0 以下的环境照搬窗口函数语法,升级版本前先确认线上版本号。
SQL 的熟练度没有捷径,就是把几十道典型题写到不假思索,再带着执行计划的视角回到真实表里验证。这份专题提供了路径和题目清单,剩下的交给练习。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Dai Wei!
评论

