目录

前置建表

​编辑

一、分组的概念

二、分组案例

三、分组的过滤HAVING子句


前置建表

CREATE TABLE student (id int NOT NULL AUTO_INCREMENT COMMENT '主键',code varchar(255) NOT NULL COMMENT '学号',name varchar(255) DEFAULT NULL COMMENT '姓名',sex enum('男','女') DEFAULT NULL COMMENT '性别',age  int(0)  NULL COMMENT '年龄',PRIMARY KEY (`id`)
);INSERT INTO `test`.`student`(`id`, `code`, `name`, `sex`, `age`) VALUES (1, '20220101', '张三', '男', 12);
INSERT INTO `test`.`student`(`id`, `code`, `name`, `sex`, `age`) VALUES (2, '202202', '李四', '男', 14);
INSERT INTO `test`.`student`(`id`, `code`, `name`, `sex`, `age`) VALUES (3, '202203', '王五', '女', 10);
INSERT INTO `test`.`student`(`id`, `code`, `name`, `sex`, `age`) VALUES (4, '202204', '张三飞', '男', 20);
INSERT INTO `test`.`student`(`id`, `code`, `name`, `sex`, `age`) VALUES (5, '202205', '小丽', '女', 10);
INSERT INTO `test`.`student`(`id`, `code`, `name`, `sex`, `age`) VALUES (6, '202206', '小明', '男', 11);

数据如下

一、分组的概念

有时需要在数据中找到变化的趋势,这就需要数据库服务器在产生所需要的结果集之前对数据进行一些加工。这时可以使用group by子句请求数据库服务器对数据进行分组。

        GROUP BY子句指示 MySQL 分组数据,然后对每个组而不是整个结果集进行聚集。在具体使用GROUP BY 子句前,需要知道一些重要的规定。
1、GROUP BY 子句可以包含任意数目的列。这使得能对分组进行嵌套,为数据分组提供更细致的控制。
2、如果在 GROUP BY 子句中嵌套了分组,数据将在最后规定的分组上进行汇总。换句话说,在建立分组时,指定的所有列都一起计算(所以不能从个别的列取回数据)。
3、GROUP BY 子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数)。如果在SELECT 中使用表达式,则必须在GROUP BY子句中指定相同的表达式。不能使用别名。
4、  除聚集计算语句外, SELECT 语句中的每个列都必须在 GROUP BY 子句中给出。
5、  如果分组列中具有 NULL 值,则 NULL 将作为一个分组返回。如果列中有多行NULL 值,它们将分为一组。
6、 GROUP BY 子句必须出现在 WHERE 子句之后, ORDER BY 子句之前。

二、分组案例

SELECT a.sex,count(1) from student a GROUP BY a.sex ; -- 根据性别分组,查看男女各有多少人


SELECT a.age,count(1) from student a GROUP BY a.age ; -- 根据年龄分组,查看各个年龄有多少人

当然GROUP BY还可以结合函数,case when等语法实现分组,如以下案例


SELECT  CASE  WHEN  a.age>12 THEN'大于12岁'ELSE'小于等于12岁'
END 条件,count(1) from student a GROUP BY  CASE  WHEN  a.age>12 THEN'大于12岁'ELSE'小于等于12岁'
END   ; --  查询大于12岁和小于等于12岁有多少人

如果获取分组信息之后,还需要获取汇总值,则可以结合WITH ROLLUP关键字来实现

SELECT a.age,count(1) from student a where age<15 GROUP BY a.age  HAVING count(1)=1 ; -- 筛选出年龄小于15的数据,根据年龄分组,查看各个年龄有多少人

三、分组的过滤HAVING子句

        除了能用GROUP BY 分组数据外, MySQL还允许过滤分组,规定包括哪些分组,排除哪些分组。必须基于完整的分组进行过滤。 我们已经看到了WHERE 子句的作用 。但是,在这个例
子中 WHERE 不能完成任务,因为 WHERE 过滤指定的是行而不是分组。事实上,WHERE 没有分组的概念。那么,不使用WHERE 使用什么呢? MySQL 为此目的提供了另外的子句,那就是HAVING 子句。 HAVING 非常类似于 WHERE 。事实上,目前为止所学过的所有类型的WHERE 子句都可以用 HAVING 来替代。唯一的差别是WHERE过滤行,而 HAVING 过滤分组。
SELECT a.sex,count(1) from student a GROUP BY a.sex   HAVING count(1)>2; -- 根据性别分组,获取分组之后count大于2的数据
        HAVING支持所有 WHERE 操作符 (包括通配符条件和带多个操作符的子句)。有关WHERE 的所有这些技术和选项都适用于HAVING。它们的句法是相同的,只是关键字有差别。
        
        HAVING和WHERE 的差别 这里有另一种理解方法, WHERE 在数据分组前进行过滤,HAVING 在数据分组后进行过滤。这是一个重要的区别,WHERE 排除的行不包括在分组中。这可能会改变计算值,从而影响HAVING 子句中基于这些值过滤掉的分组。
当然 where和having 子句是可以一起使用的,执行顺序为先where筛选之后再分组然后having筛选
SELECT a.age,count(1) from student a where age<15 GROUP BY a.age  HAVING count(1)=1 ; -- 筛选出年龄小于15的数据,根据年龄分组,查看各个年龄有多少人

零基础学SQL(九、分组 GROUP BY)相关推荐

  1. 零基础学SQL(1):初识数据库与SQL

    零基础学SQL(1):初识数据库与SQL 一.初识数据库 数据库是将大量数据保存起来,通过计算机加工而成的可以 进行高效访问的数据集合.该数据集合称为数据库(Database,DB).用来管理数据库的 ...

  2. 零基础学sql要多久_成人零基础学习钢琴,要多久能学会?

    越来越多的人都开始在开始工作之后想要练习一门技艺了.不知道大家身边的朋友是不是也在报一些培训班,健身班,瑜伽班,舞蹈班.每个人都有自己向往的生活与目标,那学会钢琴,也慢慢变成了更多喜爱音乐的朋友的目标 ...

  3. 零基础学sql要多久_零基础小白如何迈出学习SQL的第一步?文科生学SQL的心得

    本文适用对象:从没接触过编程的零基础小白 首先,判断是否需要学习SQL 学习的第一步:了解SQL的用途. 比如你的目的是处理小量数据,那么excel就能满足需求,且excel简单易学,适用性广,这种情 ...

  4. 零基础学SQL(十一、视图)

    目录 前置建表 一.什么是视图 二.为什么使用视图 三.视图的规则和限制 四.视图的增删改查 五.视图数据的更新 前置建表 CREATE TABLE student (id int NOT NULL ...

  5. 零基础学SQL(十、子查询与多表关联)

    目录 前置建表 ​编辑     编辑 一.子查询 1.什么是子查询 2.子查询的类型 二.表关联查询 1.连接分类 1.1.交叉连接 (CROSS JOIN) 1.2.内连接(inner join) ...

  6. 零基础学SQL(二、MYSQL数据类型)

    目录 一.数据类型 一.数值型数据 1.整数类型 2.小数类型 二.字符串类型 1.char 2.VARCHAR 3.BLOB和TEXT类型 三.日期和时间类型 四.枚举类型 五.set类型 一.数据 ...

  7. 零基础学SQL(四、可视化工具连接数据库、数据库创建及删除)

    目录 一.使用Navicat链接MYSQL 二.创建数据库 1.创建数据库的命令 2.删除数据库  删库需谨慎 3.修改数据库名称 三.可视化工具操作 1.创建数据库 2.删除数据库 删库需谨慎 一. ...

  8. 零基础学SQL(十三、事务)

     目录 前置建表 ​编辑 一.什么是事务 二.事务特性ACID 1.原子性(Atomicity) 2.一致性(Consistency) 3.隔离性(Isolation) 4.持久性(Durabilit ...

  9. 零基础学SQL(六、数据的增删改查简单语句)

    目录 前置建表 一.数据的插入 1.插入数据语法 1.1.插入完整的行 1.2.插入行的一部分 1.3 .插入多行 1.4.插入某些查询的结果 二.数据的简单查询 1.查询数据语法 三.数据的修改 1 ...

最新文章

  1. Windows下Mysql主从配置(Mysql5.5)
  2. [学习笔记]最小圆覆盖
  3. 计算机网络通信技术课程的基本知识点内容,河北《计算机网络与通信(2339)》自学考试大纲...
  4. linux kill命令详解
  5. PHP webshell
  6. Educational Codeforces Round 64 Div.2 D - 0-1-Tree
  7. 用C#写的汉语转拼音缩写的例子
  8. 教你10分钟搭建酷炫的个人博客
  9. Python配置CPLEX
  10. 一文学会「内存映射」
  11. 关于Zipf定律的理解和python实现
  12. ESP32超详细学习记录:获取B站粉丝数
  13. windows7怎么安装android,安卓手机如何装win7系统
  14. 徐静蕾代言“英纳格”的十大不合理
  15. Windows下载安装 PostgreSQL和PostGIS工具,并解决The pgAdmin 4 server could not be contacted:
  16. B端和C端产品主要差异:用户、体验、数据
  17. uni-app在华为应用市场上架审核无法通过,涉及个人信息:IMEI用户数据收集问题
  18. 关于处理Excel表中文字不能自动换行问题
  19. 什么是RPC?RPC好处?常用的RPC框架?
  20. Object.freeze原来有这么大的作用

热门文章

  1. 第九章:深度学习平台及框架
  2. 阿里云深度学习平台试玩
  3. EMC磁珠到底什么样的特性
  4. 微信新BUG曝光:好友偷偷删了你,用这样一串代码就能查出来!
  5. 1+x证书Web前端开发HTML+CSS专项练习测试题(八)
  6. 没学后端也能开发小程序——微信小程序云开发的介绍知识
  7. [电路]3-基尔霍夫定律
  8. 刘同-《谁的青春不迷茫》
  9. Billy Belceb病毒编写教程---Win32篇
  10. 15版计算机应用基础知识整理,[电脑基础知识]计算机应用基础.ppt