当前位置: 首页 > news >正文

SQL之聚集函数和数据分组

现实需求中,我们经常需要返回的是找出某一列的最大值、最小值、平均值、总和、行数等。所以不需要返回每一行的实际数据,浪费资源。
SQL提供了以下五种聚集函数来实现统计信息的返回。
AVG()
MAX()
MIN()
COUNT()
SUM()
举例子:
select AVG(price) AS avg
from table;
AS表示别名,可以让返回的列名更直观。

COUNT主要用来返回行的数目。
如果是COUNT(*),则返回表中所有行的数目,不管有没有列是空值。
COUNT(column),则会忽略NULL值所在的行。

SUM聚集函数中还可以组合算术运算。
select SUM(price*num) AS total
from table;

2.分组数据
以上我们可以对所有数据进行匹配或对where子句指定的行进行匹配,但是,如果我们需要对某列进行分组,以每一组的形式返回数据怎么办呢,就需要用到group by ,having将数据分成多个逻辑组,对每个逻辑组进行聚集计算。
例如,我们想要知道每个学生选了几门课:
select name, COUNT(*) AS num_class
from table
GROUP BY name;
GROUP BY 子句命令数据库对每个名字(每个人)计算课程数目,而不是所有人。最后以名字为组返回结果。

having过滤分组
比如,我们需要从上面的分组中过滤掉选课数目少于5门的同学,则需要用到HAVING,为什么不能用where来过滤呢,因为这里的课程数目是基于分组的聚集值,而where是针对行的,不能完成任务。
比如:
select name, COUNT(*) AS num_class
from table
GROUP BY name
HAVING COUNT( * )>=5;

那么,是不是在GROUP BY中不能用where呢,并不是。有时候where和having都要用,where用于在数据分组前进行过滤,having在分组后进行过滤。比如,需要返回选了五门课以上且每门课成绩大于60的同学。
select name, COUNT(*) AS num_class
from table
where grade>60
GROUP BY name
HAVING COUNT( * )>5;
这里的成绩是针对每门课而言的,需要用where过滤,不包括在分组中,符合成绩的课程数量是针对分组而言的。

如果想要分组的结果按照某一列顺序排序,可以在最后加上ORDER BY grade ASC/DESC
ORDER BY一定是放在最后的。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C语言进阶——文件操作
  • 【C++笔试强训】第三天
  • 【JDBC】入门增删改查
  • 螺旋探索与自适应混合变异的麻雀搜索-附代码
  • 精品基于PHP实现的好物优购商城|电商小程序
  • 求解大规模优化问题的改进正弦余弦算法
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • [系统安全] 逆向工程进阶篇之对抗逆向分析
  • 二十三、Hive本地模式安装
  • Spring Cloud Alibaba — 0、服务架构演变
  • 实战 - AES对称加密算法加密和解密设备联动码
  • IDEA统计项目代码量
  • 图像处理:推导五种滤波算法(均值、中值、高斯、双边、引导)
  • 【光学】基于matlab GUI双缝干涉和牛顿环【含Matlab源码 2165期】
  • 合宙AIR32F103CBT6刷回CMSIS-DAP固件以及刷ST-LINK V2-1固件方法
  • php的引用
  • Akka系列(七):Actor持久化之Akka persistence
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • Invalidate和postInvalidate的区别
  • JavaScript实现分页效果
  • js中的正则表达式入门
  • laravel5.5 视图共享数据
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • react 代码优化(一) ——事件处理
  • Redis 懒删除(lazy free)简史
  • Shadow DOM 内部构造及如何构建独立组件
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • 大快搜索数据爬虫技术实例安装教学篇
  • 检测对象或数组
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 悄悄地说一个bug
  • 如何胜任知名企业的商业数据分析师?
  • 用简单代码看卷积组块发展
  • 鱼骨图 - 如何绘制?
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 终端用户监控:真实用户监控还是模拟监控?
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • # Redis 入门到精通(一)数据类型(4)
  • ###项目技术发展史
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (12)Hive调优——count distinct去重优化
  • (13)DroneCAN 适配器节点(一)
  • (8)STL算法之替换
  • (Charles)如何抓取手机http的报文
  • (Note)C++中的继承方式
  • (poj1.3.2)1791(构造法模拟)
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (佳作)两轮平衡小车(原理图、PCB、程序源码、BOM等)
  • (七)Java对象在Hibernate持久化层的状态
  • (一)Java算法:二分查找
  • (转)iOS字体
  • (转)使用VMware vSphere标准交换机设置网络连接
  • .bat批处理(六):替换字符串中匹配的子串
  • .NET C# 操作Neo4j图数据库
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置