☰
LeetCode SQL 入门:8 道基础题掌握核心查询技巧
2026/10/31 18:36:26 网站建设 项目流程

1. LeetCode SQL 阶段 0 总结:8 道题找回最基础 SQL 操作

作为一名数据从业者,我经常遇到刚转行数据分析或后端开发的朋友问同一个问题:"SQL 该怎么系统学习?"我的答案永远是:从最基础的 SELECT 开始,用 LeetCode 的简单题建立肌肉记忆。最近我整理了 8 道 LeetCode 上最适合新手的 SQL 题,这些题覆盖了 90% 的日常查询场景,特别适合需要快速找回 SQL 手感的返岗程序员和准备校招的学生党。

1.1 为什么选择这 8 道基础题

在 LeetCode 的 170+ 道 SQL 题中,我筛选出这 8 道题有三个标准:

  1. 只涉及单表操作(避免过早陷入多表连接的混乱)
  2. 每题专注解决一个核心语法点(如 WHERE 过滤、CASE WHEN 转换)
  3. 答案行数控制在 10 行以内(避免复杂嵌套打击信心)

注意:不要小看这些"简单题",Amazon 和 Google 的初级岗位面试中,60% 的 SQL 考察都停留在这个难度级别。

2. 核心语法点拆解与题目映射

2.1 SELECT 基础检索 - 题目 175 & 176

这两题分别考察:

    1. 组合两个表:最简单的 SELECT 列指定
/* 175. 组合两个表 */ SELECT FirstName, LastName, City, State FROM Person LEFT JOIN Address ON Person.PersonId = Address.PersonId;
    1. 第二高的薪水:LIMIT + OFFSET 分页查询
/* 176. 第二高的薪水 */ SELECT ( SELECT DISTINCT Salary FROM Employee ORDER BY Salary DESC LIMIT 1 OFFSET 1 ) AS SecondHighestSalary;

关键技巧:

  • 使用 DISTINCT 去重避免重复值干扰排序
  • 子查询解决"没有第二高时返回 null"的要求
  • OFFSET 1 等价于跳过第一条记录

2.2 WHERE 条件过滤 - 题目 182 & 183

这两题演示了 WHERE 的典型用法:

    1. 查找重复的电子邮箱:GROUP BY + HAVING 组合
/* 182. 查找重复的电子邮箱 */ SELECT Email FROM Person GROUP BY Email HAVING COUNT(*) > 1;
    1. 从不订购的客户:NOT IN 子查询
/* 183. 从不订购的客户 */ SELECT Name AS Customers FROM Customers WHERE Id NOT IN ( SELECT CustomerId FROM Orders );

避坑指南:当 NOT IN 子查询可能包含 NULL 值时,结果会出乎意料。安全写法是改用 NOT EXISTS:

SELECT Name AS Customers FROM Customers c WHERE NOT EXISTS ( SELECT 1 FROM Orders o WHERE o.CustomerId = c.Id );

2.3 CASE WHEN 条件逻辑 - 题目 627

这道题展示了 SQL 中的条件分支:

/* 627. 交换工资 */ UPDATE salary SET sex = CASE sex WHEN 'm' THEN 'f' ELSE 'm' END;

进阶技巧:CASE WHEN 可以实现复杂逻辑嵌套,比如给不同薪资区间打标签:

SELECT name, salary, CASE WHEN salary > 10000 THEN '高薪' WHEN salary > 5000 THEN '中薪' ELSE '基础' END AS level FROM employees;

3. 实操演示与易错点分析

3.1 题目 197. 上升的温度

典型的时间序列比较题,考察日期函数和自连接:

/* 197. 上升的温度 */ SELECT w1.id FROM Weather w1, Weather w2 WHERE DATEDIFF(w1.recordDate, w2.recordDate) = 1 AND w1.Temperature > w2.Temperature;

常见错误:

  1. 误用 DATE_ADD 导致跨月计算错误
  2. 忘记处理表别名导致列名歧义
  3. 漏掉 DATEDIFF 的第二个参数顺序

3.2 题目 596. 超过5名学生的课

GROUP BY 聚合的经典案例:

/* 596. 超过5名学生的课 */ SELECT class FROM courses GROUP BY class HAVING COUNT(DISTINCT student) >= 5;

特别注意:

  • 使用 COUNT(DISTINCT) 避免重复学生被多次计数
  • HAVING 必须配合 GROUP BY 使用
  • WHERE 和 HAVING 的区别:前者过滤行,后者过滤组

4. 效率优化与面试技巧

4.1 索引使用原则

虽然这 8 题数据量小无需优化,但面试时需要展示优化意识:

  • WHERE 和 JOIN 的字段尽量建立索引
  • 避免在索引列上使用函数(如 WHERE YEAR(date) = 2023)
  • 多列索引遵循最左前缀原则

4.2 面试应答策略

当面试官给出 SQL 题时:

  1. 先明确输出格式(列名、排序要求)
  2. 询问数据量级决定是否考虑性能
  3. 用注释写出解题思路再写代码
  4. 主动讨论边界情况(NULL值、重复值)

5. 扩展学习路径建议

完成这 8 题后可以循序渐进:

  1. 学习 JOIN 的 5 种类型(INNER, LEFT, RIGHT, FULL, CROSS)
  2. 掌握窗口函数(ROW_NUMBER, RANK, DENSE_RANK)
  3. 练习 CTE (WITH 子句) 提高可读性
  4. 了解事务隔离级别和锁机制

我个人的刷题经验是:每个新语法点用 3-5 道题巩固,重点记录自己第一次出错的场景。建议建立一个错题本,标注每个错误的根本原因(比如混淆 WHERE/HAVING 的使用场景)。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询