SQL面试题更新 2026-08-05

请写出一条 SQL 语句,用于检索在订单表中存在至少一条订单记录的客户,并返回每位这样的客户的姓名以及其最近一次下单的日期。

编码实现技术原理SQL

考察说明

考查 SQL 中聚合函数与分组查询的应用,以及通过连接查询关联客户和订单表的能力。

回答思路

  1. 【回答框架 1】核心思路是使用 MAX() 函数获取每个客户的最新订单日期,同时需要确保客户姓名正确关联。由于客户姓名可能在客户表中,而订单信息在订单表中,因此需要通过连接(JOIN)将两表关联,并按客户分组。
  2. 【回答框架 2】具体步骤:先按客户ID分组,计算出每个客户的最大订单日期(MAX(order_date));然后通过 JOIN 客户表,使得最终结果包含客户姓名。注意:如果客户表中有多个同姓名的客户,需要保证按客户ID分组,避免错误合并。
  3. 【回答框架 3】另一种写法是使用窗口函数,如 ROW_NUMBER() 或 RANK() 按客户分区并按订单日期降序排序,取排名为1的记录,这样能直接得到客户姓名和最新订单日期,也更易读。
  4. 【回答框架 4】还要考虑订单表中可能有多条记录在同一日期,此时结果应保留该客户的所有当日订单还是仅一条?通常需求是“最新订单日期”,所以每条客户只显示一行即可。若严格要求返回所有最新订单,则需要额外的条件处理。
  5. 【回答框架 5】最终 SQL 应包含 WHERE 子句过滤订单表中没有记录的客户(通过 INNER JOIN 或 EXISTS 进行过滤),确保只返回有订单的客户。
  6. 【关键点 1】使用 GROUP BY 和 MAX() 获取每组的最新日期
  7. 【关键点 2】使用 INNER JOIN 连接订单表与客户表,过滤无订单客户
  8. 【关键点 3】按客户ID分组,避免同名客户错误聚合
  9. 【易错点 1】GROUP BY 中必须包含所有非聚合查询列,如客户姓名,否则可能报错或产生不确定结果
  10. 【易错点 2】当订单日期相同时,需明确是否保留重复记录,否则可能返回多行导致结果不符
  11. 【易错点 3】若直接对客户姓名分组而忽略 ID,可能合并不同客户的重名数据,造成统计错误