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

这篇具有很好参考价值的文章主要介绍了玩转SQL语句之group by 多字段分组查询与having子句,一篇解决你的疑惑!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

group by的基本语法

基本语法

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

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

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

如下表(表名gb),里面有16条数据,前8条是狗狗,后8条是猫猫.
玩转SQL语句之group by 多字段分组查询与having子句,一篇解决你的疑惑!
现在对name这个列进行分组查询

select name from gb group by name;

得到结果如下:
玩转SQL语句之group by 多字段分组查询与having子句,一篇解决你的疑惑!
我们发现他把原始表分为了两个小组,狗狗小组和猫猫小组。从这可以看出分组查询就是把相同的数据分到一个组。

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

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

测试结果如下图:
玩转SQL语句之group by 多字段分组查询与having子句,一篇解决你的疑惑!
通过结果我们发现狗狗组里面有8条数据,猫猫组里面也有8条数据。所以我才说它是组而不是行。因为这个组里面有很多一样的数据,它只显示一条,所以我们很容易就误认为他是普通的行了。(关于这个结果我们可以认为他是一个嵌套表,就像我们编程语言中的嵌套数组一样)(大的套小的,小的里面还套着小的,有点俄罗斯套娃的梗了)。

多个字段的分组查询

1.两个字段的分组查询

首先准备如下表(表名gb):其中有name字段(动物的名称),colour字段 (动物的颜色)
玩转SQL语句之group by 多字段分组查询与having子句,一篇解决你的疑惑!
然后对该表的name和colour这两个字段进行分组聚合,代码如下:

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

结果如下:
玩转SQL语句之group by 多字段分组查询与having子句,一篇解决你的疑惑!
通过结果我们发现 两个字段进行分组和一个字段进行分组并无多大区别,两个字段分组就是要同时考虑两个列,两个列中都是一模一样的数据则分在同一个组中,就比如 黑色的狗狗是一个组、白色狗狗是一个组。 满足同一个动物名称的情况下还要满足动物的颜色,名称颜色都一样就是一个组的 。

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

如下表(表名gb):其中有name字段(动物的名称),colour字段 (动物的颜色), type字段(动物的类型或者叫动物的品种)
玩转SQL语句之group by 多字段分组查询与having子句,一篇解决你的疑惑!
对name,colour,type这三个字段进行分组聚合,代码如下:

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

结果如下:
玩转SQL语句之group by 多字段分组查询与having子句,一篇解决你的疑惑!
通过结果的发现,三个字段进行分组,那么就要同时考虑三个字段,首先考虑动物的名称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字段
玩转SQL语句之group by 多字段分组查询与having子句,一篇解决你的疑惑!
先看看同一个动物中同种颜色的各有多少个

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

结果
玩转SQL语句之group by 多字段分组查询与having子句,一篇解决你的疑惑!
从结果中可以看出 黑色狗狗与白色狗狗各有4只,蓝色的猫猫有6只,黑色猫猫有2只。

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

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

结果
玩转SQL语句之group by 多字段分组查询与having子句,一篇解决你的疑惑!
所以通过having关键词我们就进行了对group by分组结果的筛选了,选出了我们想要的结果。

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

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

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

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

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

如下表(表名gb):其中有动物的名称name字段。
玩转SQL语句之group by 多字段分组查询与having子句,一篇解决你的疑惑!

玩转SQL语句之group by 多字段分组查询与having子句,一篇解决你的疑惑!
如上如的sql语句 红色框书写的列名(select关键字后面的列名), 必须要在两个绿色框中出现过(聚合函数中 或 group by后 出现过),才能书写,没出现过就不能书写。文章来源地址https://www.toymoban.com/news/detail-416841.html

到了这里,关于玩转SQL语句之group by 多字段分组查询与having子句,一篇解决你的疑惑!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • group by进行分组时查询数据

    group by进行分组时查询数据需要注意:  select后的字段: 要么就要包含在Group By语句的后面,作为分组的依据;        要么就要被包含在聚合函数中。 错误: SELECT name, salary FROM student GROUP BY name        select 后的字段 salary 不在 group by 后面,所以salary无法显示全部值。 正确

    2024年02月11日
    浏览(32)
  • MySQL查询分组Group By原理分析

    日常开发中,我们经常会使用到group by: 你是否知道group by的工作原理呢? group by和having有什么区别呢? group by的优化思路是怎样的呢? 使用group by有哪些需要注意的问题呢? 使用group by的简单例子 group by 工作原理 group by + where 和 having的区别 group by 优化思路 group by 使用注意

    2023年04月16日
    浏览(48)
  • 【ABAP】OPEN SQL(七)「GROUP BY | HAVING | ORDER BY」

    💂 作者简介: THUNDER王,一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学本科在读,同时任汉硕云(广东)科技有限公司ABAP开发顾问。在学习工作中,我通常使用偏后端的开发语言ABAP,SQL进行任务的完成,对SAP企业管理系统,SAP ABAP开发和数据库具有较

    2024年02月08日
    浏览(83)
  • 【已解决】Mybatis 实现 Group By 动态分组查询

    🎉工作中遇到这样一个需求场景:实现一个统计查询,要求可以根据用户在前端界面筛选的字段进行动态地分组统计。也就是说, 后端在实现分组查询的时候,Group By 的字段是不确定的 ,可能是一个字段、多个字段或者不进行分组查询,这都是由用户在前端决定的。 💡这

    2024年02月11日
    浏览(37)
  • MySQL使用GROUP BY分组后,获取每组中时间记录最新的行对应的其他字段

    在编写MySQL数据库查询语句时,经常遇到使用GROUP BY分组后,需要获取每组中时间记录最新的行对应的其他字段这一情况。例如下表(t_score): id student course score examdate 1 小张 语文 89.0 2023-06-29 2 小张 数学 90.0 2023-06-29 3 小张 语文 91.0 2024-01-10 4 小张 数学 93.0 2024-01-10 5 小李 语

    2024年01月17日
    浏览(36)
  • Sql group by 分组取时间最新的一条数据

    1.取时间最新的记录 不分组有重复(多条CreateTime一样的都是最新记录) 2.分组后取时间最新的记录 3.如果Id是uuid类型无法使用max(id)的解决办法(使用开窗函数)

    2024年02月11日
    浏览(54)
  • [SQL挖掘机] - GROUP BY语句

    group by 是 sql 中用于对结果集进行分组的。通过使用 group by,可以根据一个或多个列的值将结果集中的行分组,并对每个分组应用某种聚合函数(如 count、sum、avg 等)以生成汇总信息。这样可以方便地对数据进行分类、统计和分析。 group by 语句通常与 select 语句结合使

    2024年02月15日
    浏览(60)
  • SQL语句错误this is incompatible with sql_mode=only_full_group_by解决方法

    一、原理层面 这个错误发生在mysql 5.7.5 版本及以上版本会出现的问题: mysql 5.7.5版本以上默认的sql配置是:sql_mode=“ONLY_FULL_GROUP_BY”,这个配置严格执行了\\\"SQL92标准\\\"。 很多从5.6升级到5.7时,为了语法兼容,大部分都会选择调整sql_mode,使其保持跟5.6一致,为了尽量兼容程序。

    2024年01月21日
    浏览(47)
  • GROUP BY和HAVING用法介绍

    一、group by用法 “group by”就是对数据进行分组,然后针对分组后的数据进行处理。 如: 返回结果实际上就是根据C进行分类汇总。 二、group by 和 having 1、having必须和group by一起用,且在group by后面,但是group可以单独用来分组 2、group by、having、order by的使用顺序:group by 、

    2024年02月15日
    浏览(34)
  • mysql中的group by 和 having使用

    mysql中的group by 和 having 使用 –sql中的group by 用法解析: – Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”。 –它的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对若干个小区域进行数据处理。 –注意:group by 是先排序后

    2024年02月08日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包