SQL 面试题解析:如何用多表查询写用户订单统计?

在 SQL 面试中,多表查询 + 业务场景统计 是高频考点。常见的题目之一就是:

已知用户表(user)、订单表(order),如何统计每个用户的订单数量和总金额?

这类问题不仅考察语法掌握,还考察你对业务逻辑的抽象与 SQL 优化能力。本文带你逐步解析。

一、题目背景

假设有两张表:

用户表:存储用户的基本信息(用户 id、姓名等)。

订单表:存储订单详情(订单 id、用户 id、订单金额等)。

需求:查询每个用户的订单数和订单总金额。

二、解法思路

明确关联关系

用户表和订单表是一对多关系。

需要通过 user.id = order.user_id 进行关联。

选择合适的 JOIN

如果只统计有订单的用户,用 INNER JOIN。

如果希望统计所有用户,即使没有订单也显示,用 LEFT JOIN。

用聚合函数做统计

COUNT 统计订单数量。

SUM 统计订单金额。

搭配 GROUP BY 按用户分组。

三、SQL 实现

  1. 仅统计有订单的用户

SELECT u.id, u.name,

COUNT(o.id) AS order_count,

SUM(o.amount) AS total_amount

FROM user u

INNER JOIN orders o ON u.id = o.user_id

GROUP BY u.id, u.name;

  1. 包含所有用户(无订单显示为 0)

SELECT u.id, u.name,

COUNT(o.id) AS order_count,

IFNULL(SUM(o.amount), 0) AS total_amount

FROM user u

LEFT JOIN orders o ON u.id = o.user_id

GROUP BY u.id, u.name;

IFNULL 的作用是防止出现 NULL,比如用户没有订单时总金额为 0。

四、面试延伸问题

在实际面试中,考官往往会追问:

如何统计近 30 天的订单?

WHERE o.order_date >= DATE_SUB(CURDATE(), INTERVAL 30 DAY)

如何只统计已支付的订单?

WHERE o.status = 'paid'

如果要统计订单均价呢?

AVG(o.amount)

能否只显示订单数大于 5 的用户?

HAVING COUNT(o.id) > 5

五、优化思路

建立索引

在 orders.user_id 上加索引,加快关联查询。

在 orders.order_date 上加索引,加快时间区间过滤。

避免不必要的函数

尽量不要在 WHERE 条件里对字段直接用函数,否则索引失效。

大数据量时分批查询

如果订单数据量非常大,可以用分页或分区表。

六、总结

这类题目考察三个核心点:

多表关联: INNER JOIN vs LEFT JOIN。

聚合统计: COUNT / SUM / AVG 等函数结合 GROUP BY。

业务扩展: 加上时间区间、订单状态、HAVING 过滤。

一句话记住面试答题思路:

先确定表关系,再选 JOIN 类型,用聚合函数统计,最后考虑边界情况(无订单用户、NULL 值、条件过滤)。

相关推荐
阳光九叶草LXGZXJ5 小时前
达梦数据库-报错-15-列【XXX】长度超出定义
linux·运维·数据库·sql·学习
字节渡客6 小时前
Redis键明明过期了,业务还在读到旧数据
数据库·redis·spring
OnlineProxy8 小时前
亚马逊多账号运营:如何在规避“关联封号”风险的同时实现电商规模化扩张
服务器·数据库·redis
辻弋20110 小时前
五年前的旅行视频糊成马赛克?Video2X用Real-ESRGAN逐帧重建细节,但只支持Windows、集显用户建议直接放弃
服务器·数据库·windows·游戏引擎·电脑
可乐鸡翅yeah_11 小时前
业务中 M3U8 水印相关坑,硬水印和动态水印区别
前端·网络·数据库·ffmpeg·m3u8在线
石头麻辣鱼11 小时前
Bamboo 调度系统 OceanBase 适配实战:存储过程迁移踩过的三个大坑
数据库
龙亘川11 小时前
数智驱动民政升级 精准守护民生保障
大数据·数据库·人工智能
念何架构之路11 小时前
zap扩展生态与总结
java·前端·数据库
晚安日记wanna12 小时前
MySQL 回表为什么这么慢?5 种优化手段逐个拆解
数据库·mysql·性能优化
第七页独白12 小时前
汽车零件厂如何通过 QMS 真正落地 IATF 16949——QMS软件系统:品质检验-内审稽核-8d客诉管理:全星质量管理软件系统
java·前端·数据库