PostgreSQL聚合函數(shù)的分組排序使用示例
聚合函數(shù)
用于匯總的函數(shù)。
COUNT
COUNT,計算表中的行數(shù)(記錄數(shù))。
計算全部數(shù)據(jù)的行數(shù):
SELECT COUNT(*) FROM Product;
NULL之外的數(shù)據(jù)行數(shù):
SELECT COUNT(purchase_price) FROM Product;
結(jié)果如下圖。
對于一個含NULL的表:
將列名作為參數(shù),得到NULL之外的數(shù)據(jù)行數(shù);將星號作為參數(shù),得到所有數(shù)據(jù)的行數(shù)(包含NULL)。
SUM、AVG
SUM、AVG函數(shù)只能對數(shù)值類型的列使用。
SUM,求表中的數(shù)值列的數(shù)據(jù)的和。
SELECT SUM(sale_price) FROM Product;
purchase_price里面的數(shù)據(jù)有NULL,四則運算中存在NULL,結(jié)果也是NULL,但這里面結(jié)果不是NULL。
這是因為,聚合函數(shù)以列名為參數(shù),計算的時候會排除NULL的數(shù)據(jù)。
SELECT SUM(sale_price), SUM(purchase_price) FROM Product;
AVG,求表中的數(shù)值列的數(shù)據(jù)的平均值。
SELECT AVG(sale_price) FROM Product;
對于列里面數(shù)據(jù)有NULL的,會事先去掉NULL再計算。如AVG(purchase_price),分母是6而不是8。
SELECT AVG(sale_price), AVG(purchase_price) FROM Product;
MAX、MIN
MAX,求表中任意列數(shù)據(jù)最大值。
MIN,求表中任意列數(shù)據(jù)最小值。
SELECT MAX(sale_price), MIN(purchase_price) FROM Product;
SELECT MAX(regist_date), MIN(regist_date) FROM Product;
聚合函數(shù)+DISTINCT
計算去除重復數(shù)據(jù)后的數(shù)據(jù)行數(shù):
DISTINCT要寫在括號中,目的是在計算行數(shù)前先去重。
SELECT COUNT(DISTINCT product_type) FROM Product;
所有的聚合函數(shù)的參數(shù)中都可以使用DISTINCT。
下面這個SUM(DISTINCT sale_price),先把sale_price里面的數(shù)據(jù)去重,然后再求和。
SELECT SUM(sale_price), SUM(DISTINCT sale_price) FROM Product;
GROUP BY
對表分組:前面使用聚合函數(shù),對表中所有數(shù)據(jù)進行匯總處理。
還可以先把表分成幾組,再進行匯總處理。
格式:
SELECT <列名1>,<列名2>,... FROM <表名> GROUP BY <列名1>,<列名2>,...;
按商品種類統(tǒng)計數(shù)據(jù):
使用GROUP BY product_type,會按商品種類對表切分。
GROUP BY指定的列,稱為聚合鍵、分組列。
SELECT product_type, COUNT(*) FROM Product GROUP BY product_type;
按商品種類對表切分,得到以商品種類為分界的三組數(shù)據(jù),然后,計算每種商品數(shù)據(jù)行數(shù)。
如果聚合鍵里面含有NULL,也將NULL作為一組特定數(shù)據(jù)。
SELECT purchase_price, COUNT(*) FROM Product GROUP BY purchase_price;
如果加上WHERE子句,格式如下:
SELECT <列名1>,<列名2>,... FROM <表名> WHERE GROUP BY <列名1>,<列名2>,...;
先根據(jù)WHERE子句指定的條件進行篩選,然后再匯總處理。
下面語句的執(zhí)行順序:FROM、WHERE、GROUP BY、SELECT。
SELECT purchase_price, COUNT(*) FROM Product WHERE product_type = '衣服' GROUP BY purchase_price;
使用聚合函數(shù)和GROUP BY時需要注意:
1.SELECT子句中,只能存在三種元素:常數(shù)、聚合函數(shù)、GROPU BY子句指定的列名(聚合鍵)。
使用GROPU BY子句時,SELECT子句中不能出現(xiàn)聚合鍵之外的列名。
2.GROUP BY子句里面不能使用SELECT子句中定義的別名。
這是因為SQL語句在DBMS內(nèi)部先執(zhí)行GROUP BY子句,再執(zhí)行SELECT子句。執(zhí)行GROUP BY子句時候,DBMS還不知道別名代表的是啥,因為別名是在SELECT子句里面定義的。
3.GROUP BY子句執(zhí)行結(jié)果的顯示順序是無序的。
4.只有SELECT子句、HAVING子句、ORDER BY子句里面能使用聚合函數(shù)。
HAVING
使用GROPU BY子句,得到將表分組后的結(jié)果。
使用HAVING子句,指定分組的條件,從分組后的結(jié)果里面選取特定的組。
格式:
SELECT <列名1>,<列名2>,... FROM <表名> WHERE GROUP BY <列名1>,<列名2>,...; HAVING <分組結(jié)果對應的條件>
下面這個,選出包含兩行數(shù)據(jù)的組。
SELECT product_type, COUNT(*) FROM Product GROUP BY product_type HAVING COUNT(*) = 2;
下面這個,選出平均值>=2500的組。
SELECT product_type, AVG(sale_price) FROM Product GROUP BY product_type HAVING AVG(sale_price) >= 2500;
HAVING子句中,能用的三種元素:常數(shù)、聚合函數(shù)、GROPU BY子句指定的列名(聚合鍵)。
聚合鍵所對應的一些條件,可以寫在HAVING子句中,也可寫在WHERE子句中。
下面兩段代碼結(jié)果都一樣。
HAVING子句用來指定組的條件。WHERE子句用來指定數(shù)據(jù)行的條件。聚合鍵所對應的一些條件還是寫在WHERE子句中好點。
SELECT product_type, COUNT(*) FROM Product GROUP BY product_type HAVING product_type = '衣服';
SELECT product_type, COUNT(*) FROM Product WHERE product_type = '衣服' GROUP BY product_type;
ORDER BY
使用ORDER BY子句,可以對查詢結(jié)果進行排序。
格式:
SELECT <列名1>,<列名2>,... FROM <表名> ORDER BY <排序基準列1>,<排序基準列2>,...;
ORDER BY子句寫在SELECT語句末尾。
ORDER BY子句里面的列名稱為排序鍵。
使用升序排列,使用ASC關(guān)鍵字,省略這個關(guān)鍵字,默認也是升序排列。
SELECT product_id, product_name, sale_price, purchase_price FROM Product ORDER BY sale_price;
上面是升序排列,如果想要降序排列,使用DESC關(guān)鍵字。
SELECT product_id, product_name, sale_price, purchase_price FROM Product ORDER BY sale_price DESC;
上面的排序,sale_price=500的有兩個數(shù)據(jù),這兩個數(shù)據(jù)的順序是隨機的。
可以再添加一個排序鍵,對這兩個數(shù)據(jù)排序。
下面就實現(xiàn)了,價格相同時,按照商品編號升序排序。
多個排序鍵時,優(yōu)先使用左邊的鍵,該列存在相同值,再參考右邊的鍵。
SELECT product_id, product_name, sale_price, purchase_price FROM Product ORDER BY sale_price, product_id;
如果,排序鍵里面有數(shù)據(jù)是NULL,NULL會在結(jié)果的開頭或結(jié)尾顯示。
SELECT product_id, product_name, sale_price, purchase_price FROM Product ORDER BY purchase_price;
ORDER BY子句里面可以使用SELECT子句中定義的別名。
這是由SQL語句在DBMS內(nèi)部執(zhí)行順序決定的。SELECT子句執(zhí)行順序在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 Product ORDER BY sp, id;
ORDER BY子句可以使用在表里,但不在SELECT子句里的列。
SELECT product_name, sale_price, purchase_price FROM Product ORDER BY product_id;
ORDER BY子句里面可以使用聚合函數(shù)。
SELECT product_type, COUNT(*) FROM Product GROUP BY product_type ORDER BY COUNT(*);
以上就是PostgreSQL聚合函數(shù)的分組排序使用示例的詳細內(nèi)容,更多關(guān)于PostgreSQL聚合函數(shù)分組排序的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
sqoop讀取postgresql數(shù)據(jù)庫表格導入到hdfs中的實現(xiàn)
這篇文章主要介紹了sqoop讀取postgresql數(shù)據(jù)庫表格導入到hdfs中的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12PostgreSQL數(shù)據(jù)庫中DISTINCT關(guān)鍵字的四種用法詳解
PostgreSQL 不但高度兼容 SQL 標準,同時還對很多語法進行了擴展,可以用于實現(xiàn)一些特殊的功能,今天我們就來介紹一下 PostgreSQL 數(shù)據(jù)庫中 DISTINCT 關(guān)鍵字的 4 種不同用法,需要的朋友可以參考下2024-04-04基于PostgreSQL pg_hba.conf 配置參數(shù)的使用說明
這篇文章主要介紹了基于PostgreSQL pg_hba.conf 配置參數(shù)的使用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01在PostgreSQL中實現(xiàn)跨數(shù)據(jù)庫的關(guān)聯(lián)查詢
在 PostgreSQL 中,通常情況下的關(guān)聯(lián)查詢是在同一個數(shù)據(jù)庫的不同表之間進行的,然而,在某些復雜的應用場景中,可能需要實現(xiàn)跨數(shù)據(jù)庫的關(guān)聯(lián)查詢,本文將詳細探討如何在 PostgreSQL 中實現(xiàn)這一需求,并通過示例代碼進行說明,需要的朋友可以參考下2024-08-08PostgreSQL教程(三):表的繼承和分區(qū)表詳解
這篇文章主要介紹了PostgreSQL教程(三):表的繼承和分區(qū)表詳解,本文講解了多表繼承、 繼承和權(quán)限、什么是分區(qū)表、分區(qū)表實現(xiàn)、分區(qū)和約束排除等內(nèi)容,需要的朋友可以參考下2015-05-05