ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

LeetCode高频SQL50题解析与面试实战指南

LeetCode高频SQL50题解析与面试实战指南 1. 项目概述LeetCode高频SQL50题的价值与定位作为一名常年混迹技术社区的数据从业者我深刻理解SQL技能在求职和日常工作中的关键地位。LeetCode高频SQL50题这个选题本质上是一套经过市场验证的SQL能力训练方案——它浓缩了硅谷大厂和国内头部互联网公司近三年面试中最常出现的50道SQL题目覆盖了从基础查询到高级分析的完整技能栈。这套题单的特殊价值在于其高频属性。根据我个人参与技术面试的经历这50题中至少有15-20题会以原题或变体形式出现在90%的数据岗位面试中。比如连续登录用户统计这道题我在美团、字节跳动和微软的面试中都被考察过类似的逻辑。掌握这些题目不仅能应对面试更能培养解决实际业务问题的思维模式。2. 核心知识点体系拆解2.1 基础查询与过滤占比约20%这部分包含SELECT基础、WHERE条件过滤、DISTINCT去重等操作。看似简单但陷阱不少-- 典型例题查找第二高的薪水 SELECT IFNULL( (SELECT DISTINCT salary FROM Employee ORDER BY salary DESC LIMIT 1 OFFSET 1), NULL) AS SecondHighestSalary关键点在于处理NULL值IFNULL和去重DISTINCT。很多候选人会忽略表中薪水相同的情况。2.2 表连接与集合操作占比约30%重点考察各种JOIN的差异和应用场景INNER JOIN默认连接方式只返回匹配行LEFT JOIN保留左表所有记录FULL OUTER JOINMySQL中需要用UNION模拟自连接处理层级数据或连续性问题-- 典型例题查找没有订单的客户 SELECT c.Name AS Customers FROM Customers c LEFT JOIN Orders o ON c.Id o.CustomerId WHERE o.Id IS NULL2.3 聚合与窗口函数占比约35%这是面试中最常被深挖的部分基础聚合COUNT/SUM/AVG配合GROUP BYHAVING与WHERE的区别窗口函数ROW_NUMBER/RANK/DENSE_RANK的差异移动平均、累计求和等高级分析-- 典型例题部门工资前三高的员工 SELECT d.Name AS Department, e.Name AS Employee, e.Salary FROM Employee e JOIN Department d ON e.DepartmentId d.Id WHERE ( SELECT COUNT(DISTINCT e2.Salary) FROM Employee e2 WHERE e2.DepartmentId e.DepartmentId AND e2.Salary e.Salary ) 3 ORDER BY d.Name, e.Salary DESC2.4 日期处理与递归查询占比约15%涉及日期函数、时间间隔计算和递归CTE-- 典型例题连续登录N天的用户 WITH LoginStreak AS ( SELECT user_id, login_date, DATE_SUB(login_date, INTERVAL ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY login_date) DAY) AS streak_group FROM Logins GROUP BY user_id, login_date ) SELECT DISTINCT user_id FROM LoginStreak GROUP BY user_id, streak_group HAVING COUNT(*) N3. 高效刷题方法论3.1 分阶段训练计划建议按以下节奏推进以2周为周期基础阶段3天完成20道简单题重点训练语法熟练度强化阶段7天攻克25道中等题掌握复杂业务逻辑拆解冲刺阶段4天解决5道难题适应高压面试环境3.2 解题思维框架我总结的五步解题法明确输出要求确定最终需要返回的数据格式识别数据来源分析涉及的表及其关联关系设计处理流程用伪代码描述转换逻辑选择合适语法决定使用JOIN/子查询/窗口函数等边界测试考虑NULL、重复、极端值等情况3.3 实战模拟技巧使用LeetCode的Playground功能模拟真实IDE环境对每道题记录最优解和次优解的执行计划差异建立错题本分类记录语法错误和逻辑缺陷4. 高频难题精讲4.1 树形结构查询递归CTE-- 查询员工层级关系 WITH RECURSIVE EmployeeHierarchy AS ( -- 基础查询找出所有没有经理的员工CEO SELECT id, name, 1 AS level FROM Employee WHERE managerId IS NULL UNION ALL -- 递归查询逐级向下查找 SELECT e.id, e.name, eh.level 1 FROM Employee e JOIN EmployeeHierarchy eh ON e.managerId eh.id ) SELECT * FROM EmployeeHierarchy ORDER BY level, id;4.2 留存率计算日期函数与条件聚合-- 计算次日留存率 SELECT ROUND( COUNT(DISTINCT d2.user_id) * 100.0 / COUNT(DISTINCT d1.user_id), 2) AS retention_rate FROM DailyActive d1 LEFT JOIN DailyActive d2 ON d1.user_id d2.user_id AND DATEDIFF(d2.date, d1.date) 1 WHERE d1.date 2023-01-014.3 漏斗分析多步骤转化-- 计算注册到购买的转化率 WITH Funnel AS ( SELECT COUNT(DISTINCT signup.user_id) AS signup_users, COUNT(DISTINCT login.user_id) AS login_users, COUNT(DISTINCT purchase.user_id) AS purchase_users FROM Signups signup LEFT JOIN Logins login ON signup.user_id login.user_id AND login.timestamp BETWEEN signup.timestamp AND DATE_ADD(signup.timestamp, INTERVAL 7 DAY) LEFT JOIN Purchases purchase ON login.user_id purchase.user_id AND purchase.timestamp BETWEEN login.timestamp AND DATE_ADD(login.timestamp, INTERVAL 3 DAY) ) SELECT signup_users, login_users, purchase_users, ROUND((login_users * 100.0 / signup_users), 2) AS signup_to_login, ROUND((purchase_users * 100.0 / login_users), 2) AS login_to_purchase FROM Funnel5. 性能优化实战技巧5.1 索引使用原则为JOIN条件、WHERE条件和ORDER BY字段创建索引复合索引遵循最左前缀原则避免在索引列上使用函数或计算-- 低效写法索引失效 SELECT * FROM Orders WHERE YEAR(order_date) 2023 -- 优化写法 SELECT * FROM Orders WHERE order_date BETWEEN 2023-01-01 AND 2023-12-315.2 执行计划解读关键指标解读type列从优到劣 system const eq_ref ref range index ALLrows列预估扫描行数Extra列Using filesort需要优化、Using index良好5.3 子查询优化策略常见优化手段将相关子查询改为JOIN使用EXISTS代替IN处理大数据集将派生表物化为临时表-- 优化前 SELECT * FROM Products p WHERE p.category_id IN ( SELECT category_id FROM Categories WHERE type ELECTRONICS ) -- 优化后 SELECT p.* FROM Products p JOIN Categories c ON p.category_id c.category_id WHERE c.type ELECTRONICS6. 面试实战应对策略6.1 问题澄清技巧遇到模糊题目时应该询问数据规模表数据量级是否允许修改表结构输出结果的排序要求对NULL值的处理要求6.2 代码讲解方法采用金字塔原理表述先陈述最终解决方案分解关键步骤解释每个步骤的技术选型理由讨论可能的变体和优化空间6.3 白板编码建议先写出完整框架SELECT...FROM...WHERE逐步填充细节JOIN条件、GROUP BY字段用注释标注思考过程最后检查边界条件7. 延伸学习资源7.1 进阶题库推荐LeetCode SQL 75题精选HackerRank Advanced SQL题库StrataScratch真实业务场景题7.2 模拟训练平台MySQL沙箱环境db-fiddle.com在线执行计划分析explain.dalibo.com大数据量测试使用generate_series生成测试数据7.3 性能分析工具MySQL: EXPLAIN ANALYZEPostgreSQL: pg_stat_statementsSQL Server: Execution Plan STATISTICS IO在实际面试准备过程中我发现最有效的训练方式是针对每道高频题开发三种解法基础解法、优化解法和极端条件下的健壮解法。例如对于查找第N高薪水这个问题除了标准的LIMIT OFFSET方法外还应该掌握使用窗口函数和自连接的替代方案并清楚每种方案在千万级数据量下的性能差异。
返回列表