全部章节   >>>>


本章目录

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. vim使用配置(转)

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

  2. maven依赖对zookeeper的版本冲突问题

    我用的是springcloudAlibaba+zookeeper zookeeper下载后 1,修改配置文件,conf目录下的zoo_sample.cfg修改为zoo.cfg. 2,打开zoo.cfg ...

  3. 30个类手写Spring核心原理之Ioc顶层架构设计(2)

    本文节选自<Spring 5核心原理> 1 Annotation(自定义配置)模块 Annotation的代码实现我们还是沿用Mini版本的,保持不变,复制过来便可. 1.1 @GPSer ...

  4. Centos 常用指令

    1.*.tar 用 tar  xvf 解压 2.*.gz 用 gzip  d或者gunzip 解压 3.*.tar.gz和*.tgz 用 tar xzf 解压 4.*.bz2 用 bzip2 d或者用 ...

  5. Mysql资料 用户权限详解

    目录 一.MySQL权限详解 设置MySQL用户资源限制 用户资源限制执行操作 二.MySQL权限级别介绍 MySQL权限级别 MySQL创建权限 MySQL删除与插入权限 MySQL修改与触发器权限 ...

  6. Tableau如何绘制多边形地图

    一.把省\自治区拖拽至标记生成地图二.把销售额拖拽至标记 三.地图-地图层-冲蚀100% 四.最终结果如图所示

  7. 『学了就忘』Linux系统管理 — 81、进程管理介绍

    目录 1.进程与线程的概念 2.什么是进程管理 3.进程管理的作用 4.Linux进程的几种状态 5.进程与线程的关系 (1)线程与进程的关系 (2)总结 1.进程与线程的概念 来源百度百科: 进程( ...

  8. python解释器安装指导教程

    python解释器安装指导教程 1.官网下载 进入官网https://www.python.org/,在download下选择符合操作系统的版本 在找到合适的版本后选择相应的安装文件下载 2.进行安装 ...

  9. WHUCTF PWN题目

    花了大概两天时间来做WHUCTF的题目,第一次排名这么靠前.首先感谢武汉大学举办这次萌新赛,也感谢fmyy的师傅的耐心指导,让我第一次做出堆的题目来. pwnpwnpwn 这是一道栈题目,32位程序, ...

  10. Python第二周 str的方法

    str.start #!/usr/bin/env python # Author:Zhangmingda while True: cmd = input('输入字符:')#.strip() print ...