做这道题之前,先回顾一下MySQL的知识点

  1. where条件语句后面不能加聚合函数(分组函数)
  2. having 不能单独使用,必须和group by 联合使用

解题思路

题目要求:

根据订单号聚合,返回订单总价不小于1000 的所有订单号,总价 = item_price 乘以 quantity。

  1. 其实题目已经暗示得很清楚了:根据订单号聚合,这不就摆明叫我们使用 group by 函数,对数据按照订单号进行分组吗?
  2. 返回订单总价不小于1000 的所有订单号。 这是一个过滤条件,但是我们很多人这时候会踩坑, 直接这样写SQL语句:
where sum(item_price*quantity)>=1000

咋一看这好像没问题。但是别忘记了:where后面不能加聚合函数!!!!!

那有没有别的办法呢? 别忘记了我们的老大哥:having

having也可以对结果进一步过滤,只不过having必须和group by联合使用。

having sum(item_price*quantity)>=1000

这样一来,就符合了MySQL的语法规则。

  1. 对1、2两点进行整合,我们就可以写出完整的SQL语句啦。
select order_num,sum(item_price*quantity) total_price 
from OrderItems 
group by order_num 
having sum(item_price*quantity)>=1000 
order by order_num;

别忘记对结果进行排序。

总结

  1. where后面不能直接加聚合函数(分组函数),我们也可以这样记忆:where后面只能跟表中存在的字段。
  2. having 不能单独使用,必须跟 group by 联合使用。

本题的另外一种解法

 select order_num,total_price from 
 (select order_num,sum(item_price*quantity) total_price from OrderItems 
 group by order_num) t
 where total_price>=1000 order by order_num;

这种解法主要是使用了from的子查询,大家就当做知识的回顾。