MySQL(五)汇总和分组数据
一、汇总数据
工作中经常需要汇总数据而不是将它们全部检索出来(实际数据本身:返回实际数据是对时间和处理资源的浪费),这种类型的检索有以下特点:
①确定表中的行数(或者满足某个条件或包含某个特定值的行数)
②获得表中行组的和
③找出表列(或所有行或某些特定的行)的最大值、最小值和平均值
聚集函数(aggregate function):运行在行组上,计算和返回单个值的函数(MySQL还支持一些列的标准偏差聚集函数);
SQL聚集函数如下表:

1、avg()函数
avg()通过对表中行数计数并计算特定列值之和,求得该列的平均值;avg()可用来返回所有列平均值,也可用来返回特定列的平均值;
select avg(prod_price) as avg_price from pfoducts;
此select语句返回值avg_price,它包含producs表中所有产品的平均价格,avg_price是一个别名;
avg()也可以用来确定特定列或行的平均值,例子如下:
select avg_(prod_price) as avg_price from products where vend_id = 1003;
这条SQL语句包含了where子语句,仅过滤出vend_id为1003的产品,avg_price中返回该供应商的产品的平均值;
PS:avg()只能用来确定特定数值列的平均值,而且列名必须作为函数参数给出,为了获得多个列的平均值,必须使用多个avg()函数{avg()函数忽略列值为NULL的行};
2、count()函数
count()函数进行计数,可利用count()确定表中行的数目或符合特定条件的行的数目;
count()函数有两种使用方式:
①使用count(*)对表中行的数目进行计数,不管表列中包含的是空值(null)还是非空值;
②使用count(column)对特定列中具有值的行进行计数,忽略null值;
select count(*) as num_cust from customers;
这条SQL语句利用count(*)对customers表中所有行计数,计数值在num_cust中返回;
select count(cust_email) as cum_cust from customers;
这条SQL语句使用count(cust_email)对cust_email列中有值的行进行计数;
PS:如果指定列名,则指定列的值为空的行被count()函数忽略,但如果count()函数中用的是星号(*),则不忽略;
3、max()函数
max()返回指定列中的最大值,max()要求指定列名,例子如下:
select max(prod_price) as max_price from products;
这条SQL语句中国返回products表中price列的最大值;
PS:MySQL允许max()用来返回任意列中的最大值,包括返回文本列的最大值;但用于文本数据时,如果数据按相应的列排序,则max()返回最后一行(max()函数忽略列值为null的行)
4、min()函数
min()返回指定列的最小值,min()也要求指定列名,例子如下:
select min(prod_price) as min_price from products;
这条SQL语句中min()返回products表中price列最小值;
PS:MySQL允许min()用来返回任意列中的最小值,包括返回文本列的最小值;但用于文本数据时,如果数据按相应的列排序,则min()返回最前面的行(min()函数忽略列值为null的行)
5、sum()函数
sum()函数用来返回指定列值的和(总计);例子如下:
select sum(quantity) as items_ordered from orderitems where order_num = 20005;
函数sum()返回orderitems中所有quantity列的值之和,where子句保证只统计某个指定列的数值;
PS:利用标准的算数操作符,所有聚集函数都可用来执行多个列上的计算(sum()函数忽略列值为null的行)
6、distinct与聚集函数
MySQL5.0.3以及之后的版本,聚集函数和distinct可以搭配使用,比如:
①对所有的行执行计算,指定all参数或不给参数(all是默认所有行为,不需要指定,如果不指定distinct,则假定为all);
②只包含不同的值,指定distinct参数;
③如果指定列名,则distinct只能用于count();distinct不能用于count(*),因此不允许使用count(distinct);distinct必须使用列名,不能用于计算或者表达式;
select avg(distinct prod_price) as avg_price from products where vend_id = 1003;
这条SQL语句中,使用avg()函数返回vend列中vend_id=1003的对应的price平均价格,因为使用了distinct参数,因此平均值只考虑不同的值(唯一值)
7、组合聚集函数
select语句可以包含多个聚集函数,比如:
select count(*) as num_items,
min(prod_price) as price_min,
max(prod_price) as price_max,
avg(prod_price) as price_avg
from products;
这条SQL语句,使用了单条select语句执行4个聚集计算,返回四个值(products表中items的数目、price的最高、最低以及平均值)
PS:在指定别名以包含某个聚集函数的结果时,不应该使用表中实际的列名;这样便于使用SQL更加容易和理解,以及排除方便排除错误。
二、分组数据
1、group by创建分组
在MySQL中,分组是在select语句中的group by子句中建立的,比如:
select vend-id,count(*) as num_prods from products group by vend_id;
这条SQL语句指定了2个列,group by指示MySQL按照vend_id排序并且分组(如果使用group by,则不必指定要计算的每个组)
group by子句指示指示MySQL分组数据,然后都每个组而不是整个结果集进行聚集;关于group by使用,请注意以下规则:
①group by子句可以包含任意数目的列(使得对分组进行嵌套,为数据分组提供更细致的控制);
②如果在group by子句中嵌套分组,数据将在最后规定的分组上进行汇总,即:建立分组时,指定的所有列都一起计算(所以不能从个别列取回数据);
③group by子句中列出的每个列都必须是检索列或有效的表达式(但不能是聚集函数),如果在select中使用表达式,则必须在group by子句中指定相同的表达式(不能使用别名);
④除了聚集计算语句外,select中每个列都必须在group by子句中给出;
⑤如果分组列中具有null值,则null将作为一个分组返回(如果列中有多行null值,他们将分为一组);
⑥group by子句必须出现在where子句之后,order by子句之前;
PS:使用with rollup关键字,可以得到每个分组以及每个分组汇总级别(针对每个分组)的值。
2、having过滤分组
where子句都可以用having代替,区别在于where过滤行,having过滤分组;having支持所有的where操作符,比如:
select cust_id,count(*) as orders from orders group by cust_id having count(*) >= 2;
这条SQL语句中的having子句过滤count(*)>=2(2个以上的分组)的那些分组;
having和where的区别:
where在数据分组前进行过滤,having在数据分组后进行过滤;where排除的行不包括在分组中(这可能会改变计算值,从而影响having子句中基于这些值过滤掉的分组)
having和where可以同时使用,比如:
select vend_id, count(*) as num_prods from products where prod_price>=10 group by vend_id having count(*)>= 2;
这条SQL语句中,where子句过滤掉所有prod_price至少为10的行,然后按照vend_id分组数据;having子句过滤技术为2或2以上的分组;
3、分组和排序
group by和order by的区别:

order by的重要性:一般使用group by子句时,应该也给出order by子句,这是保证数据正确性的唯一方法(千万不要依赖group by排序数据)。
4、select子句顺序

MySQL(五)汇总和分组数据的更多相关文章
- MySQL数据库— 汇总和分组数据
一 汇总和分组数据 查询语句 ---> 结果集(多条数据) ---> 聚合函数 ----> 单行记录 1.常用的聚合函数: sum() 数字 ...
- MySQL数据库7 - 汇总和分组数据
一 汇总和分组数据 查询语句 ---> 结果集(多条数据) ---> 聚合函数 ----> 单行记录 1.常用的聚合函数: sum() 数字 ...
- MySQL笔记汇总
[目录] MySQL笔记汇总 一.mysql简介 数据简介 结构化查询语言 二.mysql命令行操作 三.数据库(表)更改 表相关 字段相关 索引相关 表引擎操作 四.数据库类型 数字型 字符串型 日 ...
- MySQL登录汇总
--MySQL登录汇总 --------------------2014/5/17 1. ERROR 1045错误ERROR 1045 (28000): Access denied for user ...
- MySQL优化汇总
1)mysql优化汇总,转载自网络
- Mysql查询优化汇总 order by优化例子,group by优化例子,limit优化例子,优化建议
Mysql查询优化汇总 order by优化例子,group by优化例子,limit优化例子,优化建议 索引 索引是一种存储引擎快速查询记录的一种数据结构. 注意 MYSQL一次查询只能使用一个索引 ...
- MYSQL 【汇总数据】 【分组数据】 学习记录
分组数据 1,创建分组:
- 快速回顾MySQL:汇总和分组
10.3 汇总数据 我们经常需要汇总数据而不用把它们实际检索处出来,为此MySQL提供了专门的函数.使用这些函数,MySQL查询可用于检索数据,以便分析和报表的生成.这种类型的检索例子有以下几种: 确 ...
- MySQL1:MySQL函数汇总
前言 MySQL提供了众多功能强大.方便易用的函数,使用这些函数,可以极大地提高用户对于数据库的管理效率,从而更加灵活地满足不同用户的需求.本文将MySQL的函数分类并汇总,以便以后用到的时候可以随时 ...
随机推荐
- 【读书笔记】iOS-个人开发者与企业开发者的区别
个人开发者与企业开发者的一个主要的区别在于独立开发者授权描述文件必须列出具体的设备.另一个不同就是开发者账户最多使用100台设备,而企业则可以让苹果公司生成未锁定到特定设备并可以安装到任何设备上的授权 ...
- 自定义控件详解(一):Paint类与Canvas类
前言: 自定义控件必需的两个类:Paint与Canvas Paint --- 相当于绘图的"笔" Canvas --- 相当于绘图的"纸" 一.Pain ...
- 原来这样就可以开发出一个百万量级的Android相机
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由QQ空间开发团队发表于云+社区专栏 最近我负责开发了一个跟Android相机有关的需求,新功能允许用户使用手机摄像头,快速拍摄特定尺寸 ...
- Sqlautocode使用过程的一些坑
Sqlautocode是SQLAlchemy一个数据库映射工具,可以将数据库文件映射为python代码,直接在程序中移植使用.最近在使用过程中遇到了一些坑,通过用代码编辑工具pycharm阅读源码和多 ...
- Ubuntu18---安装Redis和简单使用Redis
前言 Redis是常用基于内存的Key-Value数据库,比Memcache更先进,支持多种数据结构,高效,快速.用Redis可以很轻松解决高并发的数据访问问题:作为实时监控信号处理也非常不错. 环境 ...
- Django 添加mdia文件目录路径
1.settings.py MEDIA_URL = '/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 2.urls.py from djan ...
- 洗礼灵魂,修炼python(42)--巩固篇—type内置函数与类的千丝万缕关系
type函数的隐藏属性 相信大家都知道内置函数type是用来查看对象的数据类型的.例: 那比如我对int类查看类型呢? 有朋友会说,int是内置类啊,用自定义的应该不会这样,我们自定义一个类呢? 还是 ...
- 高德地图JS API 开发小结
项目中有一块功能要用到高德地图,所以,想把编码小结一下. 首先是地图的初始化 var map = new AMap.Map("mapDiv", { ...
- Arch Linux 更新源(以清华 arch 源为例)
Arch Linux 编辑/etc/pacman.d/mirrorlist,在文件最顶端添加: Server = https://mirrors.tuna.tsinghua.edu.cn/archl ...
- Django框架的使用教程--类视图-中间间-模板[六]
类视图 类视图的使用 视图函数 class class_view(View): """类视图""" def get(self, reques ...