Navicat使用教程:獲取MySQL中的高級行數(第2部分)

下載Navicat Premium最新版本

Navicat Premium是一個可連接多種數據庫的管理工具,它可以讓你以單一程序同時連接到MySQL、Oracle及PostgreSQL數據庫,讓管理不同類型的數據庫更加的方便。

在上篇文章中,我們使用了原生COUNT()函數的不同變體來計算一個MySQL表中的行數。在這篇文章中,我們將以更復雜的方式使用COUNT()函數來計算唯一值以及滿足條件的值。

不同計數

COUNT(DISTINCT)函數返回具有唯一非空值的行數。因此,包含DISTINCT關鍵字將從計數中刪除重複的行。它的語法是:

1
COUNT(DISTINCT expr,[expr...])

與常規COUNT()函數一樣,上面的expr參數可以是任何給定的表達式,包括特定的列、所有列(*)、函數返回值或表達式(如IF/CASE 語句)。

一個簡單的例子

假設我們有下表的客戶:

1
2
3
4
5
6
7
8
9
10
11
+------------+-------------+
| last_name  | first_name  |
+------------+-------------+
| Tannen     | Biff        |
+------------+-------------+
| McFly      | Marty       |
+------------+-------------+
| Brown      | Dr. Emmett  |
+------------+-------------+
| McFly      | George      |
+------------+-------------+

調用COUNT(*)將返回所有行的數目(4),而姓氏上的非重複計數將把姓氏重複的每一行計數爲1,這樣我們得到的總數爲3:

1
2
3
4
5
6
SELECT COUNT(*), COUNT(DISTINCT last_name) FROM clients;
+----------+---------------------------+
COUNT(*) | COUNT(DISTINCT last_name) |
+----------+---------------------------+
| 4        | 3                         |
+----------+---------------------------+

使用表達式的條件計數

如上所述,COUNT()函數參數不限於列名;函數返回值和表達式(如IF/CASE 語句)也是公平的。

這是一個包含多個用戶電話號碼和性別的表(爲了簡單起見,限制爲兩個):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
+------------+---------+
| tel        | sex     |
+------------+---------+
| 7136609221 | male    |
+------------+---------+
| 7136609222 | male    |
+------------+---------+
| 7136609223 | female  |
+------------+---------+
| 7136609228 | male    |
+------------+---------+
| 7136609222 | male    |
+------------+---------+
| 7136609223 | female  |
+------------+---------+

假設我們想要構建一個查詢,告訴我們表中有多少不同的男女。該人員通過其電話('tel')號碼進行識別。同一個“tel”可能出現多次,但該tel的性別只應計算一次。

這裏有一個選項,對每列使用不同的計數:

1
2
3
4
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語句將生成以下內容:

1
2
3
4
5
+--------------+------------+---------------+
| gender_count | male_count | female_count  |
+--------------+------------+---------------+
| 4            | 3          | 1             |
+--------------+------------+---------------+

分組幷包括總計

還可以使用GROUP BY垂直堆疊計數:

1
2
3
4
5
6
7
8
9
10
11
+---------+-------+
| GroupId | Count |
+---------+-------+
| 1       | 5     |
+---------+-------+
| 2       | 4     |
+---------+-------+
| 3       | 7     |
+---------+-------+
| Total:  | 11    |
+---------+-------+

“total:”是使用SQL GROUPING()函數生成的,該函數添加在MySQL 8.0.1中。它將表示超級聚合行(由彙總生成)中所有值的集合的空值與常規行中的空值區分開來。

以下是完整的SQL:

1
2
3
4
5
6
7
8
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

下篇文章,我們將從多個表和視圖中獲取行計數。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章