【MySQL】不允许你不了解如何分组数据

news2024/11/18 9:45:11

🎬 博客主页:博主链接
🎥 本文由 M malloc 原创,首发于 CSDN🙉
🎄 学习专栏推荐:LeetCode刷题集!
🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
📆 未来很长,值得我们全力奔赴更美好的生活✨

在这里插入图片描述

在这里插入图片描述

文章目录

  • 😇MySQL的前情介绍
  • 😇本章详情
  • 😇数据分组
  • 😇创建分组
  • 😇过滤分组
    • 😇案例分析
  • 😇分组和排序
    • 😇案例说明
  • 🤣如何巩固学习
  • 🤣本文小结

😇MySQL的前情介绍

😁大家好呀,今天是我第N次写MySQL,也是最近才学习MySQL,也想着记录一下自己的学习过程,并且分享给大家尼!

😇本章详情

🐤本文章将介绍如何分组数据,以便能汇总表内容的子集。这涉及两个新SELECT语句子句,分别是GROUP BY子和HAVING子句。

😇数据分组

前言

从上一篇文章知道,SQL聚集函数可用来汇总数据。这使我们能够对行进行计数,计算和与平均数,获得最大和最小值而不用检索所有数据。

案例分析

目前为止的所有计算都是在表的所有数据或匹配特定的WHERE子句的数据上进行的。提示一下,下面的例子返回供应商1003提供的产品数目:

输入

SELECT COUNT(*) AS num_prods FROM products
	WHERE vend_id = 1003;

输出
在这里插入图片描述
分析

但如果要返回每个供应商提供的产品数目怎么办?或者返回只提供单项产品的供应商所提供的产品,或返回提供10个以上产品的供应商怎么办?

这就是分组显身手的时候了。分组允许把数据分为多个逻辑组,以便能对每个组进行聚集计算。

😇创建分组

💐分组是在SELECT语句的GROUP BY子中建立的。理解分组的最好办法是看一个例子:

输入

SELECT vend_id, COUNT(*) AS num_prods FROM products
	GROUP BY vend_id;

分析

🌱上面的SELECT语句指定了两个列,vend_id包含产品供应商的ID,num_prods为计算字段(用COUNT(*)函数建立)。GROUP BY子句指示MySQL按vend id排序并分组数据。这导致对每个vend_ id而不是整个表计算num_prods一次。从输出中可以看到,供应商1001有3个产品供应商1002有2个产品,供应商1003有7个产品,而供应商1005有2个产品。

输出
在这里插入图片描述
注意

🌻因为使用了GROUP BY,就不必指定要计算和估值的每个组了。系统会自动完成。GROUPBY子句指示MySQL分组数据,然后对每个组而不是整个结果集进行聚集。

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

使用ROLLUP 使用WITH ROLLUP关键字,可以得到每个分组以及每个分组汇总级别(针对每个分组)的值,如下所示:

SELECT vend_id,COUNT(*) AS num_prods FROM products 
	GROUP BY vend_id WITH ROLLUP;

😇过滤分组

除了能用GROUP BY分组数据外,MySOL还允许过滤分组,规定包括哪些分组,排除哪些分组。例如,可能想要列出至少有两个订单的所有顾客。为得出这种数据,必须基于完整的分组而不是个别的行进行过滤。

我们已经看到了WHERE子句的作用(前面几章中有讲解)。但是,在这个例子中WHERE不能完成任务,因为WHERE过滤指定的是行而不是分组。事实上,WHERE没有分组的概念。

🌼那么,不使用WHERE使用什么呢?MySQL为此目的提供了另外的子句,那就是HAVING子句。HAVING非常类似于WHERE。事实上,目前为止所学过的所有类型的WHERE子句都可以用HAVING来替代。唯一的差别是WHERE过滤行,而HAVING过滤分组。


提示

HAVING支持所有WHERE操作符在前几篇文章中,我们学习了WHERE子句的条件(包括通配符条件和带多个操作符的子句)。所学过的有关WHERE的所有这些技术和选项都适用于HAVING。它们的句法是相同的,只是关键字有差别。

😇案例分析

那么,怎么过滤分组呢?请看以下的例子:
输入

SELECT cust_id, COUNT(*) AS orders FROM orders
	GROUP BY cust_id
		HAVING COUNT(*) >= 2;

输出

在这里插入图片描述
分析

这条SELECT语句的前3行类似于上面的语句。最后一行增加了HAVING子句,它过滤COUNT(*)>=2(两个以上的订单)的那些分组。

正如所见,这里WHERE子句不起作用,因为过滤是基于分组聚集值而不是特定行值的。

HAVING和WHERE的差别

HAVING和WHERE的差别 这里有另一种理解方法,WHERE在数据分组前进行过滤,HAVING在数据分组后进行过滤。这是一个重要的区别,WHERE排除的行不包括在分组中。这可能会改变计算值,从而影响HAVING子句中基于这些值过滤掉的分组。

那么,有没有在一条语句中同时使用WHERE和HAVING子句的需要呢?事实上,确实有。假如想进一步过滤上面的语句,使它返回过去12个月内具有两个以上订单的顾客。为达到这一点,可增加一条WHERE子句,过滤出过去12个月内下过的订单。然后再增加HAVING子句过滤出具有两个以上订单的分组。

为更好地理解,请看下面的例子,它列出具有2个 (含) 以上、价格为10(含)以上的产品的供应商:

输入

SELECT vend_id, COUNT(*) AS num_prods FROM products
	WHERE prod_price >= 10
		GROUP BY vend_id 
			HAVING COUNT(*) >= 2;

输出在这里插入图片描述
分析

这条语句中,第一行是使用了聚集函数的基本SELECT,它与前面的例子很相像。WHERE子句过滤所有prod_price至少为10的行。然后按vend_id分组数据,HAVING子句过滤计数为2或2以上的分组。如果没有WHERE子句,将会多检索出两行(供应商1002,销售的所有产品价格都在10以下;供应商1001,销售3个产品,但只有一个产品的价格大于等于10):

输入

SELECT vend_id,COUNT(*) AS num_prods FROM products
	GROUP BY vend_id 
		HAVING COUNT(*) >= 2;

输出
在这里插入图片描述

😇分组和排序

提示

虽然GROUP BY和ORDER BY经常完成相同的工作,但它们是非常不同的。下表汇总了它们之间的差别。

ORDER BY 与 GROUP BY表格
在这里插入图片描述

上表中列出的第一项差别极为重要。我们经常发现用GROUP BY分组的数据确实是以分组顺序输出的。但情况并不总是这样,它并不是SQL规范所要求的。此外,用户也可能会要求以不同于分组的顺序排序。仅因为你以某种方式分组数据(获得特定的分组聚集值),并不表示你需要以相同的方式排序输出。应该提供明确的ORDER BY子句,即使其效果等同于GROUPBY子句也是如此。


注意

不要忘记ORDER BY 一般在使用GROUP BY子时,应该也给出ORDER BY子句。这是保证数据正确排序的唯一方法。千万不要仅依赖GROUP BY排序数据。

😇案例说明

为说明GROUP BY和ORDER BY的使用方法,请看一个例子。下面的SELECT语句类似于前面那些例子。它检索总计订单价格大于等于50的订单的订单号和总计订单价格:

输入

SELECT order_num,SUM(quantity * item_price) AS ordertotal FROM orderitems
	GROUP BY order_num
		HAVING SUM(quantity * item_price) >= 50;

输出
在这里插入图片描述

分析

🌼为按总计订单价格排序输出,需要添加ORDER BY子句,如下所示

输入

SELECT order_num, SUM(quantity * item_price) AS ordertotal FROM orderitems
	GROUP BY order_num 
		HAVING SUM(quantity * item_price) >= 50
			ORDER BY ordertotal;

输出
在这里插入图片描述
分析

在这个例子中,GROUP BY子句用来按订单号 (order_num列)分组数据,以便SUM(*)函数能够返回总计订单价格。HAVING子句过滤数据,使得只返回总计订单价格大于等于50的订单。最后,用ORDER BY子句排序输出。

🤣如何巩固学习

提示:在学习的过程中,我们需要先自行进行思考,而不是一遇到不会的就放弃思考直接看答案,如果最后遇到真的不会的题目,我们可以适当的进行观看答案,看自己的思路是否正确,在作出正确的判断

🤣本文小结

在上一篇文章中,我们学习了如何用SQL聚集函数对数据进行汇总计算。本章节讲授了如何使用GROUP BY子句对数据组进行这些汇总计算,返回每个组的结果。我们看到了如何使用HAVING子句过滤特定的组,还知道了ORDER BY和GROUP BY之间以及WHERE和HAVING之间的差异

好啦今日的分享到这里就结束啦,我是爱你们的M malloc希望可以帮助到你们噢,最后别忘记三连啦!!

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

Nginx安装、卸载教程(含Window、Linux版、Docker版)

目录 一、下载 二、Linux版安装 2.1 编译安装之前 2.2 编译安装 2.3 启动Nginx 2.4 关于防火墙 2.5 安装成系统服务 三、Linux版卸载(彻底) 3.1 检查一下Nginx服务是否在运行 3.2 停止Nginx服务 3.3 查找、删除Nginx相关文件 3.4 再使用yum清…

C++11新特性(5):多线程

学习C11&#xff0c;根据网上资料的知识总结。 1. 线程创建 1.1 初始函数 #include <iostream> #include <thread> void myfunc(int &a) {cout << "a in myfunc:" << a << endl; }int main() {int a 1;std::thread mythread(…

Solr框架 02.Solr操作(document操作和query查询)

菜单项目Documents使用办法 其中的document选项&#xff1a; 以XML格式举例 1新增/修改 当id不存在时新增&#xff0c;当id存在修改。 <doc> <field name"id">8</field> <field name"name">明天更大卖</field> <field n…

好处多多的数仓分层是怎么样子的呢?如何创建数仓分层,

一、创建数仓分层 数仓分层是结合对业务场景、实际数据、使用系统的综合分析&#xff0c;对数据模型进行的整体架构设计及层级划分。用于将不同用途的数据&#xff0c;归类划分至不同的分层&#xff0c;便于您更好地组织、管理、维护数据。本文为您介绍如何创建并管理数仓分层…

Nik Dfine 降噪滤镜

Nik Define 是 Nik Collection 中专门用于降噪的滤镜。 Nik Dfine 有三种降噪方式&#xff1a;自动、手动以及精细局部控制。 大部分照片的降噪&#xff0c;用自动模式就可以达到满意效果。 有所侧重的话&#xff0c;可考虑手动降噪或精细局部控制方式降噪。 返回 Ps 后&#x…

JMeter分布式压测,启动执行机器报错: Port already in use: 1099

Problem creating registry: java.rmi.server.ExportException: Port already in use: 1099; nested exception is: java.net.BindException: Address already in use (Bind failed) 当压测量大的时候我们有时候会失败&#xff0c;然后再接着压测&#xff0c;这样就容易造成端口…

vue3框架开发uniapp高仿度小满金融App项目

vue3框架开发uniapp高仿度小满金融App项目 心血来潮写了度小满前端项目使用vue3开发地址&#xff1a;度小满金融 下面是实现效果

Jenkins + Docker + Maven + Windows 一键部署 Spring Boot 程序到远程 Linux 服务器

Jenkins Docker Maven Windows 一键部署 Spring Boot 程序到远程 Linux 服务器 文章目录 Jenkins Docker Maven Windows 一键部署 Spring Boot 程序到远程 Linux 服务器一、准备1、环境2、基本流程准备步骤基本思路 3、相关命令4、Dockerfile 文件5、配置远程服务器、安装…

外贸网站推广怎么做?英文外贸网站推广的好处

外贸网站推广是在全球范围内宣传和促销公司的产品或服务&#xff0c;以吸引国际客户和拓展海外市场。 以下是一些常见的外贸网站推广策略和方法&#xff1a; 网站优化&#xff1a;确保你的网站在搜索引擎上获得良好的排名。使用关键词研究和优化技术来提高网站的可见性和搜索引…

PostgreSQL中HOT对cluster的作用

PG中cluster的作用是根据表的索引重新构建一张表&#xff0c;并且表根据该索引进行排序&#xff0c;索引必须提前建好。 注意&#xff1a;cluster操作加ACCESS EXCLUSIVE锁&#xff0c;会阻塞其它任何操作。 我们为什么要运行cluster? PG中的表是堆表&#xff0c;表中行的顺…

SpringMvc接收前端发送的api请求参数问题笔记

SpringMvc接收前端发送的api请求参数问题笔记 get请求参数字符串日期转date接收 需要使用DateTimeFormat注解&#xff0c;来接收前端传的 http://xx.xx.xxx/xsdc?start2023-07-01 15:12:13&end2023-07-02 15:00:00 这种日期参数&#xff1b; 这样获取日期数据就能直接取…

启动一个qemu虚拟机

安装qemu&#xff1a; 编译内核&#xff1a; 编译rootfs&#xff1b; 启动&#xff1a; qemu-system-x86_64 -kernel ./linux-4.14.320/arch/x86_64/boot/bzImage -hda ./busybox-1.36.1/rootfs.img -append "root/dev/sda consolettyS0" -nographic 效果图&am…

乐优购物车微服务过滤拦截器

4.1.2.配置公钥 leyou:jwt:pubKeyPath: D:/heima/rsa/rsa.pub # 公钥地址cookieName: LY_TOKEN # cookie的名称 4.1.3.加载公钥 代码&#xff1a; ConfigurationProperties(prefix "leyou.jwt") public class JwtProperties { ​private String pubKeyPath;// 公…

git远程库GitHub

首先&#xff0c;注册一个GitHub&#xff08;github.com&#xff09;帐号&#xff0c;免费获得Git远程仓库 由于本地Git仓库和GitHub仓库之间的传输是通过SSH加密的&#xff0c;所以&#xff0c;需要一点设置&#xff1a; 第1步&#xff1a;创建SSH Key。在用户主目录下&…

学习一波Java语言中的优先队列 PriorityQueue

目录 一、什么是优先队列 二、PriorityQueue 如何使用 三、优先队列的使用场景 一、什么是优先队列 优先队列是一种特殊的队列数据结构&#xff0c;它根据元素的优先级来确定元素的顺序。与普通队列不同的是&#xff0c;优先队列中的元素并不按照插入的先后顺序进行排列&am…

SpringBoot整合logback日志框架详解(提供Gitee源码)

前言&#xff1a;本篇博客主要介绍如何把主流的日志框架快速整合到目前的SpringBoot框架中&#xff0c;对六种日志等级进行介绍以及使用方法。 目录 一、日志级别 1、TRACE 2、DEBUG 3、INFO 4、WARN 5、ERROR 6、FATAL 二、导入pom.xml依赖 三、application.yml配置…

seatunnel-2.3.2 doris数据同步到hive(cdh-6.3.2)首次运行踩坑记录

seatunnel-2.3.2 doris数据同步到hive(cdh-6.3.2)首次运行报错解决&#xff0c;解决的报错如下&#xff1a; 1、java.lang.NoClassDefFoundError: org/apache/hadoop/hive/metastore/api/MetaException 2、java.lang.NoClassDefFoundError: org/apache/thrift/TBase 3、java.la…

arcgis的属性显示bug

arcgis中&#xff0c;右键图层属性可以查看图层的属性信息&#xff0c;比如坐标系、波段数、行列数等。 但是今天实验的时候发现&#xff0c;这个属性中显示的波段最大最小值并非真值。 该图层实际范围为&#xff1a;30~711。 在arcgis属性中&#xff0c;显示范围为0~651。 在…

常用傅里叶变换对 傅里叶变换性质

记录下常用的傅里叶变换对 1. 对称性 2. 尺度变化性 根据上述性质求解&#xff1a; 上述函数可以理解为&#xff0c;cos(wt)的振幅是随着f(t)变化的&#xff0c;这个叫做调幅&#xff08;幅度受到了调制&#xff09;&#xff0c;不过一般发射的时候&#xff0c;还会发个载波&am…

【SQL应知应会】行列转换(二)• MySQL版

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习&#xff0c;有基础也有进阶&#xff0c;有MySQL也有Oracle 行列转换 • Mysql版 前言一、MySQL行列转换1.数据…