group by 和聚合函数

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: group by 的基本用法                                                                                                                                                                                                          group by做为分组来使用,后面为条件,可以有多个条件,条件相同的为一组,配合聚合函数进行相关统计。

group by 的基本用法                                                                                                                                                                                                       

  group by做为分组来使用,后面为条件,可以有多个条件,条件相同的为一组,配合聚合函数进行相关统计。在不同数据库中用法稍有不同,这里只测试mysql和oracle。

1.准备好一张数据表:

             

 

                mysql                                                        oracle

2.首先以name为分组条件:

1 SELECT * FROM person 
2 GROUP BY `name`;

在mysql中执行结果如下:

分析:

  在mysql中没有强调select指定的字段必须属于group by后的条件。若符合条件的字段有多个,则只显示第一次出现的字段。比如:以name为dd分组,id为1,2,3,4,5,但只显示1.同理,age也只显示1.

然后,虽然这种查询在语法上通过了,但结果并没有什么意义,因为其他字段并非需要的准确值。这在oracle中就行不通了。

在oracle中执行结果如下:

 

分析:

  oracle指出,select查询字段未包含在group by 的条件中。推测,首先通过select * from person可以看到oracle中id并不是升序,或者说没有默认升序。也就是查询的结果是不确定的,hash?这可能涉及到在磁盘的存储等等,这里不去深究。因此,并不能确认第一次查出来的字段的值,而且分组后不是条件的值被合并后没有意义。

结论:

  group by语句中select指定的字段必须是“分组依据字段”。

因此,只能这样查询:

SELECT name FROM person 
GROUP BY name;

结果一致:

3.以name,age为查询依据,多条件分组

1 SELECT name,age FROM person 
2 GROUP BY name,age;

结果:

  

    mysql                   oracle

显然,两组的查询策略是不同的。但最终结果是相同的。都是以条件组合的笛卡尔积。也就是每个条件都一一对应。

分组依据为多条件组合成一个条件,当组合条件相同时为一组。因此,dd:1和dd:2分为两组。

4.添加聚合函数

聚合函数有如下几种:

函数 作用 支持性
sum(列名) 求和     
max(列名) 最大值     
min(列名) 最小值     
avg(列名) 平均值     
first(列名) 第一条记录 仅Access支持
last(列名) 最后一条记录 仅Access支持
count(列名) 统计记录数 注意和count(*)的区别

 

 首先,要明白聚合函数的用法。比如,count(列字段值),统计该字段值出现的次数:

1 SELECT name,COUNT(*) 
2 from person
3 GROUP BY name;

结果为:

分析:

  首先进行分组工作,group by name,这时8条数据被分成两组:dd和mm;然后count的作用就是统计每组里面的个数,分别是5和3.

更直观的例子:

SELECT * FROM person;

1 SELECT count(name) from person;

,count(name)为统计所有的name数量,同样的结果为count(1),count(*).

5.where 和 having

  • where 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,where条件中不能包含聚组函数,使用where条件过滤出特定的行。
  • having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件过滤出特定的组,也可以使用多个分组标准进行分组。

 

 

 





唯有不断学习方能改变! -- Ryan Miao
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
SQL 移动开发 开发工具
Hive 高阶--分组窗口函数--取值分组函数( LAG,LEAD,FIRST_VALUE,LAST_VALUE)|学习笔记
快速学习 Hive 高阶--分组窗口函数--取值分组函数( LAG,LEAD,FIRST_VALUE,LAST_VALUE)
386 0
|
10月前
GROUP BY语句规定
GROUP BY语句规定
45 0
|
10月前
ORDER BY子句
ORDER BY子句
35 0
|
SQL 存储 关系型数据库
group by聚合小技巧
group by聚合小技巧
53 0
|
SQL 分布式计算 Spark
SPARK Expand问题的解决(由count distinct、group sets、cube、rollup引起的)
SPARK Expand问题的解决(由count distinct、group sets、cube、rollup引起的)
559 0
SPARK Expand问题的解决(由count distinct、group sets、cube、rollup引起的)
GROUP BY 一个以上的列
GROUP BY 一个以上的列
71 1
|
SQL
GROUP BY 语句
GROUP BY 语句
62 0
|
SQL 索引
SQL去重是用DISTINCT好,还是GROUP BY好?
SQL去重是用DISTINCT好,还是GROUP BY好?
SQL去重是用DISTINCT好,还是GROUP BY好?
|
SQL 关系型数据库 MySQL
select、distinct、limit使用
select、distinct、limit使用
226 0
select、distinct、limit使用