3.1 GROUP BY語句

SQL 語言非常強大。除了簡單的數據獲取之外,它還允許您在查詢時對數據進行分組。比如我們想知道每個品牌有多少種產品,怎麼辦?

為此有一個特殊的運算符GROUP BY,下面是它的寫法。

GROUP BY column

讓我們編寫一個查詢,要求 SQL 顯示每個品牌的產品類型數量。這樣的請求看起來像這樣:

SELECT brand, COUNT(*)
FROM product
GROUP BY brand

你會得到如下查詢結果:

品牌 數數(*)
(無效的) 2個
博世 4個
宜家 6個
LG 2個
聰明花 1個

我們仔細分析一下,我們寫了什麼樣的請求,得到了什麼樣的結果。結果,我們看到兩列。第一個帶有品牌列表,這是合乎邏輯的。我們想要得到像一組“品牌 --> 數量”這樣的東西。

請注意,品牌名稱中有一個詞NULL。的確,我們有寫它的品牌的產品NULL,我們在這裡看到它們。有點出乎意料,但很有幫助。我們可以看到有多少無​​品牌產品。

現在讓我們仔細看看這個請求。我們想知道每個品牌的產品數量,所以我們寫了GROUP BY brand,在SELECT我們寫了品牌和表達COUNT(*)

COUNT(*)是對一組行執行的所謂聚合函數。在我們的案例中,她只是數數它們的數量。有很多這樣的函數,我們稍後再看。

3.2 使用 GROUP BY 的複雜查詢

現在讓我們寫一個查詢,我們首先丟棄價格小於 10 的產品,然後對它們進行分組。這樣的請求看起來像這樣:

SELECT brand, COUNT(*)
FROM product
WHERE price > 10
GROUP BY brand

你會得到如下查詢結果:

品牌 數數(*)
博世 4個
宜家 5個
LG 2個
聰明花 1個

所有 NULL 產品都從我們的結果表中消失了,因為它們非常便宜,宜家產品的數量減少了 1。從 6 到 5。

這建議您首先應用WHERE所需的行進行過濾,然後才將分組應用於結果。

3.3 結果的列名

順便說一下,您可以為結果列命名。查看服務器如何建議名稱count(*)?讓我們用總計代替它。這樣的請求看起來像這樣:

SELECT brand, COUNT(*) AS total
FROM product
WHERE price > 10
GROUP BY brand

你會得到如下查詢結果:

品牌 全部的
博世 4個
宜家 5個
LG 2個
聰明花 1個

您還可以重命名現有列。讓我們採用以前使用的查詢之一併向列添加新名稱。

SELECT
id AS  product_id,
name AS product_name,
price
FROM product
WHERE price < 20 AND brand IS NOT NULL

你會得到如下查詢結果:

產品編號 產品名稱 價格
2個 椅子 5.00
8個 15.00