SQL 聚合、分组和排序


Posted in MySQL onNovember 11, 2021

 

一、聚合查询

在访问数据库时,经常要对表中的某列数据进行统计汇总,如求和、最大值、最小值、平均值等,这时就需要使用聚合函数,所谓聚合函数,就是用于汇总的函数,聚合就是将多行汇总为一行,

常见的聚合函数如下:

1、COUNT 函数

count函数用于统计表中记录行数。

例如,计算全部数据的行数:

SELECT COUNT(*) FROM users;

注意: COUNT(*)会得到包含空值NULL的数据行数,若想排除包含NULL的数据行,可以使用count(字段名),会得到NULL之外的数据行数。

SELECT COUNT(user_name) FROM users;

2、SUM 函数

用于计算任意列中数据的和。

例如,计算所有用户的年龄之和:

SELECT sum(age) FROM users;

3、AVG 函数

用于计算任意列中数据的平均值。

例如,计算所有用户的年龄平均值:

SELECT AVG(age) FROM users;

4、MAX 函数和 MIN 函数

MAX函数用于计算任意列中数据的最大值,MIN函数用于计算任意列中数据的最小值。

例如,计算所有用户中的年龄的最大值和最小值:

SELECT MAX(age),MIN(age) FROM users;

注意: MAX函数和MIN函数几乎适用于所有数据类型的列,SUM函数和AVG函数只适用于数值类型的列。

二、分组查询

聚合函数是对表中所有数据进行统计汇总,还可以使用GROUP BY子句先把数据分成若干组,再进行统计汇总。

语法格式:

SELECT <字段名>,... FROM <表名> GROUP BY <字段名>,...;

例如,按照用户所在城市进行分组统计每个城市用户的和:

SELECT city,count(*) FROM users GROUP BY city;
+-------+----------+
| city  | count(*) |
+-------+----------+
| 北京  |       60 |
| 上海  |       45 |
| NULL  |       80 |
| 济南  |       12 |
+-------+----------+

通过结果可以看出,字段为NULL的也会被列为一个分组。如果想要排除在外,可以使用WHERE子句。

SELECT city,count(*) FROM users WHERE city IS NOT NULL GROUP BY city;

三、对聚合结果进行过滤

当我们使用GROUP BY子句分组的时候,有时候就需要对分组的聚合结果进行过滤,我们可能首先会想到使用WHERE子句,其实并不是,而是用HAVING子句,HAVING的作用和WHERE一样,都是起到过滤的作用,只不过WHERE是用于数据行的过滤,而HAVING则用于分组聚合结果的过滤。

例如,按照用户的所在城市进行分组,并且筛选分组中用户数量大于40的组:

SELECT city,COUNT(*) AS num FROM users GROUP BY city HAVING num>40;

再比如:按照用户的所在城市进行分组,并且筛选分组中用户平均年龄小于25的组。

SELECT city,AVG(age) AS avg_age FROM users GROUP BY city HAVING avg_age<25;

1、HAVING 子句的构成要素

HAVING子句中能够使用的3种要素:

  • 常数
  • 聚合函数
  • GROUP BY子句中指定的列名(即聚合键)

四、对查询结果进行排序

SQL查询中可以用到排序,对数据进行升序(ASC)或降序排列(DESC),默认是升序。

语法格式:

SELECT <字段名>,... FROM <表名> ORDER BY <字段名> ASC/DESC,...;

例如:对users表中的记录按照年龄升序排列:

SELECT * FROM users ORDER BY age ASC;

注意: 升序ASC可以省去不写,但是降序DESC必须要写。

例如,对users表中的记录按照年龄降序排列:

SELECT * FROM users ORDER BY age DESC;

1、 指定多个排序键

ORDER BY子句中可以指定多个排序键,例如,对users表中的记录按照年龄降序、注册时间升序排列:

SELECT * FROM student ORDER BY age DESC,register_time ASC;

多个字段排序时中间用“,”隔开。

2、 使用聚合函数排序

 ORDER BY子句中还可以使用聚合函数的结果进行排序。

例如,按照用户的所在城市进行分组,并且按照分组的用户数量进行排序:

SELECT city,COUNT(*) AS num FROM users GROUP BY city ORDER BY num;

到此这篇关于SQL 聚合、分组和排序的文章就介绍到这了,更多相关SQL 聚合、分组和排序内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
MySQL创建高性能索引的全步骤
May 02 MySQL
MySQL 如何分析查询性能
May 12 MySQL
MySQL中VARCHAR与CHAR格式数据的区别
May 26 MySQL
探究Mysql模糊查询是否区分大小写
Jun 11 MySQL
mysql联合索引的使用规则
Jun 23 MySQL
MySQL 如何限制一张表的记录数
Sep 14 MySQL
MySQL定时备份数据库(全库备份)的实现
Sep 25 MySQL
mysql创建存储过程及函数详解
Dec 04 MySQL
一条慢SQL语句引发的改造之路
Mar 16 MySQL
一条 SQL 语句执行过程
Mar 17 MySQL
Mysql将字符串按照指定字符分割的正确方法
May 30 MySQL
MySQL表字段数量限制及行大小限制详情
Jul 23 MySQL
SQL基础的查询语句
Nov 11 #MySQL
MySQL之select、distinct、limit的使用
Nov 11 #MySQL
MySQL表类型 存储引擎 的选择
Nov 11 #MySQL
一文带你探究MySQL中的NULL
Nov 11 #MySQL
mysql函数全面总结
Nov 11 #MySQL
MYSQL 运算符总结
Nov 11 #MySQL
MySQL 数据类型详情
Nov 11 #MySQL
You might like
Php Image Resize图片大小调整的函数代码
2011/01/17 PHP
ThinkPHP3.1新特性之动态设置自动完成和自动验证示例
2014/06/19 PHP
浅谈PHP中的错误处理和异常处理
2017/02/04 PHP
jquery中dom操作和事件的实例学习 仿yahoo邮箱登录框的提示效果
2011/11/30 Javascript
使用jQuery validate 验证注册表单实例演示
2013/03/25 Javascript
jquery删除数据记录时的弹出提示效果
2014/05/06 Javascript
Express.JS使用详解
2014/07/17 Javascript
jQuery实现html表格动态添加新行的方法
2015/05/28 Javascript
jQuery购物车插件jsorder用法(支持后台处理程序直接转换成DataTable处理)
2016/06/08 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(放大缩小)
2016/12/02 Javascript
axios全局请求参数设置,请求及返回拦截器的方法
2018/03/05 Javascript
浅谈在vue中使用mint-ui swipe遇到的问题
2018/09/27 Javascript
微信小程序实现打卡日历功能
2020/09/21 Javascript
[01:04:48]VGJ.S vs TNC Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
[01:03:03]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
Python grequests模块使用场景及代码实例
2020/08/10 Python
Python字符串及文本模式方法详解
2020/09/10 Python
详解python polyscope库的安装和例程
2020/11/13 Python
HTML5触摸事件(touchstart、touchmove和touchend)的实现
2020/05/08 HTML / CSS
AmazeUI导航的示例代码
2020/08/14 HTML / CSS
HMV日本官网:全球知名的音乐、DVD和电脑游戏零售巨头
2016/08/13 全球购物
世界上最全面的汽车零部件和配件集合:JC Whitney
2016/09/04 全球购物
POP文化和音乐灵感的时尚:Hot Topic
2019/06/19 全球购物
shell程序中如何注释
2012/02/17 面试题
网上快餐厅创业计划书
2014/02/01 职场文书
读书之星事迹材料
2014/05/12 职场文书
廉洁校园实施方案
2014/05/25 职场文书
婚礼女方父母答谢词
2015/01/04 职场文书
小学英语复习计划
2015/01/19 职场文书
大学生助学金感谢信
2015/01/21 职场文书
给老婆的检讨书(搞笑版)
2015/05/06 职场文书
小学感恩主题班会
2015/08/12 职场文书
基于Golang 高并发问题的解决方案
2021/05/08 Golang
详解Java实现设计模式之责任链模式
2021/06/23 Java/Android
20180830晚上第一届KSL半决赛 雨神vs解冻(二龙 三炮解说)
2022/04/01 星际争霸
Python使用plt.boxplot()函数绘制箱图、常用方法以及含义详解
2022/08/14 Python