Day-9:分组数据

1、数据分组

  分组可以把数据分为多个逻辑组,对每个组进行聚集计算。

2、创建分组

  分组是使用select语句的group by子句建立的。

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

/*
vend_id  num_prods
BRS01    3
DLL01    4
FNG01    2
*/

分析:

  select语句指定了两个列:vend_id包含产品供应商的ID,num_prods为计算字段。

  group by子句指示DBMS按vend_id排序并分组数据,会对每个vend_id而不是整个

  表计算num_prods一次。从输出看出,供应商BRS01有3个产品,供应商DLL01有4

  个商品,FNG01有2个产品。

使用group by重要规定:

  group by子句可以包含任命数目的列,可以对分组进行嵌套。

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

  group by子句中列出的每一列都必须是检索列或有效表达式,且不能是聚集函数。如果在select中使用表达式,则必须在group by子句中指定相同的表达式,不能用别名。

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

  如果分组中有NULL值的行,则作为一个分组返回,如果列中有多行NULL值,它将分为一组.

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

3、过滤分组

  having子句(支持所有where操作符)

select cust_id, count(*) as orders
from orders
group by cust_id
having count(*) >= 2;

/*
cust_id      orders
1000000001    2
*/

说明:having与wher的区别

  where在分组前进行过滤,having在分组后进行过滤,使用having时应结合group by一起。

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

/*
vend_id  num_prods
BRS01    3
FNG01    2
*/

4、分组(group by)与排序(order by)

order by对输出排序

group by:对行分组,但输出可能不是分组的排序

5、select子句顺序

select子句及其顺序
子句 说明 是否必须使用
select 要返回的列或表达式
from 检索数据的表 仅在从表中检索数据时使用
where 行级过滤
group by 分组说明 仅在按组计算聚集时使用
having 组级过滤
order by 输出排序顺序
原文地址:https://www.cnblogs.com/jp-mao/p/6569359.html