SQL GROUP BY 和 HAVING 子句及示例
SQL Group by 子句是什么?
GROUP BY 子句是一个 SQL 命令,用于 将具有相同值的行分组。GROUP BY 子句用于 SELECT 语句中。它也可以与聚合函数结合使用,以从数据库生成摘要报告。
这就是它的作用, 汇总数据 从数据库。
包含 GROUP BY 子句的查询称为分组查询,并且每个分组项仅返回一行。
SQL GROUP BY 语法
现在我们知道了 SQL GROUP BY 子句是什么,让我们看一下基本分组查询的语法。
SELECT statements... GROUP BY column_name1[,column_name2,...] [HAVING condition];
点击这里
- “SELECT 语句...” 是标准 SQL SELECT 命令查询。
- “通过...分组 列名1”是根据 column_name1 执行分组的子句。
- “[,column_name2,…]” 是可选的;当对多个列进行分组时,表示其他列名。
- “[HAVING 条件]”是可选的;它用于限制受 GROUP BY 子句影响的行。它类似于 WHERE 子句.
使用 单列
为了帮助理解 SQL Group By 子句的效果,让我们执行一个简单的查询,返回成员表中的所有性别条目。
SELECT `gender` FROM `members` ;
gender |
---|
Female |
Female |
Male |
Female |
Male |
Male |
Male |
Male |
Male |
假设我们想要获取性别的唯一值。 我们可以使用以下查询 -
SELECT `gender` FROM `members` GROUP BY `gender`;
在以下位置执行上述脚本 MySQL 工作台 针对 Myflixdb 我们得到了以下结果。
gender |
---|
Female |
Male |
请注意,只返回了两个结果。这是因为我们只有两种性别类型:男性和女性。SQL 中的 GROUP BY 子句将所有“男性”成员分组在一起,并只返回一行。它对“女性”成员也做了同样的事情。
分组使用 多列
假设我们想要获取电影 category_id 及其对应上映年份的列表。
让我们观察一下这个简单查询的输出
SELECT `category_id`,`year_released` FROM `movies` ;
category_id | year_released |
---|---|
1 | 2011 |
2 | 2008 |
NULL | 2008 |
NULL | 2010 |
8 | 2007 |
6 | 2007 |
6 | 2007 |
8 | 2005 |
NULL | 2012 |
7 | 1920 |
8 | NULL |
8 | 1920 |
上述结果有很多重复。
让我们在 SQL 中使用 group by 执行相同的查询 -
SELECT `category_id`,`year_released` FROM `movies` GROUP BY `category_id`,`year_released`;
在以下位置执行上述脚本 MySQL 针对 myflixdb 的工作台为我们提供了以下显示的结果。
category_id | year_released |
---|---|
NULL | 2008 |
NULL | 2010 |
NULL | 2012 |
1 | 2011 |
2 | 2008 |
6 | 2007 |
7 | 1920 |
8 | 1920 |
8 | 2005 |
8 | 2007 |
GROUP BY 子句对类别 ID 和发行年份进行操作,以识别 独特 我们上面例子中的行。
如果类别 ID 相同但发行年份不同,则该行将被视为唯一行。如果多行类别 ID 和发行年份相同,则该行将被视为重复行,并且仅显示一行。
分组和 聚合函数
假设我们想要数据库中男性和女性的总数。我们可以使用下面显示的脚本来实现。
SELECT `gender`,COUNT(`membership_number`) FROM `members` GROUP BY `gender`;
在以下位置执行上述脚本 MySQL 针对 myflixdb 的工作台为我们提供了以下结果。
gender | COUNT('membership_number') |
---|---|
Female | 3 |
Male | 5 |
下面显示的结果按发布的每个唯一性别值分组,并使用 COUNT 聚合函数计算分组行的数量。
使用 HAVING 条款
我们并不总是希望对给定表中的所有数据进行分组。有时我们会希望将结果限制在某个给定的条件下。在这种情况下,我们可以使用 HAVING 子句
假设我们想知道电影类别 ID 为 8 的所有上映年份。我们将使用以下脚本来实现结果。
SELECT * FROM `movies` GROUP BY `category_id`,`year_released` HAVING `category_id` = 8;
在以下位置执行上述脚本 MySQL 针对 Myflixdb 的工作台为我们提供了以下显示的结果。
movie_id | title | director | year_released | category_id |
---|---|---|---|---|
9 | Honey mooners | John Schultz | 2005 | 8 |
5 | Daddy's Little Girls | NULL | 2007 | 8 |
请注意,只有类别 ID 为 8 的电影才会受到我们的 GROUP BY 子句的影响。
总结
- GROUP BY 子句 SQL 用于对具有相同值的行进行分组。
- GROUP BY 子句与 SQL SELECT 语句.
- GROUP BY 子句中使用的 SELECT 语句只能包含列名、聚合函数、常量和表达式。
- SQL Having 子句用于限制 GROUP BY 子句返回的结果。
- MYSQL GROUP BY 子句用于从多条记录中收集数据并返回由一列或多列组成的记录集。