• 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 输出排序顺序
  • 相关阅读:
    中国剩余定理
    【BZOJ】【3053】The Closest M Points
    【BZOJ】【1878】【SDOI2009】HH的项链
    【BZOJ】【2648】SJY摆棋子&【BZOJ】【2716】【Violet 3】天使玩偶
    【UOJ Easy Round #2】
    【TYVJ 五月图论专项有奖比赛】
    【BZOJ】【3301】【USACO2011 Feb】Cow Line
    【BestCoder】【Round#41】
    【BZOJ】【1046】/【POJ】【3613】【USACO 2007 Nov】Cow Relays 奶牛接力跑
    【BZOJ】【3210】花神的浇花集会
  • 原文地址:https://www.cnblogs.com/jp-mao/p/6569359.html
Copyright © 2020-2023  润新知