学习指南 →

· Albion Gateway College

SQL 的 WHERE 和 HAVING 怎么区分:先筛记录,再筛分组

用一组自拟订单练习区分行条件与汇总条件,检查为何移动筛选位置会改变答案。

先用一句话写出筛选对象

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,甲才应入选。请先手算再运行,并用中文解释每个条件的位置。课程辅导可以检查这段推理与模拟查询,不应替你提交正式数据库作业。

参考资料

下一步

需要中文大学课程辅导,可向阿尔比恩启航学院说明课程名称、卡住的步骤、已有尝试和学习目标。预约前确认学科适配、导师时间、费用及院校允许的帮助范围。例题用于独立练习,正式计分成果由学生本人完成。

继续阅读

学院在线咨询

欢迎咨询

你好,欢迎咨询!你是学生、招生代理、求职者,还是想申请成为导师?请告诉我你的咨询方向。

[email protected]