早在 2020 年 8 月,SQL Count() 函数的多种用法文章概述了 COUNT 的许多输入参数变体。使用 COUNT() 函数的另一种方法是将其与 GROUP BY 子句结合使用。将 COUNT() 函数与 GROUP BY 结合使用对于根据各种分组分解计数很有用。在今天的文章中,我们将通过使用 Navicat Premium 作为我们的数据库客户端来查询 Sakila 示例数据库,来学习如何按照不同的准则对计数进行分组。
案例 1:出演过大部分 PG 电影的演员
COUNT() 函数本身可以告诉我们有多少演员出现在 PG 电影中。但是,如果我们想知道每个演员出演了多少部 PG 电影,我们需要将 actor_id 添加到 GROUP BY 子句中。回想一下,GROUP BY 子句将记录分组到汇总行中,并为每个组返回一条记录。GROUP BY 查询通常包含 COUNT、MAX、SUM、AVG 等聚合函数。
这是 SELECT 语句以及查询结果,如 Navicat Premium 中所示:
请注意,当使用 GROUP BY 时,我们还可以按降序对记录进行排序,以便在片目中有最多 PG 电影的演员会出现在结果的顶部。
案例 2:每天租借的电影数量
将 COUNT() 函数应用于 rental 表可以告诉我们总共租借了多少部电影。对于更详细的计数,我们需要使用 GROUP BY 子句。例如,我们可以通过按 rental_date 分组来按天细分计数。我们还必须指定 return_date 不能为 NULL,以便我们不计算已租借但尚未归还的电影。
在这种情况下,不需要 ORDER BY,因为结果是按分组的列(即租用日期)自动排序的。
案例 3:客户每月租借的电影数量
在几个相对简单的例子之后,是时候稍微提高难度了。GROUP BY 子句可以对多个字段进行分组,以获得更细密的表。举个例子,这个查询计算每个客户、每月和每年的电影租借数量:
在这种情况下,我们包含 ORDER BY 以按客户的姓氏(last_name)而不是 customer_id 对结果进行排序。显示月份名称中的月份也做了类似的事情,但根据月份编号进行分组和排序。
总结
在今天的文章中,我们通过使用 Navicat Premium 查询 Sakila 示例数据库,学习了如何按不同准则对计数进行分组。正如我们今天在这里看到的,将 COUNT() 函数与 GROUP BY 结合使用对于根据各种分组分解计数很有用。事实上,如果不将 COUNT() 与 GROUP BY 结合使用,你将很难获得相同的数据!
如果你对 Navicat for SQL Server感兴趣,可以免费试用 14 天!
Rob Gravelle 居住在加拿大渥太华,是一名有 20 多年经验的 IT 专家。过往,Rob 曾为与情报有关的组织(如加拿大边境服务局和各种商业组织)构建系统。在业余时间,Rob 是一名出色的吉他演奏家,并发行了 几张 CD。