理解group by语义
个人认为sql中的group by和join是两大难点,因为它们转换了原来的表结构,group把表按某些字段统计缩小,join则使用笛卡尔积将多个表连接展开(关于表的连接,请参看深入理解SQL表连接(join),这篇文章以一个非常有趣的角度,带你彻底理解SQL表连接的本质)

咱们回到group by,顾名思义group即为分组,即将原来的一整块数据分成几小块。分组是聚合的前提,聚合是在每个分组内进行一些统计,如在分组内的最大值,最小值,平均值,个数等。

未分组时查询返回的行直接与数据库表中的行对应,分组后分为多少组这个查询就会返回多少条记录,返回的记录中只能包含分组字段和在这个分组上的聚合操作的值(MySQL是例外见后面)

一般形式为:语法为:select t.sex, count(t.id) as cnt group by sex having cnt>2
查询中有三种字段:
查询字段:在select中出现的表中的字段
聚合字段:对表中的字段施加了聚合函数后形成的字段
分组字段:group by后的字段

无分组字段时
sql允许无分组字段,即无group by直接在select中用各种聚合函数,这时表示整块数据为一个分组(单分组),聚合操作则是在整块全局上进行聚合,表示为本查询中所有记录的最大值,最小值,平均值,个数等
如果没有分组字段的聚合,则select后的字段只能全部都是带聚合的,不能直接是字段名否则Orcle会报错:ORA-00937: not a single-group group function(MySQL是个例外后面详述)

MySQL的坑
MySQL有一个让人不解的地方:在聚合查询中select可以出现非分组字段,语义上group by后的结果已经进行了分组变换,此时的数据均应对应于分组而不再是原表记录,在一个分组语义的记录里加入一个表的字段,语义上不太严谨,实际上MySQL会将非分组字段随便取一个值,不得不说算一个坑
比如下面的查询Oracle报错而MySQL不报错
select id, count(t.id) from
(
select 1 as id, 2 as age, 'F' as sex from dual union
select 2 as id, 2 as age, 'M' as sex from dual union
select 3 as id, 3 as age, 'F' as sex from dual union
select 4 as id, 4 as age, 'M' as sex from dual 
)t
在MySQL中返回
1 4
该查询是单分组查询,4是总的记录条数没有问题,此时1是什么意思呢?它和计数有什么关系呢?

*MySQL后面意识到这会导致很多潜在的问题,因此在高版本中对此问题进行了修复,即不再允许在select中出现非group的字段

对null的处理
count(*)统计包含null在内的行数,count后面跟上字段名则表示统计这个字段非null的行数

聚合函数后面可以跟一个复合表达式,如多个字段相加,复合时如果其中一个字段为null则整个表达式为null,比如统计两个字段都非null的行数,可以count(f1+f2)

count,avg,sum后面跟上字段名时如果为null值将会忽略,比如计算平均值时null的那一行并不会记入总行数

如果带有group by则select后的字段要么是分组字段要么是聚合字段(MySQL仍然可以出现非分组字段)

关于having
与where不同的是having在group后进行进行过滤,where在group前进行过滤其写在group关键字前,having后过滤的字段可以是分组字段或聚合字段如:
select sex, count(*) as cnt having sex='F'
select sex, count(*) as cnt having cnt>1

小技巧
有时需要测试sql语法但又觉得创建表麻烦,可以使用创建一个临时表,如下:
select id, count(t.id) from
(
select 1 as id, 2 as age, 'F' as sex from dual union
select 2 as id, 2 as age, 'M' as sex from dual union
select 3 as id, 3 as age, 'F' as sex from dual union
select 4 as id, 4 as age, 'M' as sex from dual 
)t

sql分组查询的使用相关推荐

  1. ORACLE SQL分组查询某列或某几列重复信息数量

    实际开发中经常会需要分组查询某列或者某几列重复的数据量,比如说统计彩票开奖号码历史出现的次数等. 以下SQL以数据库本地EMP表数据为例 --查询所有员工信息 SELECt * FROM EMP; - ...

  2. sql语法基础,sql分组查询

    01分组查询–group by 格式: SELECT 列名1,列名2,... FROM 表名 GROUP BY 列名1,列名2.... 例一,按照商品种类统计一下行数 SELECT product_t ...

  3. SQL分组查询后取每组的前N条记录

    本文由 Leon 同学授权发布 这个公众号的关注者除了大部分是 Android 工程师之外还有部分后端以及前端同学,我鼓励也非常欢迎大家来投稿,其实我们并不需要把自己限定在某个领域,多学学其他语言也是 ...

  4. sql分组查询group by结合count,sum统计语句的实现(附带sql详细分析步骤)

    日常写代码经常会遇到数据统计的业务场景,分组查询 group by 结合 count 和 sum 的复杂语句写起来容易令人头大,在这里分享两个比较复杂的统计场景,提供详细分析思路和最终sql语句,希望 ...

  5. 如何在SQL分组查询时将空白值和NULL值分为一组

    问题背景 出现这个问题的原因是在测试过程中,对于我要分组的类型在不同人存数据时出现了空白值和NULL两种情况(胡闹!),导致我之前的分组查询会出现NULL一个分组,空白值一个分组,由于业务上的需求是没 ...

  6. Mybatis:动态SQL分组查询

    目录 1.  实现思路 2. 代码实现 2.1  mapper 2.2 mapper 接口 2.3 Service层 AjaxResult对象 2.4 controller 2.5 测试 1.  实现 ...

  7. sql分组查询每组最新的一条数据

    原文地址:https://www.cnblogs.com/java-spring/p/11498457.html 开发中经常会遇到,分组查询最新数据的问题,比如下面这张表(查询每个地址最新的一条记录) ...

  8. 深入理解sql分组查询(group by)

    理解group by语义 个人认为sql中的group by和join是两大难点,因为它们转换了原来的表结构,group把表按某些字段统计缩小,join则使用笛卡尔积将多个表连接展开(关于表的连接,请 ...

  9. sql分组查询每组最新一条数据

    在开发过程中,写sql语句时往往会遇到分类查询最新的一条数据或某一列最大数据,此时就需要用到连表查询和分组查询, 先分组查询出每组最大的id,再进行连表查询 SELECT id,title,u_id, ...

最新文章

  1. JDBC学习DayTwo
  2. 朴素高精度乘法的常数优化
  3. Struts07---访问servlet的API
  4. mongodb最多数据库_数据库库库库库库库库!
  5. Django框架(16.Django中的模型类管理器以及自定义管理器)
  6. Navicat 安装+连接
  7. 择天记手游的服务器维护世界,1130停服更新公告
  8. js (javascript) 中获取年月日信息
  9. 每天至少保证4个小时在学习知识
  10. 数据分析角度拆解可怕的庞氏骗局,究竟是怎么骗到人的?
  11. 创业型 APP 如何筛选合适的推送平台
  12. 如何在电脑网页下载准考证
  13. 你还在纠结英语的发音问题吗,你还老记不住单词吗?
  14. 《软件架构/架构师书库》读后感
  15. gmail更改个人信息_如何在不创建新电子邮件地址的情况下更改Gmail名称
  16. 范蠡传(司马迁-史记)
  17. easyUI datagrid editor扩展dialog
  18. cerebro安装部署
  19. Electron——查看Electron的版本
  20. 利用Python为女神制作一个专属网站

热门文章

  1. mui之 scroll采坑
  2. IT管理的致命七宗罪
  3. 《怨情》赏析-(李白明月姑娘之三)
  4. Conditional, Ternary 运算符的使用
  5. javplayer手机版怎么用_JavPlayer软件 1.03 免费版
  6. 学校规定:一个学生可选修多门课,一门课有若干学生选修;一个教师可讲授多门课,一门课只有一个教师讲授;一个学生选修一门课,仅有个成绩。学生的属性有学号、学生姓名;教师的属性有教师编号,教师姓名
  7. MATLAB R2016a版——改变Simulink中Scope输出波形的颜色
  8. 在Windows中搭建python开发环境与使用初步(适合初学者)
  9. Educational Codeforces Round 112 (Rated for Div. 2) 个人题解
  10. 【19调剂】华中师范大学伍伦贡联合研究院单学位项目2019年报名和面试的通知...