$ ls ~yifei/notes/

mysql 基础知识 (5) - 聚合语句 (group by)

Posted on:

Last modified:

Group by 用来按照某一列或者某几列的值聚合数据。group by x 按照 x 相同的值聚合,group by x, y 按照 x 和 y 都相同的值聚合。而查询的列要么是聚合的列,要么应该通过聚合函数来选取一列。而且所有的 null 会被聚合成一行。

在 SQL 规范中,只能查询 group_by 的字段,如果查询其他字段,这种行为是未定义的。

比如说下面的数据表中

-- How many countries are in each continent?
select
  continent
  , count(*)
from
  countries
group by
  continent

执行查询可以得到每个洲的国家的数量。

过滤

在 SQL 中,Where 子句是在 group 子句之前运行的,所以我们无法通过 where 来过滤 group 之后的结果,而应该使用 having 子句来过滤。

select
 continent
  , max(area)
from
  countries
group by
  1
having
  max(area) >= 1e7

隐式聚合

当你没有使用 group by,而使用了 max、min、count 等聚合函数的时候已经在聚合了

-- What is the largest and average country size in Europe?
select
  max(area) as largest_country
  , avg(area) as avg_country_area
from
  countries
where
  continent = "Europe"

MySQL 的特殊处理

如果在查询中有没有聚合的列,那么 MySQL 就会随机选取一个列,比如下面就会随机选取一个州。总之,这个行为是未定义的,不要这么查询。

select
  country
  , state
  , count(*)
from
  countries
group by
  country

参考

  1. https://www.periscopedata.com/blog/everything-about-group-by
WeChat Qr Code

© 2016-2022 Yifei Kong. Powered by ynotes

All contents are under the CC-BY-NC-SA license, if not otherwise specified.

Opinions expressed here are solely my own and do not express the views or opinions of my employer.

友情链接: MySQL 教程站