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 |
GO TO FULL VERSION