如何分组数据,方便汇总表内容的子集。
两个新的select语句子句:group by 子句和having 子句。
10.1 数据分组
选择ID为dll01的产品数量:
使用分组可以将数据分为多个逻辑组,对每个组进行聚集计算。
10.2 创建分组
分组使用select语句的group by子句建立的。
对每一个不同产品的ID,分开计算每一个ID对应的产品数:
group by 子句,不需要指定要计算和估值的每个组了。系统会自动完成,对每个组而不是整个结果进行聚集。
1. group by 可以包含任意数目的列,可以对分组进行嵌套,更细致分组 |
2. 如果嵌套了,将在最后指定的分组上进行汇总 |
3. group by子句中列出的每一列都必须是检索列或有效的表达式 |
4. 大多数SQL实现不允许group by列带有长度可变的数据类型(文本或备注字段) |
5. 除聚集计算语句外,select语句中的每一列都必须再group by 子句中给出。 |
6. 分组列中包含具有null值的行,则null将作为一个分组返回。列中有多行null的值,它们将被分成一组 |
7. group by 子句必须出现在where子句之后,order by 子句之前 |
10.3 过滤分组
过滤分组:规定包含 哪些分组,排除哪些分组。
使用having子句;
目前位置所学过的所有类型的where子句都可以用having来代替。唯一的差别是,where过滤行,having过滤分组。
过滤了两个以上订单的那些分组
where | having |
where在数据分组前进行过滤 | having在数据分组后进行过滤 |
where排除的行不包括在分组中 | 影响having子句中基于where的计算值过滤掉的分组 |
where用于标准的行级过滤 | 使用having应该结合group by子句 |
不指定group by ,having和where类似,等同对待。
10.4 分组和排序
order by | group by |
对产生的输出排序 | 对行分组,但输出可能不是分组的顺序 |
任意列都可以使用(甚至非选择的列也可以使用) | 只可能使用选择列或者表达式列,而且必须使用每个选择列表达式 |
不一定需要 | 如果与聚集函数一起使用列(或表达式),则必须使用 |
group by分组的数据虽然带有一定的顺序输出的,但是不是特意的,不具有排序的功能,所以对输出的结果需要满足一定的顺序输出的话,需要设定order by子句。
一般在使用group by子句时候,应该也给出order by子句,保证数据正确排序的唯一方法。
group by 子句按照order_num分组数据,以便count(*)函数能够返回每个订单中的物品数目,having子句过滤数据,使得只返回包含三个或更多物品的订单,最后使用order by子句排序输出。
10.5 select子句顺序
where > group by >having > order by