CodeGym /课程 /SQL SELF /COUNT() 统计行数及其变体

COUNT() 统计行数及其变体

SQL SELF
第 7 级 , 课程 1
可用

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行,但有一行 nameNULLCOUNT(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

如果你想把 DISTINCTCOUNT(*) 一起用,会报错: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,记得多注意点哈!

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION