请写出一条 SQL 语句,用于统计每个订单的总商品数量,并将该订单包含的所有商品名称用逗号连接成一个列表输出。
考察说明
考查对 SQL 分组聚合与字符串聚合函数的掌握,以及不同数据库方言的差异。
回答思路
- 【回答框架 1】核心思路是使用 GROUP BY 按订单分组,用 COUNT 统计商品数量,用字符串聚合函数拼接商品列表。
- 【回答框架 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】在 PostgreSQL 中可使用 STRING_AGG(product_name, ','),SQL Server 使用 STRING_AGG 或 FOR XML PATH,Oracle 使用 LISTAGG;不同数据库语法差异明显,需根据目标数据库选择。
- 【回答框架 4】若需去重,可在聚合函数内使用 DISTINCT,如 COUNT(DISTINCT product_id) 和 GROUP_CONCAT(DISTINCT product_name);若需排序,GROUP_CONCAT 支持 ORDER BY 子句。
- 【回答框架 5】注意 NULL 值处理:COUNT 不计 NULL,但 GROUP_CONCAT 默认忽略 NULL,若需保留可结合 COALESCE 处理。
- 【关键点 1】GROUP BY 按订单分组,COUNT 统计数量,字符串聚合函数拼接列表。
- 【关键点 2】MySQL 用 GROUP_CONCAT,PostgreSQL 用 STRING_AGG,SQL Server 用 STRING_AGG 或 FOR XML PATH,Oracle 用 LISTAGG。
- 【关键点 3】GROUP_CONCAT 有长度限制,需调整 group_concat_max_len。
- 【关键点 4】聚合函数内可用 DISTINCT 去重,ORDER BY 控制拼接顺序。
- 【关键点 5】NULL 值在聚合中的行为需明确,必要时用 COALESCE 处理。
- 【易错点 1】忽略不同数据库字符串聚合函数的语法差异,导致 SQL 不可移植。
- 【易错点 2】未考虑 GROUP_CONCAT 长度限制,商品列表过长时被截断。
- 【易错点 3】未处理 NULL 值,导致统计结果与预期不符。