分组数据

数据分组

我们使用汇总数据可以实现对行的计数、计算求和、求平均值、获得最小值或最大值。

分组允许我们把数据分为多个逻辑组,以便对每个分组进行聚类运算

创建分组

分组是通过SELECT语句中的GROUP BY子句实现的

语法结构

1
2
3
SELECT 列表名 COUNT(*) AS XX
FROM 表格
GROUP BY 列表名;

这样的语法可以实现对列表的分组进行计数汇总

使用GROUP BY子句须知:

  • GROUP BY子句可以包含任意数目的列。这使得能够对分组进行嵌套,为数据分组提供更细致的控制。
  • 如果在GROUP BY子句中嵌套了分组,数据将在最后规定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起计算(所以不能从个别列取回数据)
  • GROUP BY子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚类函数)。如果SELECT中使用表达式,则必须在GROUP BY子句中使用相同的表达式。不能使用别名
  • 除聚类计算语句外,SELECT语句中的每个列都必须在GROUP BY子句中给出
  • 如果分组列中具有NULL值,则NULL将作为一个分组返回。如果列中有多行NULL值,则他们会被分为一组
  • GROUP BY子句必须在WHERE子句之后,ORDER BY子句之前。

对于GROUP BY子句,其还有一个ROLLUP关键字:使用WHERE ROLLIP关键字,可以得到每个分组以及每个分组汇总级别的值

过滤分组

有时我们使用ORDER BY语句也能实现视觉上对数据库中某一列的数据进行了分组(将值相同的分到一起)

通过使用WHERE语句似乎也能对数据进行过滤(但这种过滤不是针对组的,而是针对列的)

可这种分组和过滤只是视觉上的,我们并不能对其进行过滤等的操作

真正实现对数据的分组需要用到GROUP BY,真正实现过滤需要用到HAVING

HAVING支持所有的WHERE操作符

语法结构

1
2
3
4
SELECT 列名 COUNT(*) AS XX
FROM 表格名
GROUP BY 列名
HAVING 条件;

上边的语法就实现的列出符合条件的组的组名以及组值

HAVING与WHERE的区别

由两者语法结构的不同可以看出:

  • HAVING是对分组过得数据进行过滤
  • WHERE是对分组前的数据进行过滤

分组和排序

总的来说排序可以实现虚假的分组

ORDER与GROUP BY的区别

ORDER BY GROUP BY
排序产生的输出 分组行,但输出的可能不是分组的顺序
任意列都可以使用(甚至非排序列都可以使用) 只可能使用选择列或表达式列。而且必须使用每个选择列表达式
不一定需要 如果与聚类函数一起使用列(或表达式),则必须使用

由于GROUP BY输出的可能不是分组的顺序,所以我们要使用ORDER BY,来实现输出的是正确的排序。

SELECT子句排序

子句 说明 是否必须使用
SELECT 要返回的列或表达式 是
FROM 从中检索数据的表 仅在从表选择数据时使用
WHERE 行级过滤 否
GROUP BY 分组说明 仅在按组计算聚集时使用
HAVING 组级过滤 否
ORDER BY 输出排序顺序 否
LIMIT 要检索的行数 否
Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2015-2023 dwx
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信