玩转SQL语句之group by 多字段分组查询与having子句,一篇解决你的疑惑!

news2024/10/5 15:25:46

sql语句group by使用详解

  • group by的基本语法
    • 基本语法
    • 什么是分组查询(一个字段)
    • 多个字段的分组查询
      • 1.两个字段的分组查询
      • 2.三个字段及N个字段进行分组查询
  • having子句的使用
    • 基本语法
    • having是干什么的
    • 演示
  • 分组查询select关键字后面列名书写的注意事项

group by的基本语法

基本语法

select 列名1... , 列名n fromgroup by 列名1... , 列名n

什么是分组查询(一个字段)

分组,顾名思义,分成小组。简而言之就是就是把相同的数据分到一个组。

如下表(表名gb),里面有16条数据,前8条是狗狗,后8条是猫猫.
在这里插入图片描述
现在对name这个列进行分组查询

select name from gb group by name;

得到结果如下:
在这里插入图片描述
我们发现他把原始表分为了两个小组,狗狗小组和猫猫小组。从这可以看出分组查询就是把相同的数据分到一个组。

那么问题来了,我一直在说分组这个词,可是看见上面的结果明明是两行数据,哪里是组了,还不如说你这是去重得了(把重复的行筛选掉),虽然看似是两行数据(只有狗狗和猫猫两行),可实际上它是隐藏了,因为每个组里面都是相同的数据,所以它只显示一条数据,我们可以通过count()函数来统计每个组(也就是你看见的行)里面的个数,看一看每个组(行)里面到底包含了多少条数据。测试代码如下:

select name, count(name) as '每个组里的数量' from gb 
group by name;

测试结果如下图:
在这里插入图片描述
通过结果我们发现狗狗组里面有8条数据,猫猫组里面也有8条数据。所以我才说它是组而不是行。因为这个组里面有很多一样的数据,它只显示一条,所以我们很容易就误认为他是普通的行了。(关于这个结果我们可以认为他是一个嵌套表,就像我们编程语言中的嵌套数组一样)(大的套小的,小的里面还套着小的,有点俄罗斯套娃的梗了)。

多个字段的分组查询

1.两个字段的分组查询

首先准备如下表(表名gb):其中有name字段(动物的名称),colour字段 (动物的颜色)
在这里插入图片描述
然后对该表的name和colour这两个字段进行分组聚合,代码如下:

select colour, name, count(*) as '数量' from gb 
group by name, colour;

结果如下:
在这里插入图片描述
通过结果我们发现 两个字段进行分组和一个字段进行分组并无多大区别,两个字段分组就是要同时考虑两个列,两个列中都是一模一样的数据则分在同一个组中,就比如 黑色的狗狗是一个组、白色狗狗是一个组。 满足同一个动物名称的情况下还要满足动物的颜色,名称颜色都一样就是一个组的 。

2.三个字段及N个字段进行分组查询

如下表(表名gb):其中有name字段(动物的名称),colour字段 (动物的颜色), type字段(动物的类型或者叫动物的品种)
在这里插入图片描述
对name,colour,type这三个字段进行分组聚合,代码如下:

select type, colour, name, count(*) as '数量' from gb 
group by name, colour, type;

结果如下:
在这里插入图片描述
通过结果的发现,三个字段进行分组,那么就要同时考虑三个字段,首先考虑动物的名称name字段,它分为狗狗和猫猫两种组(注意: 这就是前面name分组的结果)。然后在考虑动物的颜色colour字段,狗狗有黑色和白色,猫猫有蓝色和黑色 , 他就分为了四种组(注意: 这就是前面name,colour分组的结果)。最后在考虑动物的类型type字段,黑色狗狗有a,b两个类型、白色狗狗有a,b两个类型、蓝色猫猫有a,b两个类型、黑色猫猫有a,b两个类型、它就分为了8种组(就是如上图的结果)。

总结 对N个字段进行分组聚合,那么同时要满足这N个字段,一层一层的往下分。

having子句的使用

基本语法

select 列名1... , 列名n fromgroup by 列名1... , 列名n
having  筛选规则

having是干什么的

其实having很好理解 他的功能与where是一样的,都是为了写条件语句进行筛选数据。但是SQL语法规定,对于group by之后的组结果,想要对其结果进行筛选,必须使用having关键字,不能使用where。所以我们可以把having看成group by的搭档就行了,见了group by 想要对其结果筛选,后面就使用having关键字。就像我们吃饭要用筷子,喝汤要用勺子,筷子和勺子都是吃饭的工具。having与where都是筛选的关键词,只是应用的场景不同而已。

演示

准备下表(表名gb):有动物名称name字段和动物颜色colour字段
在这里插入图片描述
先看看同一个动物中同种颜色的各有多少个

select name, colour, count(*) as '数量' from gb
group by name, colour;

结果
在这里插入图片描述
从结果中可以看出 黑色狗狗与白色狗狗各有4只,蓝色的猫猫有6只,黑色猫猫有2只。

然而现在我们只想看猫猫的数据,不想看狗狗的数据,所以现在我们就要对上图的结果进行筛选。

select name, colour, count(*) as '数量' from gb
group by name, colour
having name = '猫猫';

结果
在这里插入图片描述
所以通过having关键词我们就进行了对group by分组结果的筛选了,选出了我们想要的结果。

然而对此结果我们还是不太满意,我想要选出猫猫中数量 >=6 的组,测试代码如下:

select name, colour, count(*) as '数量' from gb
group by name, colour
having name = '猫猫' and count(*) >= 6;

结果如下:
在这里插入图片描述
通过上面sql语句发现,我们只是在筛选条件上增加了一个筛选条件 使用and 连接可以得出结果。但是这也引发一个新的问题。那就是在where后面我们写筛选条件好像没有用过聚合函数(如count函数等)当条件吧,然而having后面我们却使用了聚合函数(如count函数等)当条件,所以这里也有一个语法规定如下:
1.where后面的筛选规则是对整个表中的行进行筛选,所以不会直接使用聚合函数进行充当条件。
2.having后面是对group by分出的组的结果进行筛选,看似是对每一行进行筛选其实是对每一个组进行筛选,所以我们就可以 直接使用聚合函数充当条件。

分组查询select关键字后面列名书写的注意事项

SQL语法中规定, select关键字后面的列名 要么在group by 后面出现过,要么在selelct后面使用的聚合函数中出行过。没有出现过就不能使用。

如下表(表名gb):其中有动物的名称name字段。
在这里插入图片描述

在这里插入图片描述
如上如的sql语句 红色框书写的列名(select关键字后面的列名), 必须要在两个绿色框中出现过(聚合函数中 或 group by后 出现过),才能书写,没出现过就不能书写。

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

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

相关文章

入门必写项目之图书管理系统(分析详解+完美运行+代码可拿)

文章目录一、需求分析二、思路分析三、包分类四、模块代码展示1.1书籍类(Book)实现1.2书架类(BookList类)实现2.1功能接口(IOperation)实现2.2增加图书(Addoperation)实现2.3删除图书…

家庭实验室系列文章-电脑如何配置网络唤醒 (WOL)?

前言 其实这个专题很久很久之前就想写了,但是一直因为各种原因拖着没动笔。 因为没有资格,也没有钱在一线城市买房 (😂😂😂); 但是在要结婚之前,婚房又是刚需。 我和太太最终一起在一线城市周边的某二线城…

Pyspark学习笔记小总

pyspark官方文档: https://spark.apache.org/docs/latest/api/python/index.html pyspark案例教程: https://sparkbyexamples.com/pyspark-tutorial/ 1. 写在前面 这篇文章记录下最近学习的有关Pyspark以及用spark sql去处理大规模数据的一些常用语法,之前总觉得p…

中小企业办公自动化系统设计与实现(SSH)

目 录 摘 要 I ABSTRACT II 目 录 IV 第1章 绪论 1 1.1 课题背景 1 1.1.1 办公自动化概述 1 1.1.2 中小企业办公模式的现状 2 1.2 研究意义 3 1.3 设计技术及开发环境 5 1.3.1 设计技术 5 1.3.2 开发环境 7 第2章 可行性分析 9 2.1 组织和管理可行性 9 2.2 经济可行性 9 2.3 技…

动态规划模板总结(1)

动态规划思想(1) 背包问题 ​ 分类: 01 背包问题 ​ 含义:每个物体最多选1次,在不超过总体积的情况下价值最大图解: f(i,j)表示的是集合的某种属性,是个值。 集合是所有选法 i 只从前i个中选 朴素实现 #include&…

ElasticSearch是什么?ElasticSearch在SpringBoot中怎么用?SpringBoot整合ElasticSearch

写在前面: 继续记录自己的SpringBoot学习之旅,这次是SpringBoot应用相关知识学习记录。若看不懂则建议先看前几篇博客,详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用! 3.4.3.4 ElasticSearch(ES) 3.4.3.4.1 介绍 是一个…

MySQL JDBC编程

✏️作者:银河罐头 📋系列专栏:MySQL 🌲“种一棵树最好的时间是十年前,其次是现在” 文章目录前置知识APIJDBC的使用安装数据库代码插入操作查找操作前置知识 API API(Application Program Interface)被定义为应用程…

金属纳米颗粒图像分割和计数

代码下载链接,直接上程序运行的效果: 为了便于大家学习,把原图也都贴上了:

乐趣国学—品读《弟子规》中的“亲仁”之道

文章目录亲仁同是人 类不齐 流俗众 仁者希果仁者 人多畏 言不讳 色不媚能亲仁 无限好 德日进 过日少不亲仁 无限害 小人进 百事坏亲仁 “亲仁”,亲是亲近、学习的意思,亲近那些有道德、有学问、有人生境界、有情操的人,这是讲择师。一个人的学…

【Redis】配置项与发布订阅

一、配置项 redis相关配置项都存放在redis.conf文件中,暂时只列举常见的几个,其余的工作中用到再回来更新 1、网络 bind:指定redis只能接受来自此IP绑定的网卡的请求,注意此默认值默认外网是不可访问的,如果想要开启…

Unity3D制作塔防类游戏

演示 功能简介 制作细节详解 演示 资源包:链接:https://pan.baidu.com/s/15MMtYeKkNk5xChvCx0EckQ?pwdd1ub 提取码:d1ub 对应视频教学:01-开始介绍和创建工程_哔哩哔哩_bilibili 功能简介 分为蓝,紫,粉,红四…

[iOS]UI分析工具Reveal

Reveal是ITTY BITTY发布的UI分析工具,可以很直观的查看App的UI布局。 去官网下载安装Reveal,启动后样式如下。 下面介绍一下如何在非越狱设备和越狱设备上用Reveal工具分析UI 一、非越狱设备用Reveal分析UI 1.安装MonkeyDev 安装流程可查看前文[iOS]…

2. Java线程模型

1. 操作系统线程 无论使用何种编程语言编写多线程程序,最终都是通过调用操作系统的线程来执行任务。线程是CPU调度的最小执行单元。 线程有多种实现方式,常见的有:内核线程、用户线程、混合线程。 不同线程模型的主要区别在于线程的调度方不…

bat脚本启动Java服务

bat脚本启动Java服务1.终端cmd窗口运行jar2. bat脚本启动jar包3.后台启动bat脚本4. 运行bat只启动一次jar服务及停止脚本5.注意事项6.所用资源1.终端cmd窗口运行jar Java项目一般会被打包成jar后启动,在windows系统中可以通过终端窗口cmd启动jar包,即在…

5G无线技术基础自学系列 | 移动通信网络的架构

素材来源:《5G无线网络规划与优化》 一边学习一边整理内容,并与大家分享,侵权即删,谢谢支持! 附上汇总贴:5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 第五代(5thGeneraton, 5G) …

计算机中的第一个伟大发明(IR/IAR)

计算机工具的普及极大的推动了科技领域的发展以及提高人们生活的便捷性,那么在其中有哪些举足轻重的发明呢?本节我们来了解一下计算机中第一个伟大的发明:指令寄存器和指令地址寄存器 回顾在步进器加持下的两数两加 前面提到两个数相加的执行…

PyCharm运行PyQT6 (四) 百篇文章学PyQT

本文章是百篇文章学PyQT的第四篇,本文讲述如何使用PyCharm成功运行PyQT6,PyCharm在配置过程中会遇到很多问题,博主在本篇文章中将遇到和踩过的坑总结出来,可以供大家参考,希望大家安装顺利。包括 安装、遇到问题的解决…

Intel芯片、AMD显卡有多强?M1系列呢?

我们知道英特尔是半导体行业和计算创新领域的全球领先厂商 ,创始于1968年。如今,英特尔正转型为一家以数据为中心的公司 。英特尔与合作伙伴一起,推动人工智能、5G、智能边缘等转折性技术的创新和应用突破 ,驱动智能互联世界。…

【由浅入深 - Java笔记】玩转List:List过滤和筛选

文章目录List过滤:Comparator、Comparable 和 Stream1. 使用list的Stream进行筛选2. 增强for循环遍历元素,进行筛选3. 使用list.foreach遍历4. 使用iterator遍历5. 视频笔记List过滤:Comparator、Comparable 和 Stream 花时间精力去凿许多浅井…

5G无线技术基础自学系列 | 移动通信网络的演进

素材来源:《5G无线网络规划与优化》 一边学习一边整理内容,并与大家分享,侵权即删,谢谢支持! 附上汇总贴:5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 随着移动用户数量的不断增加&#xff0…