MySQL 中 group 分组与统计函数

在 MySQL 中有一类很重要的操作,叫做分组聚合。本篇就来整理一下其中最常见的 group 和统计(max, min, sum, avg, count)部分的基础内容。

统计函数

max

  1. 查询出最贵的商品的价格:

    select max(shop_price) from goods;
    

min

  1. 查询出最便宜的商品的价格:

    select min(shop_price) from goods;
    
  2. 查出最旧(最小)的商品编号:

    select min(goods_id) from goods;
    

sum

  1. 统计一下,本店库存多少件商品:

    select sum(goods_number) from goods;
    

avg

  1. 查看店里所有商品的平均价格:

    select avg(shop_price) from goods;
    

count

  1. 统计本店有多少种商品(总共有几行):

    select count(*) from goods;
    

count(*) 查询的是绝对的行数,即使某一行的所有字段都是 NULL,也计算在内。而,select count(列名) from 表名 查询的是该列不为 NULL 的所有行。

用 count(*) 和 count(1) 对于 myisam 引擎的表来说,没有区别。这种引擎内部有一计数器在维护行数。对于 Innodb 的表用 count(*) 直接查询行数,效率很低,因为需要每一行都去计算。

group

  1. 查询第三个栏目下所有商品的库存量之和

    select sum(goods_number) from goods where cat_id = 3;
    
  2. 如果要查一个组的库存值和比较容易,在 where 后面加上表达式 cat_id=栏目编号即可。但是如果要查询每个栏目下的所有商品库存量之和,就需要用到 group by 了,如下所示:

    select cat_id,sum(goods_number) from goods group by cat_id;
    

    若是把语句改成:

    select goods_id,sum(goods_number) from goods;
    

    在有些版本中会报错,有些版本会令 goods_id=1,会把第一次出现的值取出来,但是不建议这么操作。严格地说,以 group by a, b, c 为列,则 select 的列只能在 a, b, c 里选择,语义上才没有矛盾。

  3. 按照 cat_id 分组,计算每个栏目下的商品的平均价格:

    select cat_id, avg(shop_price) from goods group by cat_id;
    

你可能感兴趣的:(MySQL 中 group 分组与统计函数)