聚合函數與SQL排序


聚合查詢

通過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(*);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM