分组语句的使用

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子句。这是保证数据正确排序的唯一方法。

猜你喜欢

转载自www.cnblogs.com/xiaoxli/p/9485656.html