【MySQL】数据分组(关键字:GROUP BY)过滤分组(关键字:HAVING)

文章目录

  • 数据分组,关键字:GROUP BY
  • 过滤分组,关键字:HAVING
  • 常见 SELECT 子句顺序

我是一名立志把细节说清楚的博主,欢迎【关注】 ~

原创不易, 如果有帮助 ,记得【点赞】【收藏】 哦~ ❥(^_-)~

如有错误、疑惑,欢迎【评论】指正探讨,我会尽可能第一时间回复的,谢谢支持


数据分组,关键字:GROUP BY

  • 如果分组列中具有 NULL 值,则 NULL 将作为一个分组返回。如果列中有多行 NULL 值,它们将分为一组。
  • 如果有 WHERE 关键字,GROUP BY 子句必须出现在 WHERE 子句之后。
  • 如果有 ORDER BY 关键字,GROUP BY 子句必须出现在ORDER BY子句之前。

以基础的 WHERE 关键字作为比较对象,查询某一个班级学生数量。

SELECT COUNT(*) AS class_student_number
FROM student
WHERE class_number = 20230001;

输出

+-----------------------+
|  class_student_number |
+-----------------------+
|                     6 |
+-----------------------+

GROUP BY 使用示例:

SELECT class_number, count(*) AS class_student_number
FROM student
GROUP BY class_number;

输出

+--------------+-----------------------+
| class_number |  class_student_number |
+--------------+-----------------------+
|     20230002 |                     3 |
|     20230001 |                     6 |
|     20230003 |                     1 |
+--------------+-----------------------+

过滤分组,关键字:HAVING

过滤 GROUP BY 关键字的分组,需要使用 HAVING 关键字。 HAVING 关键字的作用很类似于 WHERE 关键字。

区别是:

  • WHERE 关键字过滤行,在数据分组前进行过滤。
  • HAVING 关键字过滤组,在数据分组后进行过滤。
  • WHERE 排除的行不包括在分组中。

我们还使用上面示例数据演示比较:

SELECT s.class_number, count(*) AS class_student_number
FROM student s
GROUP BY s.class_number HAVING class_number != 20230003;

输出

+--------------+-----------------------+
| class_number |  class_student_number |
+--------------+-----------------------+
|     20230002 |                     3 |
|     20230001 |                     6 |
+--------------+-----------------------+

通过和上面没有使用HAVING 关键的查询结果比较,我们发现学生数只有一个的 20230003 班分组数据过滤出去了。


常见 SELECT 子句顺序

子句 说明 必须使用
SELECT 要返回的列或表达式
FROM 要检索的数据表 仅在从表中选择数据时使用
WHERE 行级过滤
GROUP BY 分组 仅在按组计算聚集时使用
HAVING 组级过滤
ORDER BY 返回数据排序
LIMIT 限制返回结果行数

我是一名立志把细节说清楚的博主,欢迎【关注】 ~

原创不易, 如果有帮助 ,记得【点赞】【收藏】 哦~ ❥(^_-)~

如有错误、疑惑 ,欢迎【评论】指正探讨,我会尽可能第一时间回复的,谢谢支持

你可能感兴趣的:(MySQL,mysql,数据库)