全部章节   >>>>


本章目录

6.1 sum、max 和 min 聚合函数

6.1.1 聚合函数介绍

6.1.2 sum 函数

6.1.3 max/min 函数

6.2 avg 和 count 函数

6.2.1 avg 函数

6.2.2 count 函数

6.3 分组查询 group by 子句

6.3.1 group by 子句

6.3.2 创建分组

6.3.3 比较 order by 和 group by

6.3.4 使用 where 子句实现分组之前过滤数据

6.3.5 分组函数中的非聚合函数列

6.4 多字段分组和 having 子句

6.4.1 多字段分组

6.4.2 使用 having 指定分组后的筛选条件

6.4.3 比较 where 子句和 having 子句

6.4.4 group by 子句的 with rollup 选项

总结:


6.1 sum、max 和 min 聚合函数

6.1.1 聚合函数介绍

在数据库查询过程中,不仅只返回数据的基础信息,有时还需对这些数据进行统计和汇总。MySQL 提供了聚合函数,用于实现这些高级功能。

聚合函数用于对一组值进行计算并返回一个汇总值,使用聚合函数可以统计记录行数、计算某个字段值的总和以及这些值的最大值、最小值和平均值等。

 函数名称

功能

sum

返回选取的某列值的总和

max

返回选取的某列的最大值

min

返回选取的某列的最小值

avg

返回选取的某列的平均值

count

返回选取的某列或记录的行数

6.1.2 sum 函数

示例:计算所有线路总里程数。

select sum(miles) 线路总里程数 from line;

示例:计算公交二公司所属线路总里程数。

select sum(miles) 线路总里程数 from line where company=' 公交二公司 ';

示例: 对所有线路的总站点数进行汇总。

select sum(number) 线路总站点数 from line;

示例:计算起始站在南湖地区线路的总站点数。

select sum(number) 线路总站点数 from line where from_station like '% 古田 %' or end_station like '% 古田 %'

6.1.3 max/min 函数

示例:获取所有线路里程的最大值和最小值。

select max(miles) 最长线路里程 , min(miles) 最短线路里程 from line;

示例:查询年龄最大的公交司机的出生年月。

select min(birthday) 最年长司机生日 ,
ceil(datediff(curdate(),min(birthday))/365) 该司机年龄 from driver;

内置函数 curdate() 显示当前日期。
内置函数 datediff(date1,date2) 用于计算日期 date1 和 date2 之间相隔的天数。
内置函数 ceil(num1) 的值为大于等于 num1 的最小整数。
 

6.2 avg 和 count 函数

6.2.1 avg 函数

avg(column) 用于返回数字型字段 column 的平均值,注意:列值为 null 的字段不参与运算。

示例:获取线路里程的平均值。

select avg(miles) 平均里程数 from line;

示例:获取公交二公司所属线路的平均里程数。

select avg(miles) 平均里程数 from line where company=' 公交二公司 ';

6.2.2 count 函数

count 函数用于统计记录行数。使用 count 函数时,必须指定一个列的名称或使用“*”。使用“*”可获取整张表的记录行数。注意:列值为 null 的字段不参与运算。

示例:统计所有公交线路的数量。

select count(*) 线路数 from line;

select count(lineNo) 线路数 from line;

示例:统计出生年月大于 1985-1-1 之后的公交司机人数。

select count(*) AS 司机数 from driver where birthday>'1985-1-1';

示例:统计有出生记录的司机人数。

select count(birthday) AS 司机数 from driver;

select count(*) AS 司机数 from driver where birthday is not null;

6.3 分组查询 group by 子句

6.3.1 group by 子句

使用 group by 子句可以将数据划分到不同的组中,实现对记录的分组查询。group by 从英文字面的意义上可以理解为“根据(by)一定的规则进行分组(group)”,该子句的作用是通过一定的规则将一个数据集划分成若干个小的区域,然后针对这若干个小区域进行统计汇总。

group by 字段列表 [having 条件表达式 ]

6.3.2 创建分组

group by 子句通常与聚合函数同时使用,如 max()、min()、count()、sum() 和 avg()。

示例:统计每一家公交公司的线路数和线路长度平均值、最大值和最小值,按线路数升序显示。

分析:
  • 依据线路所属公司分组统计线路相关数据。
  • 线路数和线路里程的平均值、最小值和最大值均依据线路所属公司分组计算所得。
select company 公司 , count(*) 线路数 , truncate(avg(miles),1) 平均线路里程 , max(miles) 最长线路里程 , min(miles) 最短线路里程 from line
group by company order by count(*)
解释:函数 truncate(x,d) 用于返回 x 保留到小数点后 d 位的值。
 
 

示例:统计拥有不同运营车辆数的公交线路数量,按运营车辆数升序显示。

分析:
  • 依据运营车辆数的不同,分组统计其所对应的公交线路的数量。
  • 分组列为运营车辆数。
select number 运营车辆数, count(lineNo) 公交线路数 from line group by number order by number

6.3.3 比较 order by 和 group by

select * from line order by company;

select * from line group by company;

说明:通常情况下, group by 子句需要与聚合函数一同使用。

6.3.4 使用 where 子句实现分组之前过滤数据

统计非“通恒公司”所属线路的数量和营运里程的平均值、最大值和最小值,并按照线路数升序显示查询结果。

分析:
  • 分组之前需要把所属公司为非“通恒公司”的线路排除掉。
  • 分组列为“所属公司”。
select company 公司 , count(*) 线路数 , truncate(avg(miles),1) 平均线路里程 ,
max(miles) 最长线路里程 , min(miles) 最短线路里程 from line where company<> ' 通恒公司 ' group by company order by count(*)

6.3.5 分组函数中的非聚合函数列

思考:如果还想进一步获取每个公司所属线程里程最长的线路名,该如何编写 SQL 语句?

select company 公司 , lineNo 线路号 , max(miles) 最长线路里程 from line group by company

列出公交二公司所有线路的营运里程,按里程数升序显示:

select  lineNo 线路号 , miles 里程数 from line where company=' 公交二公司 ' order by milescompany

分析:

出现上述查询逻辑错误的原因在于:lineNo 为非聚合函数列,但却不是分组列字段。所以, 当我们在使用 group by 子句进行分组查询时,出现在 select 子句中的非聚合函数列一定要出现在 group by 子句的分组字段列表当中。

6.4 多字段分组和 having 子句

6.4.1 多字段分组

group by 子句的分组字段是一个字段列表,即 MySQL 支持按多个字段进行分组。具体的分组策略:分组优先级从左至右,即先按第一个字段进行分组,然后在第一个字段值相同的记录中,再根据第二个字段的值进行分组, 依次类推。

示例:依据公交线路所属公司和营运车辆数,分组统计平均营运里程。

select company 公司 , number 营运车辆数 , truncate(avg(miles),1) 平均营运里程 from line group by company, number

示例:依据公交车辆型号和车辆类型,分组统计车辆数。

select model 型号 , type 类型 , count(*) 车辆数 from vehicle group by model, type

6.4.2 使用 having 指定分组后的筛选条件

having 子句的作用是筛选满足条件的组,即在分组之后过滤数据。having 子句的位置放在 group by 子句之后,常包含聚合函数。

示例:分别统计每家公交公司中最长线路里程大于 24 的分组信息,按最长线路里程升序显示。

分析:
  • 依据公交公司分组统计求出每一家公司最长线路里程。
  • 对分组的结果使用 having 子句过滤得到最长线路里程大于 24 的分组信息。
select company 公司 , max(miles) 最长线路里程 from line
group by company having max(miles)>24 order by max(miles)

示例:依据公交车辆型号和车辆类型,统计车辆数大于 30 的分组信息,按车辆数降序显示。

分析:
  • 依据型号和类型分组统计求出车辆数。
  • 对分组的结果使用 having 子句过滤得到车辆数大于 30 的分组信息。
select model 型号 , type 类型 , count(*) 车辆数 from vehicle
group by model, type having 车辆数 >30 order by 车辆数 desc

6.4.3 比较 where 子句和 having 子句

示例:统计公交公司为非“通恒公司”的最长线路里程大于 24 的分组信息,按最长线路里程数升序显示。

分析:
  • 需要在分组之前排除“通恒公司”。
  • 按所属公司分组求出每家公司最长线路里程。
  • 使用 having 子句过滤出最长线路里程大于 24 的分组信息。
select company 公司 , max(miles) 最长线路里程 from line where company!=' 通恒公司 ' group by company having max(miles)>24 order by max(miles)

where:分组之前选择记录

having:分组之后过滤数据

注意:

having 子句和 where 子句均用于过滤数据,两者的区别在于:where 子句对结果集进行过滤筛选,而 having 子句则对分组的结果进行筛选。

6.4.4 group by 子句的 with rollup 选项

group by 子句将结果集分为若干个组,使用聚合函数可以对每个组内的数据进行信息统计,有时对各个组进行汇总计算时,需要在分组之后再加上一条汇总记录,这个任务可以通过 with rollup 选项来实现。

示例:统计每个公交公司的线路数量,并在查询结果集的最后一条记录后附上所有公交公司的总线路数。

select company 公司 , count(*) 线路数 from line  group by company with rollup

总结:

  • count 和 sum 函数的区别:

sum 函数是对符合条件的记录的数值列求和,count 函数的值是满足查询条件的结果(或记录)个数。count(column) 用于统计 column 列不为 null 的记录个数。

  • 如何对查询结果进行过滤之后再分组统计:

先使用 where 子句表达式对查询结果进行过滤筛选;然后,再使用 group by 子句对 where 子句的输出进行分组统计。

  • having 子句的用法:

having 子句的作用是筛选满足条件的组,即在分组之后过滤数据。having 子句的位置放在 group by 子句之后,常包含聚合函数。

MySQL数据操作与查询笔记 • 【第6章 聚合函数和分组查询】的更多相关文章

  1. $Django 聚合函数、分组查询、F,Q查询、orm字段以及参数

        一.聚合函数    from django.db.models import Avg,Sum,Max,Min,Count,F,Q   #导入    # .查询图书的总价,平均价,最大价,最小价 ...

  2. java:Hibernate框架3(使用Myeclipse逆向工程生成实体和配置信息,hql语句各种查询(使用hibernate执行原生SQL语句,占位符和命名参数,封装Vo查询多个属性,聚合函数,链接查询,命名查询),Criteria)

    1.使用Myeclipse逆向工程生成实体和配置信息: 步骤1:配置MyEclipse Database Explorer: 步骤2:为项目添加hibernate的依赖: 此处打开后,点击next进入 ...

  3. ORM中聚合函数、分组查询、Django开启事务、ORM中常用字段及参数、数据库查询优化

    聚合函数 名称 作用 Max() 最大值 Min() 最小值 Sum() 求和 Count() 计数 Avg() 平均值 关键字: aggregate 聚合查询通常都是配合分组一起使用的 关于数据库的 ...

  4. hibernate学习系列-----(5)hibernate基本查询下篇:hibernate聚合函数、分组查询及命名查询

    在上一篇中,大致学习了hibernate的基本查询:HQL基本查询,今天,继续昨天的步伐,继续学习hibernate的基本查询..... 1.hql聚合函数,先大致列一下hql的聚合函数有哪些吧: 在 ...

  5. MySQL数据操作与查询笔记 • 【目录】

    持续更新中- 我的大学笔记>>> 章节 内容 第1章 MySQL数据操作与查询笔记 • [第1章 MySQL数据库基础] 第2章 MySQL数据操作与查询笔记 • [第2章 表结构管 ...

  6. MySQL数据操作与查询笔记 • 【第7章 连接查询】

    全部章节   >>>> 本章目录 7.1 内连接查询 7.1.1 交叉连接(笛卡尔积) 7.1.2 内连接查询概要 7.1.3 内连接案例 7.1.4 自然连接 7.2 多表连 ...

  7. mysql 数据操作 单表查询 目录

    mysql 数据操作 单表查询 mysql 数据操作 单表查询 简单查询 避免重复DISTINCT mysql 数据操作 单表查询 通过四则运算查询 mysql 数据操作 单表查询 concat()函 ...

  8. mysql 数据操作 多表查询 目录

    mysql 数据操作 多表查询 准备 多表连接查询介绍 mysql 数据操作 多表查询 多表连接查询 笛卡尔积 mysql 数据操作 多表查询 多表连接查询 内连接 mysql 数据操作 多表查询 多 ...

  9. mysql 数据操作 单表查询 where 约束 目录

    mysql 数据操作 单表查询 where约束 between and or mysql 数据操作 单表查询 where约束 is null in mysql 数据操作 单表查询 where约束 li ...

随机推荐

  1. 案例 stm32的dma传输过程

    首先说一下:DMA_GetCurrDataCounter返回值是什么 返回值是dma缓存里还剩余多少空间. 上面本来应该是,发一下,改变一下.但是这里有一行是特殊的. long : 461,*ff l ...

  2. 节省内存的循环banner(一)

    循环banner是指scrollview首尾相连,循环播放的效果,使用非常广泛.例如淘宝的广告栏等. 如果是简单的做法可以把所有要显示的图片全部放进一个数组里,创建相同个数的图片视图来显示图片.这样的 ...

  3. vim使用配置(转)

    在终端下使用vim进行编辑时,默认情况下,编辑的界面上是没有行号的.语法高亮度显示.智能缩进等功能的. 为了更好的在vim下进行工作,需要手动配置一个配置文件: .vimrc 在启动vim时,当前用户 ...

  4. 视图View,获取视图大小

    一.获得LayoutInflater实例: LayoutInflater layoutInflater=LayoutInflater.from(context); 得到LayoutInflater实例 ...

  5. 解决CSV文件用Excel打开乱码问题

    这篇文章适合有一定编码基础的人看,纯手动解决乱码问题请参见: 转码保存后,重新打开即可. 转码操作如下: 编辑器->另存为->ASCII码格式文件/UTF-8含BOM格式->保存. ...

  6. 【Spring Framework】Spring入门教程(五)AOP思想和动态代理

    本文主要讲解内容如下: Spring的核心之一 - AOP思想 (1) 代理模式- 动态代理 ① JDK的动态代理 (Java官方) ② CGLIB 第三方代理 AOP概述 什么是AOP(面向切面编程 ...

  7. eclips 配置一个tomcat,启动多个不同端口的web项目

    前提: 记录这个文章是因为在网上查资料,很多都是,用eclips.配置多个tomcat,就像下面图这样配置两个tomcat 去启动不同的web: 运动多个web 项目,设置不同的端口,需要多个tomc ...

  8. Spring Cloud简单项目创建

    一.Zuul 原文链接 Zuul的主要功能是路由转发和过滤器.路由功能是微服务的一部分,比如/api/user转发到到user服务,/api/shop转发到到shop服务.zuul默认和Ribbon结 ...

  9. Spring中基于注解方式管理bean

    操作步骤 第一步:导入相关jar包 spring IoC的基本包 Spring支持注解的Jar包 第二步:创建Spring配置文件,ApplicationContext.xml 引入约束和开启注解扫描 ...

  10. 资源分配单位(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 那些分配了资源的任务,其中的资源是有数量单位的,默认工时单位是100%,材料单位是1. 比如某吃货,为了完成吃米饭这一任务 ...