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

news/2023/6/8 0:33:13

目录

 前置建表

​编辑

一、分组的概念

二、分组案例

 三、分组的过滤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.exyb.cn/news/show-4555977.html

如若内容造成侵权/违法违规/事实不符,请联系郑州代理记账网进行投诉反馈,一经查实,立即删除!

相关文章

谷粒商城(四)

高级篇商品服务-商品上架1、商品 Mapping上架细节2、上架接口编写1&#xff09;、远程服务查询有无库存2&#xff09;、ES保存数据商城业务-首页1、首页整合1&#xff09;、SpringBoot 整合 thymeleaf2&#xff09;、渲染分类数据2、Nginx 域名访问1&#xff09;、Nginx——反向…

WSL2 Ubuntu+gnome图形界面的安装血泪史(亲测有效)

WSL2 Ubuntugnome图形界面写在最前面&#xff08;血泪史&#xff09;1.wsl2 安装2.Ubuntu安装3.VcXsrv安装与启动4. gnome图形界面的配置5.显卡驱动的升级写在最前面&#xff08;血泪史&#xff09; 前因 近期遇到一个问题&#xff0c;需要在ubuntu虚拟机上用opengl3.3以上的版…

小白学 Python 爬虫:自动化测试框架 Selenium 从入门到实战

引言 前面连续几篇爬虫实战不知道各位同学玩的怎么样&#xff0c;小编是要继续更新了&#xff0c;本篇我们来介绍一个前面已将安装过的工具&#xff1a; Selenium &#xff0c;如果说是叫爬虫工具其实并不合适&#xff0c;在业界很多时候是拿来做自动化测试的&#xff0c;所以本…

Web前端学习笔记——CSS京东案例、BFC

京东项目(一) 京东项目介绍 项目名称&#xff1a;京东网 项目描述&#xff1a;京东首页公共部分的头部和尾部制作&#xff0c;京东首页中间部分。 项目背景 现阶段电商类网站很流行&#xff0c;很多同学毕业之后会进入电商类企业工作&#xff0c;同时电商类网站需要的技术也…

小白学 Python 爬虫(27):自动化测试框架 Selenium 从入门到放弃(上)

人生苦短&#xff0c;我用 Python 前文传送门&#xff1a; 小白学 Python 爬虫&#xff08;1&#xff09;&#xff1a;开篇 小白学 Python 爬虫&#xff08;2&#xff09;&#xff1a;前置准备&#xff08;一&#xff09;基本类库的安装 小白学 Python 爬虫&#xff08;3&am…

通用计算机使用的内存条,笔记本内存和台式机内存能通用吗

大部分笔记本电脑的内存条和台式机是不能通用的&#xff0c;因为两者卡槽不同。但有少部分笔记本为了降低成本&#xff0c; 采用了台式机的内存条卡槽&#xff0c;这种笔记本电脑的内存就和台式机通用了。本教程操作环境&#xff1a;windows7系统、Dell G3电脑。笔记本电脑和台…

型号不同的计算机内存条可以通用么,不同频率的内存条可以混用吗

内存是电脑速度比较关键的一项硬件&#xff0c;同常电脑配置太低的时候很多朋友都会选择加装一条内存来提升电脑的性能&#xff0c;这样的情况下选择什么样的内存加装也会让用户比较头疼&#xff0c;一般来说最好是选择一模一样的内存条&#xff0c;但是有的朋友问了&#xff0…

[从零开始]用python制作识图翻译器·三

AlsoEasy-RecognitionTranslator具体实现开发环境准备和验证下载conda创建开发环境文字识别模块在线模块离线模块机器翻译模块在线模块离线模块GUIGUI-定位模块GUI-截图模块具体实现 开发环境准备和验证 前期测试项目文件已上传到我的仓库。 下载conda conda是python的版本管…