以下是三个精心挑选的经典 SQL 面试问题及其详细解决方案,涵盖了数据分析、排序限制和数据清理等常见场景。这些问题旨在考察 SQL 的核心技能,适用于初学者到高级开发者的面试准备。每个问题均包含清晰的问题描述、示例数据、标准的 SQL 查询以及简明的解释,确保代码简洁高效且易于理解:
问题 1:查找重复记录
给定一个 employees 表,包含员工 ID 和姓名,找出姓名重复的员工记录,并返回重复的姓名及其出现次数。
解释:
- 使用 GROUP BY name 按姓名分组。
- COUNT(*) 计算每个姓名的出现次数。
- HAVING COUNT(*) > 1 筛选出重复的姓名(出现次数大于1)。
问题 2:查找第 N 高的薪水
在 salaries 表中,查找第 N 高的薪水(例如第 2 高)。如果没有第 N 高薪水,返回 NULL。
解释:
- DISTINCT salary 去除重复薪水。
- ORDER BY salary DESC 按薪水降序排序。
- LIMIT 1 OFFSET 1 跳过第一条记录(最高薪水),取第二条(第 2 高薪水)。
- 如果需要第 N 高,调整 OFFSET 为 N-1。
备选方案(支持更复杂场景):
解释:
- 使用 DENSE_RANK() 为薪水排名,处理重复值。
- 选择 rnk = 2 获取第 2 高薪水。
问题 3:删除重复记录,保留一条
在 users 表中,存在重复的 email 记录,删除重复记录,仅保留 ID 最小的记录。
解释:
- SELECT MIN(id) ... GROUP BY email 为每个唯一 email 保留最小的 ID。
- DELETE ... WHERE id NOT IN 删除不在此最小 ID 列表中的记录。
备选方案(使用 ROW_NUMBER):
解释:
- ROW_NUMBER() OVER (PARTITION BY email ORDER BY id) 为每个 email 分组,按 ID 分配行号。
- 删除信号大于 1 的记录(保留每组第一条)。
这三个问题覆盖了 SQL 中常见的操作:聚合查询(重复记录)、排序与限制(第 N 高)、数据清理(删除重复)。解决方案使用标准 SQL,兼容大多数数据库(如 MySQL、PostgreSQL)。
<script type="text/javascript" src="//mp.toutiao.com/mp/agw/mass_profit/pc_product_promotions_js?item_id=7508925338090357282"></script>