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(实现代码)
Apr 22 PostgreSQL
通过Qt连接OpenGauss数据库的详细教程
Jun 23 PostgreSQL
浅谈PostgreSQL表分区的三种方式
Jun 29 PostgreSQL
PostgreSQL13基于流复制搭建后备服务器的方法
Jan 18 PostgreSQL
Rust 连接 PostgreSQL 数据库的详细过程
Jan 22 PostgreSQL
Oracle配置dblink访问PostgreSQL的操作方法
Mar 21 PostgreSQL
PostgreSQL并行计算算法及参数强制并行度设置方法
Apr 07 PostgreSQL
PostgreSQL之连接失败的问题及解决
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
PHP脚本监控Nginx 502错误并自动重启php-fpm
2015/05/13 PHP
php使用crypt()函数进行加密
2017/06/08 PHP
laravel实现分页样式替换示例代码(增加首、尾页)
2017/09/22 PHP
ie focus bug 解决方法
2009/09/03 Javascript
Js 弹出框口并返回值的两种常用方法
2010/12/30 Javascript
jquery使用淘宝接口跨域查询手机号码归属地实例
2013/11/28 Javascript
什么是MEAN?JavaScript编程中的MEAN是什么意思?
2014/12/18 Javascript
JavaScritp添加url参数并将参数加入到url中及更改url参数的方法
2015/10/26 Javascript
JS实现点击登录弹出窗口同时背景色渐变动画效果
2016/03/25 Javascript
JavaScript模块化之使用requireJS按需加载
2017/04/12 Javascript
利用10行js代码实现上下滚动公告效果
2017/12/08 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
JavaScript如何借用构造函数继承
2019/11/06 Javascript
vue实现页面内容禁止选中功能,仅输入框和文本域可选
2019/11/09 Javascript
微信小程序自定义纯净模态框(弹出框)的实例代码
2020/03/09 Javascript
Python Trie树实现字典排序
2014/03/28 Python
python提取内容关键词的方法
2015/03/16 Python
Python运用于数据分析的简单教程
2015/03/27 Python
python获取当前用户的主目录路径方法(推荐)
2017/01/12 Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
2019/07/03 Python
numpy数组广播的机制
2019/07/12 Python
Django使用模板后无法找到静态资源文件问题解决
2019/07/19 Python
使用Django清空数据库并重新生成
2020/04/03 Python
Python HTMLTestRunner库安装过程解析
2020/05/25 Python
Python装饰器结合递归原理解析
2020/07/02 Python
Python自动化操作实现图例绘制
2020/07/09 Python
Python私有属性私有方法应用实例解析
2020/09/15 Python
python 利用opencv实现图像网络传输
2020/11/12 Python
Html5 new XMLHttpRequest()监听附件上传进度
2021/01/14 HTML / CSS
2014政务公开实施方案
2014/02/19 职场文书
金融系毕业生自荐书
2014/07/08 职场文书
2014年助理政工师工作总结
2014/12/19 职场文书
城南旧事电影观后感
2015/06/16 职场文书
优秀班干部主要事迹材料
2015/11/04 职场文书
导游词之杭州西湖
2019/09/19 职场文书
三年级作文之小小梦想
2019/12/06 职场文书