SQL 是后端开发绕不开的基本功:学 MySQL 索引、执行计划和慢查询优化之前,必须先把查询语义、连接、聚合、子查询这些基础打牢。本专题收录一篇语法总结加五篇面试题,本文给出主题分组与推荐学习顺序。

适合谁

  • 正在补数据库基础的后端开发者;
  • 准备 SQL 笔试、面试中手写查询题的同学;
  • 平时靠 ORM 写 CRUD,遇到多表关联和报表统计就发怵、想系统补齐的人。

主题分组

语法底盘:SQL语法基础知识总结。覆盖查询骨架与执行顺序、连接类型、聚合分组、子查询、窗口函数和 DDL 约束,是先读的主干,也是之后的速查手册。

面试题五连(按难度递进):

  • 第 1、2 篇:基础查询、排序、过滤、常用函数,建立「看到需求能立刻翻译成 SELECT」的手感;
  • 第 3 篇:多表连接、分组统计与子查询拆解,训练复杂需求的分解能力;
  • 第 4 篇:窗口函数专场——组内 Top-N、相邻行比较、累计汇总,当前面试区分度最高的一块;
  • 第 5 篇:NULL 空值处理、CASE WHEN 条件统计、正则筛选、分页与文本函数,全是业务 SQL 的日常坑。

推荐学习顺序

  1. 先通读语法总结,重点吃透 SELECT 逻辑执行顺序和 WHERE/HAVING 分工;
  2. 按 1→5 的顺序做题,每题先自己动手写,再对照解析找差距;
  3. 错题回到语法总结的对应章节查漏补缺,形成「题目-知识点」的回路;
  4. 学完后衔接 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 的熟练度没有捷径,就是把几十道典型题写到不假思索,再带着执行计划的视角回到真实表里验证。这份专题提供了路径和题目清单,剩下的交给练习。