SQL面试题更新 2026-08-05

请编写一条SQL查询语句,找出订单总金额超过100的订单记录,并且返回这些订单对应的客户姓名。

编码实现技术原理SQL

考察说明

考查SQL分组聚合与连接查询的能力,特别是对GROUP BY和HAVING的掌握。

回答思路

  1. 【回答框架 1】先确定需要连接的表:订单表(假设字段有订单id、客户id、金额)和客户表(假设字段有客户id、姓名)。由于要查询总金额大于100的订单,需要按订单分组并对金额求和,使用GROUP BY和HAVING子句。
  2. 【回答框架 2】具体SQL结构:SELECT 客户.姓名, 订单.订单id, SUM(订单.金额) AS 总金额 FROM 订单 JOIN 客户 ON 订单.客户id = 客户.客户id GROUP BY 订单.订单id, 客户.姓名 HAVING SUM(订单.金额) > 100; 这里注意GROUP BY中要包含非聚合列。
  3. 【回答框架 3】如果订单表中一条订单对应多行明细,则上述按订单id聚合正确;如果一笔订单就是一个订单记录且金额字段直接存在,则无需分组,只加WHERE金额>100即可。需根据实际表结构区分。
  4. 【回答框架 4】若要求只显示客户姓名或订单总金额,可调整SELECT列表;若还需显示所有客户的姓名(包括无订单的),则应使用LEFT JOIN,但本题可能隐含要求有对应订单。
  5. 【关键点 1】使用JOIN连接订单和客户表,并以订单id分组求总和。
  6. 【关键点 2】HAVING用来过滤聚合后的总金额>100,而不是WHERE。
  7. 【关键点 3】SELECT中除了聚合函数外,其他字段必须出现在GROUP BY中。
  8. 【关键点 4】若订单表已按订单汇总,则只需WHERE金额>100。
  9. 【易错点 1】容易错误使用WHERE来过滤聚合结果,导致语法错误或逻辑错误。
  10. 【易错点 2】忽略GROUP BY对非聚合列的要求,造成执行出错。
  11. 【易错点 3】未考虑订单与客户关联方式(如外连接),导致漏掉无订单客户。