SELECT COUNT(*) FROM table_name;
上面这条语句会返回table_name表中所有记录的数量。
然而,当大家需要统计某个表中某个字段的不重复数量时,上面这条SQL语句就无法满足大家的需求了。比如大家要统计某个表中名字不重复的人数,大家可以这么写:
SELECT COUNT(DISTINCT name) FROM table_name;
上面这条语句会返回table_name表中所有不重复的名字的数量。
那么如何同时获取表中总记录数和某个字段不重复数量呢?大家可以这样写:
SELECT COUNT(*) AS total_count, COUNT(DISTINCT name) AS name_count FROM table_name;
上面这条语句会返回一个结果集,其中total_count
列代表table_name表中所有记录的数量,name_count
列代表table_name表中所有不重复的名字的数量。
需要注意的是,如果表中有重复的行,上面的语句会重复统计这些行,导致总记录数不变。比如:
+----+--------+
| id | name |
+----+--------+
| 1 | Alice |
| 2 | Alice |
| 3 | Bob |
+----+--------+
如果大家执行以下SQL语句:
SELECT COUNT(*) AS total_count, COUNT(DISTINCT name) AS name_count FROM table_name;
将会得到以下结果:
+-------------+------------+
| total_count | name_count |
+-------------+------------+
| 3 | 2 |
+-------------+------------+
大家发现,虽然表中有3条记录,但是total_count
列只统计了2条记录,因为表中有重复的数据。
为了避免这种情况,大家可以使用下面这条SQL语句:
SELECT COUNT(DISTINCT id) AS total_count, COUNT(DISTINCT name) AS name_count FROM table_name;
上面这条语句会返回一个结果集,其中total_count
列代表table_name表中所有不重复的记录的数量,name_count
列代表table_name表中所有不重复的名字的数量。
如果大家执行以下SQL语句:
SELECT COUNT(DISTINCT id) AS total_count, COUNT(DISTINCT name) AS name_count FROM table_name;
将会得到以下结果:
+-------------+------------+
| total_count | name_count |
+-------------+------------+
| 2 | 2 |
+-------------+------------+
大家发现,total_count
列也统计了2条记录,并避免了重复统计的问题。