SQL讀書筆記(七) 數據分組

筆記參考與SQL必知必會,是新手很好的讀物,摘抄下來作爲筆記方便以後需要時查找

這篇主要是SQL的數據分組

什麼是數據的分組,按我的理解就是我們對一些數據進行分類處理,我們可能需要將數據分成一組組的來處理,例如我們可能有很多的訂單,但我們需要知道每個訂單的數量,來計算我們整體的利潤,這樣我們就需要將每種相同產品的訂單的數量,這樣我們就可以將每種相同的訂單分成一個組,來直觀的看出每種訂單的數量。

使用分組可以將數據分爲多個邏輯組,對每個組進行聚集計算。

1、創建分組
SELECT vend_id, COUNT(*) AS num_prods FROM Products GROUP BY vend_id;

vend_id num_prods
——- ——–
BRS01 3
DLL01 4
FNG01 2

上面的SELECT語句指定了兩個列:vend_id包含產品供應商的ID,num_prods爲計算字段(用COUNT(*)函數建立)。GROUP BY子句指示 DBMS按vend_id排序並分組數據。這就會對每個vend_id而不是整個表計算num_prods一次。從輸出中可以看到,供應商BRS01有3個產品,供 應商DLL01有4個產品,而供應商FNG01有2個產品

在使用GROUP BY子句前,需要知道一些重要的規定。

GROUP BY子句可以包含任意數目的列,因而可以對分組進行嵌套,更細緻地進行數據分組。

如果在GROUP BY子句中嵌套了分組,數據將在最後指定的分組上進行彙總。換句話說,在建立分組時,指定的所有列都一起計算(所以 不能從個別的列取回數據)。

GROUP BY子句中列出的每一列都必須是檢索列或有效的表達式(但不能是聚集函數)。如果在SELECT中使用表達式,則必須在GROUP BY子句中指定相同的表達式。不能使用別名。

大多數SQL實現不允許GROUP BY列帶有長度可變的數據類型(如文本或備註型字段)。

除聚集計算語句外,SELECT語句中的每一列都必須在GROUP BY子句中給出。

如果分組列中包含具有NULL值的行,則NULL將作爲一個分組返回。如果列中有多行NULL值,它們將分爲一組。

GROUP BY子句必須出現在WHERE子句之後,ORDER BY子句之前。

2、過濾分組

HAVING非常類似於WHERE。事實上,目前爲止所學過的所有類型的WHERE子句都可以用HAVING來替代。唯一的差別是,WHERE過濾行,而HAVING過濾分組。 學過的這些有關WHERE的所有技術和選項都適用於HAVING。它們的句法是相同的,只是關鍵字有差別。

過濾分組我的理解就是分完組之後進行過濾,但group by必須在where之後,所有使用HAVING,但也就是這麼理解,按理說where是過濾行,不能對組合進行過濾。

SELECT cust_id, COUNT() AS orders FROM Orders GROUP BY cust_id HAVING COUNT() >= 2;

這條SELECT語句的前三行類似於上面的語句。最後一行增加了HAVING子句,它過濾COUNT(*) >= 2(兩個以上訂單)的那些分組。
可以看到,WHERE子句在這裏不起作用,因爲過濾是基於分組聚集值,而不是特定行的值

SELECT vend_id, COUNT() AS num_prods FROM Products WHERE prod_price >= 4 GROUP BY vend_id HAVING COUNT() >= 2;

這條語句中,第一行是使用了聚集函數的基本SELECT語句,很像前面的例子。WHERE子句過濾所有prod_price至少爲4的行,然後按vend_id分 組數據,HAVING子句過濾計數爲2或2以上的分組。如果沒有WHERE子句,就會多檢索出一行

3、分組和排序

SELECT order_num, COUNT(*) AS items
FROM OrderItems
GROUP BY order_num
HAVING COUNT(*) >= 3 ORDERBY items, order_num;

發佈了83 篇原創文章 · 獲贊 68 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章