SQL面试题更新 2026-08-05

请写出一条 SQL 语句,用于统计每个订单的总商品数量,并将该订单包含的所有商品名称用逗号连接成一个列表输出。

编码实现技术原理SQL

考察说明

考查对 SQL 分组聚合与字符串聚合函数的掌握,以及不同数据库方言的差异。

回答思路

  1. 【回答框架 1】核心思路是使用 GROUP BY 按订单分组,用 COUNT 统计商品数量,用字符串聚合函数拼接商品列表。
  2. 【回答框架 2】在 MySQL 中可使用 GROUP_CONCAT 函数,例如 SELECT order_id, COUNT(*) AS total_items, GROUP_CONCAT(product_name) AS product_list FROM order_items GROUP BY order_id;注意 GROUP_CONCAT 默认长度限制为 1024 字节,可通过 group_concat_max_len 调整。
  3. 【回答框架 3】在 PostgreSQL 中可使用 STRING_AGG(product_name, ','),SQL Server 使用 STRING_AGG 或 FOR XML PATH,Oracle 使用 LISTAGG;不同数据库语法差异明显,需根据目标数据库选择。
  4. 【回答框架 4】若需去重,可在聚合函数内使用 DISTINCT,如 COUNT(DISTINCT product_id) 和 GROUP_CONCAT(DISTINCT product_name);若需排序,GROUP_CONCAT 支持 ORDER BY 子句。
  5. 【回答框架 5】注意 NULL 值处理:COUNT 不计 NULL,但 GROUP_CONCAT 默认忽略 NULL,若需保留可结合 COALESCE 处理。
  6. 【关键点 1】GROUP BY 按订单分组,COUNT 统计数量,字符串聚合函数拼接列表。
  7. 【关键点 2】MySQL 用 GROUP_CONCAT,PostgreSQL 用 STRING_AGG,SQL Server 用 STRING_AGG 或 FOR XML PATH,Oracle 用 LISTAGG。
  8. 【关键点 3】GROUP_CONCAT 有长度限制,需调整 group_concat_max_len。
  9. 【关键点 4】聚合函数内可用 DISTINCT 去重,ORDER BY 控制拼接顺序。
  10. 【关键点 5】NULL 值在聚合中的行为需明确,必要时用 COALESCE 处理。
  11. 【易错点 1】忽略不同数据库字符串聚合函数的语法差异,导致 SQL 不可移植。
  12. 【易错点 2】未考虑 GROUP_CONCAT 长度限制,商品列表过长时被截断。
  13. 【易错点 3】未处理 NULL 值,导致统计结果与预期不符。