先用一句话写出筛选对象
SQL 课程里,“找出有效订单合计超过某值的客户”包含两次筛选。有效与否属于单条订单;合计是否达标属于客户分组。把两者都塞入 WHERE,或先统计所有记录再排除无效订单,都会改变题意。写语句前先圈出每个条件针对的是记录还是汇总结果。
原创例题:一笔取消订单怎样改变结论
设 orders(customer, amount, status) 有三行:甲、40、paid;甲、80、cancelled;乙、70、paid。只统计已付款订单,并找出总额大于 60 的客户,结果应只有乙。可以写 SELECT customer, SUM(amount) FROM orders WHERE status = 'paid' GROUP BY customer HAVING SUM(amount) > 60。这里数值只是无货币单位的练习数据。
若先把甲的 40 与 80 相加,甲会错误地以 120 达标。这个反例比背诵语法顺序更有用:WHERE 决定哪些行参与聚合,HAVING 决定哪些组留下。查询优化器可能调整物理执行计划,这不改变上述逻辑含义。
三种检查,找出错误发生在哪一步
先单独运行行筛选,确认只剩甲 40、乙 70;再暂时去掉 HAVING,确认分组和为 40、70;最后加入阈值。若结果不对,每次只检查一个阶段。若题目要求包括零订单客户,还涉及外连接,不能仅靠本例覆盖。
换一组数据独立解释
加入乙、20、cancelled,结果应保持不变;再把甲的 paid 金额改为 65,甲才应入选。请先手算再运行,并用中文解释每个条件的位置。课程辅导可以检查这段推理与模拟查询,不应替你提交正式数据库作业。
参考资料
下一步
需要中文大学课程辅导,可向阿尔比恩启航学院说明课程名称、卡住的步骤、已有尝试和学习目标。预约前确认学科适配、导师时间、费用及院校允许的帮助范围。例题用于独立练习,正式计分成果由学生本人完成。
