點擊下載Navicat for MySQL
在上周的“在 MySQL 中獲取行計數”文章中,我們采用了原生的 COUNT() 函數的不同變體來計算一個 MySQL 表中的行數。在今天的后續文章中,我們將以更復雜的方式使用 COUNT() 函數來計算唯一值以及滿足條件的值。
計算非重復項
COUNT(DISTINCT) 函數返回具有唯一非 NULL 值的行數。因此,包含 DISTINCT 關鍵字可以消除計數中的重復行。它的語法是:
COUNT(DISTINCT expr,[expr...])
與正則 COUNT() 函數一樣,上面的 expr 參數可以是任何給定的表達式,包括指定的列、所有列(*)、函數返回值或表達式(如 IF/CASE 語句)。
簡單的例子
假設我們有以下 clients 表:
+------------+-------------+
| last_name | first_name |
+------------+-------------+
| Tannen | Biff |
+------------+-------------+
| McFly | Marty |
+------------+-------------+
| Brown | Dr. Emmett |
+------------+-------------+
| McFly | George |
+------------+-------------+
調用 COUNT(*) 將返回所有行的數量(4),而在 last_name 上使用 COUNT DISTINCT 將計算重復姓氏的行為 1,這樣我們得到總數 3:
SELECT COUNT(*), COUNT(DISTINCT last_name) FROM clients;
+----------+---------------------------+
| COUNT(*) | COUNT(DISTINCT last_name) |
+----------+---------------------------+
| 4 | 3 |
+----------+---------------------------+
使用表達式的條件性計數
如上所述,COUNT() 函數參數不限于列名,也可以是函數返回值和表達式(如 IF/CASE 語句)。
這是一個包含多個用戶的電話號碼和性別的表(為簡單起見只有兩列):
+------------+---------+
| tel | sex |
+------------+---------+
| 7136609221 | male |
+------------+---------+
| 7136609222 | male |
+------------+---------+
| 7136609223 | female |
+------------+---------+
| 7136609228 | male |
+------------+---------+
| 7136609222 | male |
+------------+---------+
| 7136609223 | female |
+------------+---------+
假設我們想要建立一個查詢,讓我們知道表中有多少不同的女性和男性。用戶是通過他們的電話號碼(tel)識別。同一個“tel”可能會出現多次,但 tel 的性別應該只計算一次。
這是為每列使用單獨的 COUNT DISTINCT 的一個選項:
SELECT COUNT(DISTINCT tel) gender_count,
COUNT(DISTINCT CASE WHEN gender = 'male' THEN tel END) male_count,
COUNT(DISTINCT CASE WHEN gender = 'female' THEN tel END) female_count
FROM people
這個 SELECT 語句將產生以下結果:
+--------------+------------+---------------+
| gender_count | male_count | female_count |
+--------------+------------+---------------+
| 4 | 3 | 1 |
+--------------+------------+---------------+
額外提示-分組并包括總計
你還可以使用 GROUP BY 垂直堆疊計數:
+---------+-------+
| GroupId | Count |
+---------+-------+
| 1 | 5 |
+---------+-------+
| 2 | 4 |
+---------+-------+
| 3 | 7 |
+---------+-------+
| Total: | 11 |
+---------+-------+
“Total:”是使用 SQL GROUPING() 函數生成的,該函數已在 MySQL 8.0.1 中添加。它將表示超級聚合行(由 ROLLUP 生成)中所有的值的集合的 NULL 與正則行中的NULL 區分起來。
這是完整的 SQL:
Select Case When Grouping(GroupId) = 1
Then 'Total:'
Else GroupId
End As GroupId,
Count(*) Count
From user_groups
Group By GroupId With Rollup
Order By Grouping(GroupId), GroupId
下周,我們將從多個表和視圖中獲取行計數。
在上周的“在 MySQL 中獲取行計數”文章中,我們采用了原生的 COUNT() 函數的不同變體來計算一個 MySQL 表中的行數。在今天的后續文章中,我們將以更復雜的方式使用 COUNT() 函數來計算唯一值以及滿足條件的值。
計算非重復項
COUNT(DISTINCT) 函數返回具有唯一非 NULL 值的行數。因此,包含 DISTINCT 關鍵字可以消除計數中的重復行。它的語法是:
COUNT(DISTINCT expr,[expr...])
與正則 COUNT() 函數一樣,上面的 expr 參數可以是任何給定的表達式,包括指定的列、所有列(*)、函數返回值或表達式(如 IF/CASE 語句)。
簡單的例子
假設我們有以下 clients 表:
+------------+-------------+
| last_name | first_name |
+------------+-------------+
| Tannen | Biff |
+------------+-------------+
| McFly | Marty |
+------------+-------------+
| Brown | Dr. Emmett |
+------------+-------------+
| McFly | George |
+------------+-------------+
調用 COUNT(*) 將返回所有行的數量(4),而在 last_name 上使用 COUNT DISTINCT 將計算重復姓氏的行為 1,這樣我們得到總數 3:
SELECT COUNT(*), COUNT(DISTINCT last_name) FROM clients;
+----------+---------------------------+
| COUNT(*) | COUNT(DISTINCT last_name) |
+----------+---------------------------+
| 4 | 3 |
+----------+---------------------------+
使用表達式的條件性計數
如上所述,COUNT() 函數參數不限于列名,也可以是函數返回值和表達式(如 IF/CASE 語句)。
這是一個包含多個用戶的電話號碼和性別的表(為簡單起見只有兩列):
+------------+---------+
| tel | sex |
+------------+---------+
| 7136609221 | male |
+------------+---------+
| 7136609222 | male |
+------------+---------+
| 7136609223 | female |
+------------+---------+
| 7136609228 | male |
+------------+---------+
| 7136609222 | male |
+------------+---------+
| 7136609223 | female |
+------------+---------+
假設我們想要建立一個查詢,讓我們知道表中有多少不同的女性和男性。用戶是通過他們的電話號碼(tel)識別。同一個“tel”可能會出現多次,但 tel 的性別應該只計算一次。
這是為每列使用單獨的 COUNT DISTINCT 的一個選項:
SELECT COUNT(DISTINCT tel) gender_count,
COUNT(DISTINCT CASE WHEN gender = 'male' THEN tel END) male_count,
COUNT(DISTINCT CASE WHEN gender = 'female' THEN tel END) female_count
FROM people
這個 SELECT 語句將產生以下結果:
+--------------+------------+---------------+
| gender_count | male_count | female_count |
+--------------+------------+---------------+
| 4 | 3 | 1 |
+--------------+------------+---------------+
額外提示-分組并包括總計
你還可以使用 GROUP BY 垂直堆疊計數:
+---------+-------+
| GroupId | Count |
+---------+-------+
| 1 | 5 |
+---------+-------+
| 2 | 4 |
+---------+-------+
| 3 | 7 |
+---------+-------+
| Total: | 11 |
+---------+-------+
“Total:”是使用 SQL GROUPING() 函數生成的,該函數已在 MySQL 8.0.1 中添加。它將表示超級聚合行(由 ROLLUP 生成)中所有的值的集合的 NULL 與正則行中的NULL 區分起來。
這是完整的 SQL:
Select Case When Grouping(GroupId) = 1
Then 'Total:'
Else GroupId
End As GroupId,
Count(*) Count
From user_groups
Group By GroupId With Rollup
Order By Grouping(GroupId), GroupId
下周,我們將從多個表和視圖中獲取行計數。
標簽:
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自: