PostgreSQL聚合函数介绍以及分组和排序


Posted in PostgreSQL onApril 12, 2022

聚合函数

用于汇总的函数。

COUNT

COUNT,计算表中的行数(记录数)。

计算全部数据的行数:

SELECT COUNT(*)
  FROM Product;

NULL之外的数据行数:

SELECT COUNT(purchase_price)  FROM Product;

结果如下图。

PostgreSQL聚合函数介绍以及分组和排序

对于一个含NULL的表:

将列名作为参数,得到NULL之外的数据行数;将星号作为参数,得到所有数据的行数(包含NULL)。

SUM、AVG

SUM、AVG函数只能对数值类型的列使用。

SUM,求表中的数值列的数据的和。

SELECT SUM(sale_price)  FROM Product;

purchase_price里面的数据有NULL,四则运算中存在NULL,结果也是NULL,但这里面结果不是NULL。

这是因为,聚合函数以列名为参数,计算的时候会排除NULL的数据。

SELECT SUM(sale_price), SUM(purchase_price)  FROM Product;

PostgreSQL聚合函数介绍以及分组和排序

AVG,求表中的数值列的数据的平均值。

SELECT AVG(sale_price)  FROM Product;

对于列里面数据有NULL的,会事先去掉NULL再计算。如AVG(purchase_price),分母是6而不是8。

SELECT AVG(sale_price), AVG(purchase_price)  FROM Product;

PostgreSQL聚合函数介绍以及分组和排序

MAX、MIN

MAX,求表中任意列数据最大值。

MIN,求表中任意列数据最小值。

SELECT MAX(sale_price), MIN(purchase_price)  FROM Product;
SELECT MAX(regist_date), MIN(regist_date)  FROM Product;

PostgreSQL聚合函数介绍以及分组和排序

聚合函数+DISTINCT

计算去除重复数据后的数据行数:

DISTINCT要写在括号中,目的是在计算行数前先去重。

SELECT COUNT(DISTINCT product_type)  FROM Product;

PostgreSQL聚合函数介绍以及分组和排序

所有的聚合函数的参数中都可以使用DISTINCT。

下面这个SUM(DISTINCT sale_price),先把sale_price里面的数据去重,然后再求和。

SELECT SUM(sale_price), SUM(DISTINCT sale_price)  FROM Product;

GROUP BY

对表分组:前面使用聚合函数,对表中所有数据进行汇总处理。

还可以先把表分成几组,再进行汇总处理。

格式:

SELECT <列名1>,<列名2>,...FROM <表名>GROUP BY <列名1>,<列名2>,...;

按商品种类统计数据:

使用GROUP BY product_type,会按商品种类对表切分。

GROUP BY指定的列,称为聚合键、分组列。

SELECT product_type, COUNT(*)  FROM Product GROUP BY product_type;

按商品种类对表切分,得到以商品种类为分界的三组数据,然后,计算每种商品数据行数。

PostgreSQL聚合函数介绍以及分组和排序

如果聚合键里面含有NULL,也将NULL作为一组特定数据。

SELECT purchase_price, COUNT(*)  FROM Product GROUP BY purchase_price;

PostgreSQL聚合函数介绍以及分组和排序

如果加上WHERE子句,格式如下:

SELECT <列名1>,<列名2>,...FROM <表名>WHEREGROUP BY <列名1>,<列名2>,...;

先根据WHERE子句指定的条件进行筛选,然后再汇总处理。

下面语句的执行顺序:FROM、WHERE、GROUP BY、SELECT。

SELECT purchase_price, COUNT(*)  FROM Product WHERE product_type = '衣服' GROUP BY purchase_price;

PostgreSQL聚合函数介绍以及分组和排序

使用聚合函数和GROUP BY时需要注意:

1.SELECT子句中,只能存在三种元素:常数、聚合函数、GROPU BY子句指定的列名(聚合键)。

使用GROPU BY子句时,SELECT子句中不能出现聚合键之外的列名。

2.GROUP BY子句里面不能使用SELECT子句中定义的别名。

这是因为SQL语句在DBMS内部先执行GROUP BY子句,再执行SELECT子句。执行GROUP BY子句时候,DBMS还不知道别名代表的是啥,因为别名是在SELECT子句里面定义的。

3.GROUP BY子句执行结果的显示顺序是无序的。

4.只有SELECT子句、HAVING子句、ORDER BY子句里面能使用聚合函数。

HAVING

使用GROPU BY子句,得到将表分组后的结果。

使用HAVING子句,指定分组的条件,从分组后的结果里面选取特定的组。

格式:

SELECT <列名1>,<列名2>,...FROM <表名>WHEREGROUP BY <列名1>,<列名2>,...;HAVING <分组结果对应的条件>

下面这个,选出包含两行数据的组。

SELECT product_type, COUNT(*)  FROM Product GROUP BY product_typeHAVING COUNT(*) = 2;

PostgreSQL聚合函数介绍以及分组和排序

下面这个,选出平均值>=2500的组。

SELECT product_type, AVG(sale_price)  FROM Product GROUP BY product_typeHAVING AVG(sale_price) >= 2500;

PostgreSQL聚合函数介绍以及分组和排序

HAVING子句中,能用的三种元素:常数、聚合函数、GROPU BY子句指定的列名(聚合键)。

聚合键所对应的一些条件,可以写在HAVING子句中,也可写在WHERE子句中。

下面两段代码结果都一样。

HAVING子句用来指定组的条件。WHERE子句用来指定数据行的条件。聚合键所对应的一些条件还是写在WHERE子句中好点。

SELECT product_type, COUNT(*)  FROM Product GROUP BY product_typeHAVING product_type = '衣服';
SELECT product_type, COUNT(*)  FROM ProductWHERE product_type = '衣服' GROUP BY product_type;

PostgreSQL聚合函数介绍以及分组和排序

ORDER BY

使用ORDER BY子句,可以对查询结果进行排序。

格式:

SELECT <列名1>,<列名2>,...FROM <表名>ORDER BY <排序基准列1>,<排序基准列2>,...;

ORDER BY子句写在SELECT语句末尾。

ORDER BY子句里面的列名称为排序键。

使用升序排列,使用ASC关键字,省略这个关键字,默认也是升序排列。

SELECT product_id, product_name, sale_price, purchase_price  FROM ProductORDER BY sale_price;

上面是升序排列,如果想要降序排列,使用DESC关键字。

SELECT product_id, product_name, sale_price, purchase_price  FROM ProductORDER BY sale_price DESC;

PostgreSQL聚合函数介绍以及分组和排序

上面的排序,sale_price=500的有两个数据,这两个数据的顺序是随机的。

可以再添加一个排序键,对这两个数据排序。

下面就实现了,价格相同时,按照商品编号升序排序。

多个排序键时,优先使用左边的键,该列存在相同值,再参考右边的键。

SELECT product_id, product_name, sale_price, purchase_price  FROM ProductORDER BY sale_price, product_id;

PostgreSQL聚合函数介绍以及分组和排序

如果,排序键里面有数据是NULL,NULL会在结果的开头或结尾显示。

SELECT product_id, product_name, sale_price, purchase_price  FROM ProductORDER BY purchase_price;

PostgreSQL聚合函数介绍以及分组和排序

ORDER BY子句里面可以使用SELECT子句中定义的别名。

这是由SQL语句在DBMS内部执行顺序决定的。SELECT子句执行顺序在ORDER BY前,GROPU BY后。

FROM、WHERE、GROPU BY、HAVING、SELECT、ORDER BY

SELECT product_id AS id, product_name, sale_price AS sp, purchase_price  FROM ProductORDER BY sp, id;

PostgreSQL聚合函数介绍以及分组和排序

ORDER BY子句可以使用在表里,但不在SELECT子句里的列。

SELECT product_name, sale_price, purchase_price  FROM ProductORDER BY product_id;

ORDER BY子句里面可以使用聚合函数。

SELECT product_type, COUNT(*)  FROM Product GROUP BY product_typeORDER BY COUNT(*);
PostgreSQL 相关文章推荐
PostgreSQL存储过程实用脚本(二):创建函数入门
Apr 05 PostgreSQL
PostgreSQL将数据加载到buffer cache中操作方法
Apr 16 PostgreSQL
如何使用PostgreSQL进行中文全文检索
May 27 PostgreSQL
postgres之jsonb属性的使用操作
Jun 23 PostgreSQL
浅谈PostgreSQL表分区的三种方式
Jun 29 PostgreSQL
postgresql使用filter进行多维度聚合的解决方法
Jul 16 PostgreSQL
PostgreSQL并行计算算法及参数强制并行度设置方法
Apr 06 PostgreSQL
PostgreSQL并行计算算法及参数强制并行度设置方法
Apr 07 PostgreSQL
PostgreSQL出现死锁该如何解决
May 30 PostgreSQL
PostgreSQL逻辑复制解密原理解析
Sep 23 PostgreSQL
postgresql中如何执行sql文件
May 08 PostgreSQL
PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction
PostgreSQL数据库创建并使用视图以及子查询
PostgreSQL并行计算算法及参数强制并行度设置方法
Apr 07 #PostgreSQL
PostgreSQL并行计算算法及参数强制并行度设置方法
Apr 06 #PostgreSQL
PostgreSQL事务回卷实战案例详析
Mar 25 #PostgreSQL
Oracle配置dblink访问PostgreSQL的操作方法
Rust 连接 PostgreSQL 数据库的详细过程
Jan 22 #PostgreSQL
You might like
无限级别菜单的实现
2006/10/09 PHP
php在线打包程序源码
2008/07/27 PHP
使用PHP实现密保卡功能实现代码&amp;lt;打包下载直接运行&amp;gt;
2011/10/09 PHP
php面象对象数据库操作类实例
2014/12/02 PHP
php下Memcached入门实例解析
2015/01/05 PHP
DOM2非标准但却支持很好的几个属性小结
2012/01/21 Javascript
javascript中的startWith和endWith的几种实现方法
2013/05/07 Javascript
window.location.href IE下跳转失效的解决方法
2014/03/27 Javascript
js检测判断日期大于多少天的方法
2015/05/04 Javascript
js焦点文字滚动效果代码分享
2015/08/25 Javascript
使用jquery插件qrcode生成二维码
2015/10/22 Javascript
JS ES6多行字符串与连接字符串的表示方法
2017/04/26 Javascript
js CSS3实现卡牌旋转切换效果
2017/07/04 Javascript
AngularJS 仿微信图片手势缩放的实例
2017/09/28 Javascript
vue中v-model动态生成的实例详解
2017/10/27 Javascript
vue和webpack安装命令详解
2018/06/15 Javascript
vue底部加载更多的实例代码
2018/06/29 Javascript
微信小程序实现自上而下字幕滚动
2018/07/14 Javascript
如何使用Node.js爬取任意网页资源并输出PDF文件到本地
2019/06/17 Javascript
[02:33]DOTA2亚洲邀请赛趣味视频之吐真话筒
2018/03/31 DOTA
[51:32]Optic vs Serenity 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
将Python中的数据存储到系统本地的简单方法
2015/04/11 Python
Python实现一个简单的验证码程序
2017/11/03 Python
在IPython中执行Python程序文件的示例
2018/11/01 Python
numpy给array增加维度np.newaxis的实例
2018/11/01 Python
python对视频画框标记后保存的方法
2018/12/07 Python
python encrypt 实现AES加密的实例详解
2020/02/20 Python
python设置中文界面实例方法
2020/10/27 Python
python 用opencv实现霍夫线变换
2020/11/27 Python
牧马人澳大利亚官网:Wrangler澳大利亚
2019/10/08 全球购物
Java模拟试题
2014/11/10 面试题
仓库管理员岗位职责
2014/03/19 职场文书
公司捐款倡议书
2014/05/14 职场文书
2015年毕业生自我鉴定模板
2014/09/19 职场文书
PostgreSQL自动更新时间戳实例代码
2021/11/27 PostgreSQL
SQL Server2019安装的详细步骤实战记录(亲测可用)
2022/06/10 SQL Server