mysql必会必知读书笔记——分组

一.使用group by子句的规定:

1.group by子句可以包含任意数目的列。这使得能对分组进行嵌套,为数据分组提供更细致的控制.

2.如果在group by子句中嵌套了分组,数据将在最后的分组上进行汇总。换句话说,在建立分组的时候,指定的所有列都一起计算(所以不能从个别的列取回数据).

3.group by子句中列出的每个列都必是检索列或有效的表达式(但不能是聚集函数).如果select中使用表达式,则必须在

group by子句中指定 相同的表达式。不能使用别名。

4.除聚集计算语句外,select语句中的每个列都必须在group by 子句中给出。

5.如果分组中具有null值,则将null作为一个分组返回。如果列中有多行null值,他们将分为一组。

6.group by子句必须出现在where子句之后,order by子句之前.

例子:

mysql必会必知读书笔记——分组

1)select vend_id,count(*) as num_prods from products group by vend_id;

mysql必会必知读书笔记——分组

2)select vend_id ,prod_price,count(*) as num_prods from products group by vend_id,prod_price;

mysql必会必知读书笔记——分组

二.过滤分组

having用于对分组进行过滤,它支持所有的where操作符。

having和where的区别:

1)having是用于对分组进行过滤而不是指定的行,它是在数据分组后进行过滤。

2)where是用于对指定的行进行过滤,它是在数据分组前进行过滤。

注意:因为where是在数据分组之前进行过滤,所以where排除的行不包括在分组中,这可能会改变计算值,从而影响having子句中基于这些值过滤掉的分组。

例如:查找具有2个(含2)以上、价格为10(含)以上的产品供应商:

select vend_id,count(*) as num_prods from products where prod_price>=10 group by vend_id having count(*)>=2;

mysql必会必知读书笔记——分组

首先where过滤掉prod_price至少为10的行,然后按vend_id进行分组数据,having子句过滤掉计数至少为2的分组。

三.分组和排序

mysql必会必知读书笔记——分组

例如:要求检索出总计订单价格大于等于50的订单的订单号和总计订单价格,并按总计订单价格排序输出。

mysql必会必知读书笔记——分组

如:select order_num,sum(quantity*item_price) as ordertotal from orderitems group by order_num having sum(quantity*item_price)>=50;

mysql必会必知读书笔记——分组

如图所示,如果仅仅依靠group by子句分组的数据以分组顺序输出,但这并不符合要求,仅是按订单号排序,而我们要的是按总价格排序输出。所以得依靠order by子句,如下:

select order_num,sum(quantity*item_price) as ordertotal from orderitems group by order_num having sum(quantity*item_price)>=50 order by ordertotal;

mysql必会必知读书笔记——分组