一、汇总数据

工作中经常需要汇总数据而不是将它们全部检索出来(实际数据本身:返回实际数据是对时间和处理资源的浪费),这种类型的检索有以下特点:

①确定表中的行数(或者满足某个条件或包含某个特定值的行数)

②获得表中行组的和

③找出表列(或所有行或某些特定的行)的最大值、最小值和平均值

聚集函数(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(五)汇总和分组数据相关推荐

  1. mysql五补充部分:SQL逻辑查询语句执行顺序

    mysql五补充部分:SQL逻辑查询语句执行顺序一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SE ...

  2. MySQL 五.索引与算法

    MySQL 五. 索引与算法 索引太多,插入时性能会受到影响, 应用程序的性能会受到影响;索引太少,查询时候的性能又比较底,所以说索引的创建要考虑其中的平衡点; 5.1 InnoDB存储引擎索引 B+ ...

  3. javaee jsp实现留言板(eclipse+mysql),五个界面,留言、登陆、注册等

    本文转载自http://yanzw.cn/,点击跳转原地址,源码请访问http://yanzw.cn/er/about获取 javaee jsp实现留言板(eclipse+mysql),五个界面,留言 ...

  4. mysql 聚合函数求乘积_手把手教你mysql(五)聚合函数

    手把手教你mysql(五)聚合函数 一: 聚合函数 1.1.COUNT()函数 1. COUNT()函数用来统计记录的条数: 2. 与GOUPE BY 关键字一起使用: 我这边仍然使用的是t_stud ...

  5. java-ajax与mysql五表联动2----商品管理

    承接上回http://t.csdn.cn/8eLi3 需求图示: 目录 承接上回java-ajax与mysql五表l联动 一.设计数据库表 二.参照数据库表的属性完成实体包 1.Goods包 2.实现 ...

  6. MYSQL 【汇总数据】 【分组数据】 学习记录

    分组数据 1,创建分组: 转载于:https://www.cnblogs.com/clphp/p/5379154.html

  7. Mysql完结汇总篇(18万字送给你),完结撒花

    hello大家好,我是黎杜,上一篇写了关于Mysql的日志篇,有兴趣的可以看一看,距离上一次的写完了JVM的调优所有部分:如何啃下JVM这座大山,完结撒花(完结篇),这些词也写完了关于Mysql的所有 ...

  8. mysql 上个月 汇总_还是问一个mysql的查询汇总的汇总问题

    本帖最后由 setoy 于 2013-12-18 18:11:02 编辑 有五个人,uid分别是1-5 有对着这五个人打分的表格(某个人有可能没有得到过分数) id uid scroe-------- ...

  9. mysql五-1:单表查询

    一 介绍 本节内容: 查询语法 关键字的执行优先级 简单查询 单条件查询:WHERE 分组查询:GROUP BY HAVING 查询排序:ORDER BY 限制查询的记录数:LIMIT 使用聚合函数查 ...

最新文章

  1. c语言if判断正确却不进函数,C语言初学者,为什么满足if条件却不进入,求大老解惑...
  2. python3入门到精通pdf-Python3入门到精通实战特训
  3. ASP.NET CORE MVC 2.0 发布到IIS 配置问题
  4. 方差标准差,均方误差均方根误差,平均绝对误差
  5. PRAM模型与Amdahl定律
  6. debian安装mediawiki教程
  7. 计算机系统启动项设置密码,电脑开机第一道密码怎么设置 - 卡饭网
  8. android 色彩管理,你买的贵价屏幕只是半成品?谈谈色彩管理那点事
  9. 繁华落尽——王思聪的熊猫直播之死,是腾讯对360的又一次胜利
  10. linux安装glib,glib源码安装使用方法
  11. Python 基于OpenCV 在一张图片上叠加点
  12. windows大小写,切换键修改lock or shift
  13. Gauss 消元法矩阵LU分解
  14. 秦始皇修路(最小生成树+LCA)
  15. 2021 蓝桥杯省赛第一场 C++ 大学 B 组
  16. java jdom 更新xml_用JDOM完成Java更新XML文件
  17. 搭载广和通5G LAN模组FM650-CN的5G工业网关已率先商用落地
  18. 【韩流馆科技】大博智能家居带你体验创新科技世界
  19. python的Scrapy框架安装报错:building 'twisted.test.raiser' extension error
  20. openlayers 百度地图_近期内推职位集锦:知乎+车好多+三星+数码视讯+百度

热门文章

  1. c++中的pod类型
  2. ARP欺骗:先认识再防御
  3. 用Python实现插⼊排序
  4. 第四期直播分享预告-高薪offer指南
  5. ElasticSearch 性能优化实战,让你的 ES 飞起来!
  6. RabbitMQ管理(3)——Web端管理
  7. FFmpeg 和自由软件社区的更新
  8. 2021 音视频技术趋势不完全预测
  9. 李幸原:看好实时音视频在教育与医疗的前景
  10. 观察:谁能拯救视频平台的高昂带宽成本?