分组语句的使用
1、分组是在SELECT语句的GROUP BY字句中建立的。
例子:输入:SELECT vend_id, COUNT(*) AS num_prods
FROM products
GROUP BY vend_id;
因为使用了GROUP BY就不用指定要计算和估值的每个组了。系统会自动完成。GROUP BY子句指示MySQL分组数据,然后对每个组而不是整个结果集进行聚集。
2、GROUP BY的一些规定
- GROUP BY子句可以包含任意数目的列。这使得能对分组进行嵌套,为数据分组提供更细致的控制。
- 如果在GROUP BY子句中嵌套了分组,数据将在最后规定的分组上进行汇总。也就是,在建立分组时,指定的所有列都要一起计算。
- GROUP BY子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在SELECT中使用表达式,则必须在GROUP BY子句中指定相同的表达式,不能使用别名。
- 除聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY子句中给出。
- 如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列中有多行NULL值,它们将作为一组。
- GROUP BY子句必须出现在WHERE子句之后,ORDER BY子句之前。
3、过滤分组
例子:SELECT cust_id, COUNT(*) AS orders FROM orders GROUP BY cust_id HAVING COUNT(*) >=2;
用HAVING实现过滤功能,可是为什么不适用WHERE呢?原因就在于,WHERE过滤行,而HAVING过滤分组。HAVING支持所有的WHERE操作符。通俗来讲就是,WHERE在分组前进行过滤,HAVING在分组后进行过滤。
4、分组和排序的区别
ORDER BY | GROUP BY |
排序产生的输出 | 分组行。但输出可能不是分组的顺序 |
任意列都可以使用(甚至非选择列也可以使用) | 只可能使用选择列或表达式列,而且必须使用每个选择列表达式 |
不一定需要 | 如果与聚集函数一起使用列(或表达式),则必须使用 |
一般在使用GROUP BY子句时,应该也给出ORDER BY子句。这是保证数据正确排序的唯一方法。