相關文件 下載本手冊
PDF (美國信紙尺寸) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


5.3.4.8 計算列數

資料庫通常用於回答以下問題:某種資料在資料表中出現的頻率是多少?例如,您可能想知道您有多少隻寵物,或每個飼主有多少隻寵物,或者您可能想對您的動物執行各種人口統計操作。

計算您擁有的動物總數與以下問題相同:pet 資料表中有多少列?因為每隻寵物都有一筆記錄。COUNT(*) 會計算列數,因此計算您動物的查詢如下所示

mysql> SELECT COUNT(*) FROM pet;
+----------+
| COUNT(*) |
+----------+
|        9 |
+----------+

先前,您擷取了擁有寵物的人的姓名。如果您想找出每個飼主有多少隻寵物,可以使用 COUNT()

mysql> SELECT owner, COUNT(*) FROM pet GROUP BY owner;
+--------+----------+
| owner  | COUNT(*) |
+--------+----------+
| Benny  |        2 |
| Diane  |        2 |
| Gwen   |        3 |
| Harold |        2 |
+--------+----------+

前面的查詢使用 GROUP BY 來群組每個 owner 的所有記錄。將 COUNT()GROUP BY 搭配使用,對於在各種群組下描述您的資料非常有用。以下範例顯示執行動物人口統計操作的不同方法。

每個物種的動物數量

mysql> SELECT species, COUNT(*) FROM pet GROUP BY species;
+---------+----------+
| species | COUNT(*) |
+---------+----------+
| bird    |        2 |
| cat     |        2 |
| dog     |        3 |
| hamster |        1 |
| snake   |        1 |
+---------+----------+

每個性別的動物數量

mysql> SELECT sex, COUNT(*) FROM pet GROUP BY sex;
+------+----------+
| sex  | COUNT(*) |
+------+----------+
| NULL |        1 |
| f    |        4 |
| m    |        4 |
+------+----------+

(在此輸出中,NULL 表示性別未知。)

每個物種和性別組合的動物數量

mysql> SELECT species, sex, COUNT(*) FROM pet GROUP BY species, sex;
+---------+------+----------+
| species | sex  | COUNT(*) |
+---------+------+----------+
| bird    | NULL |        1 |
| bird    | f    |        1 |
| cat     | f    |        1 |
| cat     | m    |        1 |
| dog     | f    |        1 |
| dog     | m    |        2 |
| hamster | f    |        1 |
| snake   | m    |        1 |
+---------+------+----------+

當您使用 COUNT() 時,您無需擷取整個資料表。例如,先前的查詢如果僅針對狗和貓執行,則如下所示

mysql> SELECT species, sex, COUNT(*) FROM pet
       WHERE species = 'dog' OR species = 'cat'
       GROUP BY species, sex;
+---------+------+----------+
| species | sex  | COUNT(*) |
+---------+------+----------+
| cat     | f    |        1 |
| cat     | m    |        1 |
| dog     | f    |        1 |
| dog     | m    |        2 |
+---------+------+----------+

或者,如果您想知道僅限於性別已知的動物的每個性別的動物數量

mysql> SELECT species, sex, COUNT(*) FROM pet
       WHERE sex IS NOT NULL
       GROUP BY species, sex;
+---------+------+----------+
| species | sex  | COUNT(*) |
+---------+------+----------+
| bird    | f    |        1 |
| cat     | f    |        1 |
| cat     | m    |        1 |
| dog     | f    |        1 |
| dog     | m    |        2 |
| hamster | f    |        1 |
| snake   | m    |        1 |
+---------+------+----------+

如果您除了 COUNT() 值之外,還命名要選擇的欄,則應存在一個 GROUP BY 子句,其中命名這些相同的欄。否則,會發生以下情況

  • 如果啟用 ONLY_FULL_GROUP_BY SQL 模式,則會發生錯誤

    mysql> SET sql_mode = 'ONLY_FULL_GROUP_BY';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT owner, COUNT(*) FROM pet;
    ERROR 1140 (42000): In aggregated query without GROUP BY, expression
    #1 of SELECT list contains nonaggregated column 'menagerie.pet.owner';
    this is incompatible with sql_mode=only_full_group_by
  • 如果未啟用 ONLY_FULL_GROUP_BY,則會將所有資料列視為單一群組來處理查詢,但為每個已命名欄選擇的值是不確定的。伺服器可以自由地從任何資料列中選擇值

    mysql> SET sql_mode = '';
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT owner, COUNT(*) FROM pet;
    +--------+----------+
    | owner  | COUNT(*) |
    +--------+----------+
    | Harold |        8 |
    +--------+----------+
    1 row in set (0.00 sec)

另請參閱 章節 14.19.3,「MySQL 處理 GROUP BY」。有關 COUNT(expr) 行為和相關最佳化的資訊,請參閱 章節 14.19.1,「彙總函式說明」