聚合查詢
通過SQL對數據進行某種操作或計算時需要使用函數(聚合函數,將多行匯為一行)。
常用函數(5個):
- COUNT:計算表中的記錄數(行數)
- SUM: 計算表中數值列中數據的合計值
- AVG: 計算表中數值列中數據的平均值
- MAX: 計算表中數值列中數據的最大值
- MIN: 計算表中數值列中數據的最小值
COUNT()函數
-- 1.計算全部行數:
SELECT COUNT(*) FROM Product;
-- 2.計算null之外的數據的行數(將對象列設為參數):
SELECT COUNT(purchase_price) FROM Product;
-- 3.將包含null的列作為參數時,count(*)和count(<列名>)的結果不一樣
SELECT COUNT(*), COUNT(purchase_price) FROM Product;
SUM:計算合計值
-- 1.計算單列合計值
SELECT SUM(sale_price) FROM Product;
-- 2.計算多列合計值
SELECT SUM(sale_price), SUM(purchase_price) FROM Product;
AVG:計算平均值
-- 1.計算某列平均值(如果該列存在null,則會被刪除后再計算)
SELECT AVG(sale_price) FROM Product;
MAX和MIN:計算最大值和最小值
注:MAX/MIN使用於任何數據類型,只要能排序,就存在最大值和最小值
-- 1.計算銷售值的最大值和最小值
SELECT MAX(sale_price),MIN(purchase_price) FROM Product;
-- 2.計算日期的最大值和最小值
SELECT MAX(regist_date), MIN(regist_date) FROM Product;
注:MAX/MIN使用於任何數據類型,SUM/AVG只適用於數值類型的列。
使用聚合函數刪除重復值(先去除重復行,再計算; AVG也可使用)
SELECT COUNT(DISTINCT product_type) FROM Product;
分組(GROUP BY)
-- 1.商品種類分組計算各組數量(GROUP BY指定的列被稱為聚合列或分組列):
SELECT product_type, COUNT(*)
FROM Product
GROUP BY product_type;
-- 2.聚合鍵包含空值情況(空值也被當成一組):
SELECT purchase_price, COUNT(*)
FROM Product
GROUP BY purchase_price;
-- 3.同時使用where和GROUP BY子句
SELECT purchase_price, COUNT(*)
FROM Product
WHERE product_type = '衣服'
GROUP BY purchase_price;
注:
- 使用group by時,select子句不能出現聚合鍵之外的列名。
- 使用group by時,不能使用select子句中定義的列的別名。主要是sqld的執行順序,先執行group by再執行select。
- 使用group by 時,不能在where子句中使用聚合函數,只有select子句和having子句及group by子句中能夠使用聚合函數
如:
SELECT product_type, COUNT(*)
ROM Product
WHERE COUNT(*) = 2
GROUP BY product_type
> 1111 - Invalid use of group function
> 時間: 0s
為集合結果指定條件
注:HAVING子句中能夠使用三種要素:常數,聚合函數,GROUP BY子句中指定的列名(聚合建)
HAVING子句:
- 用having就一定要和group by連用
- 用group by不一有having (它只是一個篩選條件用的)
-- 1.分組,商品品種分組后結果中篩選出數據行數為2行的數據
SELECT product_type, COUNT(*)
FROM Product
GROUP BY product_type
HAVING COUNT(*) = 2;
-- 2.平均數,銷售價格大於2500的
SELECT product_type, AVG(sale_price)
FROM Product
GROUP BY product_type
HAVING AVG(sale_price) >= 2500;
相對於HAVING子句,更適合寫再Where子句中的條件:
- where子句 = 指定行所對應的條件
- having子句 = 指定組所對應的條件
- 聚合建所對應的條件不應該書寫在HAVING子句中,而應書寫在WHERE子句當中。
- 雖執行結果一樣,單更推薦第二種寫法,將條件寫在where子句中比寫在having子句中的處理速度更快,返回結果時間更短。
- 原因:聚合操作時,DBMS內部會進行排序處理,where在排序之前就對數據進行過濾,having是在排序之后在對數據進行分組。
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;
對結果進行排序
- 升序:ASC(不寫默認)
- 降序:DESC
select的排序順序是隨機的,通常在句尾添加ORDER BY(排序建)子句來明確排序。
注:子句書寫順序:select - from - where - group by - having - order by
-- 1.銷售價格升序:未指定GROUP BY子句中排列順序默認為升序。
SELECT product_id, product_name, sale_price, purchase_price
FROM Product
ORDER BY sale_price;
-- 2.銷售價格降序(DESC關鍵字)
SELECT product_id, product_name, sale_price, purchase_price
FROM Product
ORDER BY sale_price DESC;
-- 3.指定多個排序的鍵
SELECT product_id, product_name, sale_price, purchase_price
FROM Product
ORDER BY sale_price, product_id;
注:1.優先使用左側的鍵,如果存在相同值則使用右側。2.排序鍵包含null時,會在開頭或者末尾進行匯總。
-- 4.在排序鍵中使用顯示用的別名
SELECT product_id AS id, product_name, sale_price AS sp, purchase_price
FROM Product
ORDER BY sp, id;
-- 5.ORDER BY子句可以使用聚合函數
SELECT product_type, COUNT(*)
FROM Product
GROUP BY product_type
ORDER BY COUNT(*);