下載Navicat Premium最新版本數據庫
Navicat Premium是一個可鏈接多種數據庫的管理工具,它能夠讓你以單一程序同時鏈接到MySQL、Oracle及PostgreSQL數據庫,讓管理不一樣類型的數據庫更加的方便。函數
在上篇文章中,咱們使用了原生COUNT()函數的不一樣變體來計算一個MySQL表中的行數。在這篇文章中,咱們將以更復雜的方式使用COUNT()函數來計算惟一值以及知足條件的值。工具
不一樣計數
COUNT(DISTINCT)函數返回具備惟一非空值的行數。所以,包含DISTINCT關鍵字將從計數中刪除重複的行。它的語法是:spa
1code |
COUNT ( DISTINCT expr,[expr...]) ci |
與常規COUNT()函數同樣,上面的expr參數能夠是任何給定的表達式,包括特定的列、全部列(*)、函數返回值或表達式(如IF/CASE 語句)。rem
一個簡單的例子
假設咱們有下表的客戶:get
1it 2table 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 |
下篇文章,咱們將從多個表和視圖中獲取行計數。