count(1),count(列名),count(*)详解!
目录
- 一、核心区别:
- 二、总结
🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解MySQL的explain执行计划请看: MySQL的explain执行计划你真的了解吗?建议收藏!
其他优质专栏: 【🎇SpringBoot】【🎉多线程】【🎨Redis】【✨设计模式专栏(已完结)】…等
如果喜欢作者的讲解方式,可以点赞收藏加关注,你的支持就是我的动力
✨更多文章请看个人主页: 码熔burning
好,咱们来详细聊聊 COUNT(1)
、COUNT(*)
和 COUNT(列名)
这三个 SQL 函数的区别,保证你一看就懂!
一、核心区别:
COUNT(*)
: 统计表中的总行数,包含NULL
值的行。COUNT(1)
: 统计表中的总行数,包含NULL
值的行。 它实际上是往表中加了一个值为 1 的列,然后统计这个列的行数。COUNT(列名)
: 统计指定列中非NULL
值的行数。 如果某行该列的值是NULL
,则不会被计入。
解释:
想象你是一个图书管理员,要统计图书馆里的书籍数量:
COUNT(*)
: 你直接数图书馆里所有的书架,不管书架上有没有书,都算一个。 这就是统计表里所有行,不管有没有数据。COUNT(1)
: 你给每个书架贴一个标签,写上数字 “1”,然后数有多少个标签。 结果和COUNT(*)
一样,都是统计所有书架。COUNT(书名)
: 你只数有书的书架,如果某个书架是空的(书名
列是NULL
),就不算。 这就是统计指定列非NULL
值的行。
实际例子:
假设我们有一个 students
表,包含以下数据:
id | name | age | city |
---|---|---|---|
1 | Alice | 20 | New York |
2 | Bob | 22 | London |
3 | Carol | NULL | Paris |
4 | David | 21 | NULL |
5 | Eve | 23 | Tokyo |
现在,我们执行以下 SQL 查询:
-
SELECT COUNT(*) FROM students;
结果:
5
解释:统计
students
表的总行数,包括Carol
和David
的行,因为它们也是表中的行。 -
SELECT COUNT(1) FROM students;
结果:
5
解释:和
COUNT(*)
一样,统计students
表的总行数。 -
SELECT COUNT(age) FROM students;
结果:
4
解释:统计
age
列中非NULL
值的行数。Carol
的age
是NULL
,所以不计入。 -
SELECT COUNT(city) FROM students;
结果:
4
解释:统计
city
列中非NULL
值的行数。David
的city
是NULL
,所以不计入。
性能考虑:
- 在大多数情况下,
COUNT(*)
和COUNT(1)
的性能几乎没有差别,优化器通常会进行优化。 它们通常比COUNT(列名)
更快,因为不需要读取特定列的数据。 COUNT(列名)
需要读取指定列的数据,如果该列没有索引,可能会导致性能下降。
二、总结
函数 | 作用 | 是否包含 NULL 值的行 | 性能 |
---|---|---|---|
1 | Alice | 20 | New York |
2 | Bob | 22 | London |
3 | Carol | NULL | Paris |
4 | David | 21 | NULL |
5 | Eve | 23 | Tokyo |
什么时候用哪个?
COUNT(*)
或COUNT(1)
: 当你需要知道表中有多少行数据时,这是最常用的。COUNT(列名)
: 当你需要知道某个特定列有多少个非NULL
值时,例如,统计有多少学生填写了年龄信息。
希望这篇文章能够帮助你理解 COUNT(*)
、COUNT(1)
和 COUNT(列名)
的区别! 记住,理解它们的核心在于是否统计 NULL
值的行。