前言
虽然都是BY,都是表条件(HAVING WHERE),它们有什么不同呢??
ORDER BY / GROUP BY 区别
ORDER BY
- 行的排序(ASC正序,DESC倒序)
非常通俗易懂,ORDER BY 列名,就会返回列的顺/倒序排列
GROUP BY
- 分组
不是行的排序!不是行的排序!不是行的排序!
必须与聚合函数一起用(sum()、count()、avg()等)
探究
为啥必须与聚合函数一起用?
1 | SELECT customer |
聚合函数必须搭配GROUP BY吗?
1 | SELECT Customer,SUM(OrderPrice) FROM Orders |
注意
ORDER BY 要写在 GROUP BY 后面,对分组后的数据进行排序
Customer | SUM(OrderPrice) |
---|---|
Bush | 5700 |
Carter | 5700 |
Bush | 5700 |
Bush | 5700 |
Adams | 5700 |
Carter | 5700 |
因为指定了两列,分别返回了结果,Customer返回表中的所有行,SUM(OrderPrice)返回一个值,不能得到正确的答案。所以咱们必须后面加个GROUP BY,分组计算。
HAVING
WHERE后面不能接聚合函数,以下写法会报错:
1 | SELECT product,sum(price) |
原因:聚合函数是针对结果集进行处理,而WHERE子句执行时结果集还没出来
解决: 对聚合函数限制条件时,需要写在 HAVING 后面;且 HAVING 只能在 GROUP BY 后面,对分组后的结果进行筛选
综合使用
如果一个查询语句同时出现 WHERE、GROUP BY、HAVING、ORDER BY时,编写和执行顺序:
- 用 WHERE 进行初步筛选,返回第 1 个结果集
- 第 1 个结果集使用 GROUP BY 分组,返回第 2 个结果集
- 第 2 个结果集使用 HAVING 进行筛选,返回第 3 个结果集
- 第 3 个结果集使用 ORDER BY 排序
1 | SELECT product,sum(price) |