MySQL 8.4 版本說明
資料庫通常用於回答這個問題:「某種類型的資料在表格中出現的頻率有多高?」例如,您可能想知道您有多少寵物,或者每個飼主有多少寵物,或者您可能想對您的動物執行各種人口普查操作。
計算您擁有的動物總數與「在 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(
行為和相關最佳化的資訊,請參閱 第 14.19.1 節,「彙總函數描述」。expr
)