COUNT() 函数是 SQL 里最常用、最有用的聚合函数之一。它的主要任务就是统计查询结果里的行数。如果 COUNT() 是 SQL 世界里的超级英雄,那它的超能力就是能飞快地回答这些问题:
- 公司里有多少员工?
- 每个院系有多少学生?
- 上个月卖出了多少商品?
COUNT() 的语法其实很简单:
COUNT(列名)
这里的 列名 就是你要统计的那一列的名字。当然还有别的用法,咱们后面会讲到。
咱们先从最基础的 COUNT() 用法说起。
用法1:用 COUNT(*) 统计所有行
如果你想统计表里每一行,不管里面有没有数据,就用 COUNT(*)。星号意思是“所有列”。
举个例子:我们有个 students 表,内容如下:
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | 22 |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
执行下面这个查询:
SELECT COUNT(*)
FROM students;
结果:
| count |
|---|
| 4 |
COUNT(*) 不管某一列是不是 NULL,它就是单纯统计表里的行数。
用法2:用 COUNT(column) 统计某列有值的行
那如果你只想统计某一列不是 NULL 的行数呢?这时候就用 COUNT(column)。
举个例子:来数一下有名字的学生有多少。
SELECT COUNT(name)
FROM students;
结果:
| count |
|---|
| 3 |
看出来区别了吗?表里有4行,但有一行 name 是 NULL。COUNT(column) 会跳过那些 NULL 的行。
COUNT(*) 和 COUNT(column) 的区别
那这两种用法到底有啥区别?
COUNT(*)会统计表里所有行,不管哪一列是不是NULL。COUNT(column)只统计指定那一列不是 NULL 的行。
举个表:
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
查询:
-- 统计所有行
SELECT COUNT(*) FROM students; -- 4 -- TOTAL (所有行)
-- 只统计 name 不是 NULL 的行
SELECT COUNT(name) FROM students; -- 3 -- 只数有名字的行
-- 只统计 age 不是 NULL 的行
SELECT COUNT(age) FROM students; -- 3 -- 只数有年龄的行
用法3:用 COUNT(DISTINCT column) 统计唯一值
有时候你只想知道某一列里有多少个不重复的值。比如想知道学生有多少种不同的年龄。这时候就用 COUNT(DISTINCT column)。
例子:
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
SELECT COUNT(DISTINCT age) FROM students;
结果:
| count |
|---|
| 3 |
注意,这里 DISTINCT 不光去重,还会忽略 NULL。
如果你想把 DISTINCT 和 COUNT(*) 一起用,会报错:DISTINCT 只能用在具体的列上。
COUNT() 在实际问题里的用法举例
例1. 统计学生总数
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
SELECT COUNT(*) AS total_students
FROM students;
结果:
| total_students |
|---|
| 4 |
例2. 统计有年龄的学生数
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 21 |
SELECT COUNT(age) AS students_with_age
FROM students;
结果:
| students_with_age |
|---|
| 3 |
例3. 统计不同年龄的数量
| id | name | age |
|---|---|---|
| 1 | Otto | 20 |
| 2 | Maria | NULL |
| 3 | NULL | 19 |
| 4 | Anna | 20 |
SELECT COUNT(DISTINCT age) AS unique_ages
FROM students;
结果:
| unique_ages |
|---|
| 2 |
用 COUNT() 时常见的坑
以为 COUNT(column) 会统计所有行,包括 NULL。
其实不是:COUNT(column) 会跳过指定列是 NULL 的行。
用 COUNT(*) 来统计唯一值。
这种情况应该用 COUNT(DISTINCT column)。
统计带过滤条件的数据时容易忘事。
比如:
SELECT COUNT(*) FROM students WHERE age > 20;
这里你只会得到年龄大于20的学生数,因为 WHERE 已经先把行过滤掉了。
这些细节经常会让人写出逻辑错误的 SQL,记得多注意点哈!
GO TO FULL VERSION