零基础学SQL(九、分组 GROUP BY)

news2024/11/15 10:52:21

目录

 前置建表

​编辑

一、分组的概念

二、分组案例

 三、分组的过滤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的数据,根据年龄分组,查看各个年龄有多少人

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/171227.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HTML知识梳理

文本格式化标签 标签语义加粗 <strong></strong>或者<b></b>更推荐使用<strong>标签加粗语义更强烈倾斜 <em></em>或者<i></i>更推荐使用<em>标签倾斜语义更强烈删除线 <del></del>或者<s><…

MySQL8源代码安装(CentOS8版本)

目标 在CentOS8上面源代码编译安装MySQL8. 下载源代码 打开MySQL下载页面&#xff1a; https://www.mysql.com/downloads/ 找到MySQL社区版本页面&#xff1a; 选择下载MySQL社区版服务器进行下载&#xff1a; 最后选择&#xff0c;MySQL源代码进行下载&#xff0c;如下图…

以element ui为例分析前端各种弹窗和对话框的使用场景与区别

文章目录摘要Dialog 对话框Drawer 抽屉Notice 通知MessageBox 弹框Popconfirm 气泡确认框Message 消息提示Notification 通知Dialog 对话框与Drawer 抽屉的区别MessageBox和Dialog的区别Message消息提示与Notification通知的区别摘要 本文研究分析element ui 中的各种弹窗和对…

【机器学习 吴恩达】2022课程笔记(持续更新)

一、机器学习 1.1 机器学习定义 计算机程序从经验E中学习&#xff0c;解决某一任务T&#xff0c;进行某一性能P&#xff0c;通过P测定在T上的表现因经验E而提高 eg&#xff1a;跳棋程序 E&#xff1a; 程序自身下的上万盘棋局 T&#xff1a; 下跳棋 P&#xff1a; 与新对手下…

Python离线下载whl文件,xxx.wh1 is not a supported wheel on this platform

0、问题 今天在安装 whl 文件的时候&#xff0c;由于电脑处于没有网络的情况&#xff0c;只能在有网络的电脑上下载好 whl 文件&#xff0c;导入之后进行离线安装 但是由于版本不匹配的问题。导致报如下的错误&#xff1a; ERROR&#xff1a;xxx.wh1 is not a supported whe…

创建成功的风格指南

作者&#xff1a;Sean Watson&#xff0c;ServiceNow 创建风格指南是一项艰巨的任务。风格指南包含语法标准、语音和语调指南、要使用和避免的词、复制模式以及产品品牌的基础知识。这些文档很容易变得非常乏味以至于难以使用&#xff0c;或者非常简单以至于无法满足需求。它们…

DDOS和CC如何区分

DDOS 的全称&#xff1a;Distributed Denial of Service中文意思是分布式拒绝服务。该攻击方式利用目标系统网络服务功能缺陷或者直接消耗其系统资源。使得该目标系统无法提供正常的服务。还有&#xff0c;为什么说 DDoS 攻击很泛滥&#xff1f;因为便宜啊&#xff0c;可是效果…

buuctf-web-[RoarCTF 2019]Easy Calc1

打开环境发现一个类似计算器的东西尝试一些常规的测试参数尝试单引号发现提示&#xff0c;但是并未报错&#xff0c;非sql注入查看源代码找到一段JavaScript脚本<script>$(#calc).submit(function(){$.ajax({url:"calc.php?num"encodeURIComponent($("#c…

业务-研发一体化管理平台,存在吗?

伴随着互联网在中国进程的发展&#xff0c;线上研发效能及业务应用软件也不落后于时代进步的脚步&#xff0c;中国软件行业从未停止过持续的创新。 2022年&#xff0c;业务应用开发正在简化&#xff0c;研发效能也在提升&#xff0c;其中不得不提软件在协同促进、研发一体化管…

Java 23种设计模式的分类和使用场景

听说过GoF吧&#xff1f; GoF是设计模式的经典名著Design Patterns: Elements of Reusable Object-Oriented Software&#xff08;中译本名为《设计模式——可复用面向对象软件的基础》&#xff09;的四位作者&#xff0c;他们分为是&#xff1a;Elich Gamma、Richard Helm、R…

MyBatis Plus

概述MyBatis-Plus MyBatis-Plus简称 MP是一个 MyBatis的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开 发、提高效率而生 官方文档&#xff1a;https://baomidou.com/ Hello MP 添加依赖 <!-- 如果没有整合SpringBoot&#xff0c;则需要…

python-MySQL数据库基础(二)操作数据库、数据表进行增删改查、分组、排序、连接

操作数据库(DDL) Cmder是一个软件包&#xff0c;它被创建出来用于Windows上替代模拟器的&#xff0c;cmder官网&#xff1a;https://cmder.net/&#xff0c;安装完成后把安装目录下的bin文件夹添加到环境变量里才能正常使用&#xff08;跟安装python类似&#xff09;。 连接数…

85.机器翻译与数据集

语言模型是自然语言处理的关键&#xff0c; 而机器翻译是语言模型最成功的基准测试。 因为机器翻译正是将输入序列转换成输出序列的 序列转换模型&#xff08;sequence transduction&#xff09;的核心问题。 序列转换模型在各类现代人工智能应用中发挥着至关重要的作用&#x…

Linux常用命令——traceroute命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) traceroute 显示数据包到主机间的路径 补充说明 traceroute命令用于追踪数据包在网络上的传输时的全部路径&#xff0c;它默认发送的数据包大小是40字节。 通过traceroute我们可以知道信息从你的计算机到互联网…

若依项目启动前后端分离版本

若依项目的启动 1、下载源码 git clone https://gitee.com/y_project/RuoYi-Vue.git拉取代码、解压解压后 项目结构&#xff1a; 2、项目依赖 1、前端的依赖 2、后端的依赖 模块化&#xff1a; 依赖&#xff1a; 3、项目配置 1、前端配置 查看package.json 文件、能看到…

【Kubernetes】 从基础认识 k8s核心pod相关概念

基础 提示:此篇帮助朋友们,养成从0到1不断延伸知识的一种方法 最简单的创建pod入手 访问官方文档,直接使用案例,进行修改即可! 官网地址:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/assign-pods-nodes/删除不需要的部分,根据规则添加需要的参数…

[oeasy]python0053_ 续行符_line_continuation_python行尾续行

续行符与三引号 回忆上次内容 上次还是转义序列 类型英文符号\abell响铃\bbackspace退格\ttab水平制表符\vvertical tab垂直制表符换行不回车\\backslash反斜杠\"double quote双引号\’single quote单引号\xhh具体字符输出(hh)16 进制对应的ascii 字符\ooo具体字符输出…

TDengine 时序数据特色查询语法详解,助力时序场景下的应用开发

小 T 导读&#xff1a;TDengine 是专为时序数据而研发的大数据平台&#xff0c;存储和计算都针对时序数据的特点量身定制&#xff0c;在支持标准 SQL 的基础之上&#xff0c;还提供了一系列贴合时序业务场景的特色查询语法&#xff0c;极大地方便了时序场景的应用开发。TDengin…

Java 里面 @InitBinder注解的使用原理

目录 1 @InitBinder注解作用1.1绑定同属性多对象1.2 类型转换2 总结1 @InitBinder注解作用 1.1绑定同属性多对象 第一个作用: 绑定同属性多对象 什么意思,就是有一个接口,参数是两个实体类,这两个实体类里面的属性名称还是一样,那么前端给这个接口传值的时候,哪个参数…

JavaEE day3 初识web与HTML 2

HTML HTML&#xff1a; 1.由标签&#xff08;tag&#xff09;组成的一棵树形结构&#xff0c;由于标签处于一棵树上&#xff0c;有时候也用元素&#xff08;element&#xff09;或者结点&#xff08;node&#xff09;表示 2.基本结构&#xff1a;html包括head与body两部分&a…