八股:MySQL 中 count(*)、count(1) 和 count(字段名) 有什么区别?

106 阅读5分钟

对话式解答

什么是count()?

大佬: 哎?你知道SQL语句里面的count()是啥意思不?

凯歌: 必须的啊,count()是一个函数,用来统计结果里面,不是null的个数或者满足特殊条件的个数

什么是 * ?

大佬: 那我看有人写count(*),***** 啥意思啊?统计* 的个数?

凯歌: 哈哈,当然不是,* 其实是个通配符,一般我们认为在SQL里 * 代表所有的列名

凯歌: 就像你使用select * 会给你返回整行数据里所有列的名和值一样,这里的 * 代表整行数据中所有列的数据

凯歌: 比如,我们的user表中,有四列

凯歌: 当我们使用下面里的两个SQL 得到的结果是一样的

select id,name,age,score from user limit 1;

 select * from user limit 1;

凯歌: 结果都是下面这个,所以 * 可以理解为 所有的列名

大佬: ok,我懂,那啥,你说那个通配符,你给我展开讲讲呗?

凯歌: 这个啊,这个简单,就是通过用一个符号,来表示一个或者多个字符的意思。

凯歌: 比如我们在select 中 使用 * 代表多列的意思,这个就是一个符号,代表多个字符的代表,这个通配符,其实还蛮多的,我给你画个表格吧

image.png

什么是count(*)?

大佬: 哦, 这通配符 我明白了,那count(*)那?

凯歌: 最开始,我们说count()是统计,结果中值≠null的个数嘛,还说还可以统计满足特殊条件的个数,是吧,这个count(*) 就是里面说的特殊条件

凯歌: 根据我们之前说的, * 代表所有列, count() 代表统计结果 不是null的个数,那么按理说,count(*) 就是统计 数据里 所有列都不是null的数据的个数

凯歌: 但是!count(*) 实际上,我们就是想统计一下一共有多少行,不需要看里面是不是有哪一行没数据

凯歌: 就像 我想统计下,一共有多少袋大米,如果按照我们之前的说法,那不是我们需要拆开大米袋,一袋一袋的看里面 每个米粒,判断下 这个米粒 到底是大米 还是沙子?要这么麻烦,还过不过了?

凯歌: 所以 mysql给count()一个特殊情况,就是当你使用 count()的时候,我就不管你到底里面每个列有没有null值,只要你是一列 我就给你算1个

凯歌: 于是count(*)的意思就是,统计你这个表中 有多少行 不管行里的列有没有null

凯歌: 上图

第一张图中,我们的name列 是null 我们执行count(*) 得到第二张图,100万的结果 我们执行 count(name) 得到第三张图 ,99.9999的结果

什么是count(1)?

大佬: count(*)那,我懂了,count(1)就是统计表中,1有多少行,是不是?

凯歌: 哈哈哈,非常正确那!count(1)就是统计表里面 有多少行 的结果是 1

大佬: 那不对啊,我表里面没有数据是1的啊?为啥我执行count(1)和执行count(*) 得到的结果一样那? 你看下面那图? 凯歌: 哈哈哈,这里面有个小秘密,你听我给你讲完,你就知道了

凯歌: 我们之前是不是说,count()是统计结果中 不为null的个数?

大佬: 对,你接着说

凯歌: 那你看,当我们写count(1)的时候,就是统计 1 不为null的个数 对不对?

凯歌: 当我们mysql看到count(1)的时候,就会去找到我们的结果集,找到每一行,找到每一行后,就开始执行判断,判断1 是不是null 如果不是 那就算找到一个不为null的数据行,然后下一个,但是我们这个1,永远不为null是不是,所有就是我们结果集里的所有行的个数,类似于count(*)一样的效果

凯歌: 举个例子,count(1)像什么那?就像,前面有100袋大米,然后你老板让你去每袋大米前面写个1,然后记下个数,不管里面是不是大米,只管你写了多少个1 ,明白不?

凯歌: count(1) 就相当于在结果集里的每行数据上写了个1,然后统计了下1的个数,压根不管你数据里是不是null

凯歌: 同理,不管你是count(1) count('凯歌') count(true) 结果都是一样的

大佬: 害,你早这么说 我不早明白了

凯歌: 是是是,我的错,那您还有啥问题不?

大佬: 没问题了,那个我想清楚了,count(列名),那就是去结果集里面,看看当前数据的列名那一列的值是不是null呗,如果不是就算1个

凯歌: 对对对,就是这个意思

count(*)、count(1)、count(列名)的区别?

**大佬:**那啥,我针对这仨 做了的对比的表 你给我看看 对不对呗?

凯歌: 没问题

image.png

什么是函数?

大佬: 那啥,说了这么多了,啥是函数,你也给我说说呗,我看跟我想的一样不。

凯歌: 可以啊,函数就是方法,方法就是一种处理过程,打个比喻:你有一个芒果,你想喝芒果汁,你通过榨汁机,得到了芒果汁,那么榨汁机,实现的其实就是一个函数,就是把芒果转换成了芒果汁。

凯歌: 当然,函数有官方解释:一种可以执行特殊任务或计算的代码块,一般有:入参、处理过程、出参,三部分组成,具有可以重复调用的特性。

Mysql中有哪些函数?

大佬: 哦,果然跟我想的一样,那mysql里面有多少种函数那?

凯歌: 那可多了,我挑重点给你列个表吧。

image.png

凯歌:以上,就是我们本次关于MySQL 中 count(*)、count(1) 和 count(字段名) 有什么区别?的讲解了,若有错误,请帮忙指出,一定修改。