跳到主要内容

分组与 HAVING

GROUP BY 怎样分组?​

  • 作用: 按 GROUP BY 子句列出的属性把关系划分成若干组;
  • 聚集范围: 聚集操作符分别作用在每个分组上, 而不是整张表;
  • 输出: 每个分组产生一行结果;
SELECT studioName, SUM(length)
FROM Movies
GROUP BY studioName;

NULL 在分组中怎样处理?​

  • 规则: NULL 在分组时作为一般取值看待, 不会被跳过;
  • 结果: 所有该属性为 NULL 的元组落进同一组;
  • 对比: 聚集计算本身会忽略 NULL, 见 重复与聚集;

HAVING 与 WHERE 有什么区别?​

维度WHEREHAVING
作用时机分组之前GROUP BY 之后
筛选对象单个元组分组
条件内容属性上的条件通常是聚集结果上的条件
SELECT name, SUM(length)
FROM MovieExec, Movies
WHERE producerC = cert
GROUP BY name
HAVING MIN(year) < 1930;

(source: 050-sql.md §全关系操作/§分组/§分组, 聚集和空值/§HAVING 子句)