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 相关文章推荐
如何使用Maxwell实时同步mysql数据
Apr 08 MySQL
MySQL时间盲注的五种延时方法实现
May 18 MySQL
MySQL系列之十 MySQL事务隔离实现并发控制
Jul 02 MySQL
MYSQL 的10大经典优化案例场景实战
Sep 14 MySQL
MySQL悲观锁与乐观锁的实现方案
Nov 02 MySQL
彻底解决MySQL使用中文乱码的方法
Jan 22 MySQL
一文了解MySQL二级索引的查询过程
Feb 24 MySQL
一条慢SQL语句引发的改造之路
Mar 16 MySQL
简单聊一聊SQL注入及防止SQL注入
Mar 23 MySQL
MySQL普通表如何转换成分区表
May 30 MySQL
MySQL详解进行JDBC编程与增删改查方法
Jun 16 MySQL
MySQL详细讲解变量variables的用法
Jun 21 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
正则表达式语法
2006/10/09 Javascript
php 文件上传代码(限制jpg文件)
2010/01/05 PHP
php Smarty初体验二 获取配置信息
2011/08/08 PHP
Linux fgetcsv取得的数组元素为空字符串的解决方法
2011/11/25 PHP
通过table标签,PHP输出EXCEL的实现方法
2013/07/24 PHP
php实现XML和数组的相互转化功能示例
2017/02/08 PHP
详解Yii2 之 生成 URL 的方法
2017/06/16 PHP
php使用scandir()函数扫描指定目录下所有文件示例
2019/06/08 PHP
在视频前插入广告
2006/11/20 Javascript
Convert Seconds To Hours
2007/06/16 Javascript
javascript 构建一个xmlhttp对象池合理创建和使用xmlhttp对象
2010/01/15 Javascript
jQuery 表格插件整理
2010/04/27 Javascript
前端开发的开始---基于面向对象的Ajax类
2010/09/17 Javascript
JavaScript 一道字符串分解的题目
2011/08/03 Javascript
原始的js代码和jquery对比体会
2013/09/10 Javascript
基于Bootstrap的后台管理面板 Bootstrap Metro Dashboard
2016/06/17 Javascript
Angular2数据绑定详解
2017/04/18 Javascript
vue-cli入门之项目结构分析
2017/04/20 Javascript
vue2.X组件学习心得(新手必看篇)
2017/07/05 Javascript
动态加载权限管理模块中的Vue组件
2018/01/16 Javascript
浅谈对于react-thunk中间件的简单理解
2019/05/01 Javascript
JS中的算法与数据结构之列表(List)实例详解
2019/08/16 Javascript
2分钟实现一个Vue实时直播系统的示例代码
2020/06/05 Javascript
实例讲解React 组件
2020/07/07 Javascript
[04:50]2019DOTA2高校联赛秋季赛四强集锦
2019/12/27 DOTA
Python创建对称矩阵的方法示例【基于numpy模块】
2017/10/12 Python
python scatter散点图用循环分类法加图例
2019/03/19 Python
Flask模板引擎Jinja2使用实例
2020/04/23 Python
CSS3中媒体查询结合rem布局适配手机屏幕
2019/06/10 HTML / CSS
荷兰之家英文站:Holland at Home
2016/10/26 全球购物
英国玛莎百货新西兰:Marks & Spencer New Zealand
2019/07/21 全球购物
俄罗斯披萨、寿司和面食送货到家服务:2 Берега
2019/12/15 全球购物
公司贷款承诺书
2014/05/30 职场文书
个人作风建设总结
2014/10/23 职场文书
法定代表人证明书
2014/11/28 职场文书
2019奶茶店创业计划书范本!
2019/07/15 职场文书