目录

前置建表

​编辑

一、分组的概念

二、分组案例

三、分组的过滤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. clouderamanager-server启动,log日志中说需要mysql驱动的解决办法
  2. struts2的配置
  3. P1198 [JSOI2008]最大数
  4. MV* 框架 与 DOM操作为主 JS库 的案例对比
  5. linux——shell 中的变量
  6. 超实用资源,SCI写作到投稿全阶段模板
  7. 警惕技术人员的极端性
  8. 如何在六个月或更短的时间内成为DevOps工程师(一)
  9. 正在东京、首尔开DevDays
  10. 添加roster好友 命令
  11. 产品研发过程管理专题——软件测试过程管理实践
  12. mui获取css参数,Mui-获取时间-调用手机api
  13. 【Tensor】(张量)的基本概念和操作
  14. 【ZT】可行性研究报告编写规范
  15. 蓝桥杯真题:外卖优先级
  16. ArcGIS实验教程——实验四十三:ArcGIS栅格重分类(Reclass)案例详解
  17. 毫米和像素怎么换算_像素和厘米怎么换算?
  18. 最大公约数与最小公倍数的求法
  19. 为什么称冯诺依曼为电子计算机之父,为什么说冯诺依曼是现代电子计算机之父...
  20. 读应届生论坛的“职业生涯步步高:一位资深经理人的职业生涯感悟”之一

热门文章

  1. TI AM5728 CPSW网口调试笔记
  2. 明峰医疗IPO终止:亏损超过14亿元,王瑶法、潘华素夫妇为实控人
  3. 基于HTML5+JavaScript实现的网页录屏器设计
  4. Excel PivotTable 使用心得手顺分享(一)
  5. 计算几何之求圆与直线的交点
  6. 身体好比什么都强 [唱片]
  7. 医学影像组学人工智能应用培训班
  8. 用计算机处理表格说课稿,《制作表格》说课稿
  9. 利用企业微信免费发送各种信息,开发网页客服
  10. [从头读历史] 第280节 诗经目录以及十五国风的地域分布