首页 > 试题广场 >

在分析电商订单数据时,某开发者需要统计每个用户的总订单金额,

[单选题]
在分析电商订单数据时,某开发者需要统计每个用户的总订单金额,但仅包括状态为‘已支付’的订单。以下哪种SQL查询最有效地实现该需求?
  • SELECT user_id, SUM(amount) FROM orders WHERE status = '已支付' GROUP BY user_id
  • SELECT user_id, SUM(amount) FROM orders GROUP BY user_id HAVING status = '已支付'
  • SELECT user_id, AVG(amount) FROM orders WHERE status = '已支付' GROUP BY user_id
  • SELECT user_id, COUNT(*) FROM orders WHERE status = '已支付' GROUP BY user_id
HAVING 只能作用于 “分组后具有唯一值的字段,因为having是针对分组进行操作的,如果是某一字段,也是从该分组中选择一条记录进行验证。
1.开启 ONLY_FULL_GROUP_BY 模式(默认开启)数据库会直接报错,拒绝执行。因为它检测到 HAVING 中的字段既不是 GROUP BY 后的分组字段,也不是聚合函数结果,属于 “逻辑不合法”—— 无法确定用组内哪个值判断条件,干脆不允许这种写法。
2.关闭 ONLY_FULL_GROUP_BY 模式(不推荐):数据库不会报错,但会 “取组内第一条匹配分组规则的记录的字段值”(比如 InnoDB 中按主键顺序取第一条),而非 “随机挑选”。这种结果看似 “确定”,但完全依赖数据库内部存储顺序,业务上无法预期(比如换个存储引擎或数据插入顺序,结果就变了),本质仍是 “不可靠的结果”。
发表于 2025-11-05 12:30:22 回复(0)
HAVING是分组后的筛选条件,不能直接筛选status
发表于 2025-11-21 17:23:02 回复(0)