暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

COUNT()函数详解

Java修炼记 2021-04-07
829

COUNT 顾名思义,就是计数的意思,此函数用处:对表中记录数进行计数。

MySQL COUNT()函数介绍

COUNT()
函数返回表中的行数。 COUNT()
函数允许您对表中符合特定条件的所有行进行计数。

COUNT()
函数的语法如下 -

  COUNT(expression)

  1. COUNT()



    函数的返回类型为BIGINT
    。如果没有找到匹配的行,则COUNT()
    函数返回0


COUNT
函数有几种形式:COUNT(*)
COUNT(1)COUNT(column), COUNT(DISTINCT column)COUNT(expression)

COUNT(*)函数

COUNT(*)
函数返回由SELECT语句返回的结果集中的行数。COUNT(*)
函数计算包含NULL
和非NULL
值的行,即:所有行。

如果使用COUNT(*)
函数对表中的数字行进行计数,而不使用WHERE子句选择其他列,则其执行速度非常快。

这种优化仅适用于MyISAM表,因为MyISAM表的行数存储在information_schema
数据库的tables
表的table_rows
列中; 因此,MySQL可以很快地检索它。

COUNT(1)函数

count(1)这个用法和count(*)的结果是一样的。

 COUNT(DISTINCT COLUMN)

MySQL COUNT(DISTINCT column)
返回不包含NULL
值的唯一行数。

 COUNT(COLUMN)

MySQL COUNT(column)
返回不包含NULL
值的所有行数。

COUNT(expression)

COUNT(expression)
返回不包含NULL
值的行数,expression 是表达式。

 

下面来看一下例子:

原表数据:

 

1、count(*)

 SELECT COUNT(*) count FROM t_iov_help_feedback

 结果:

可以看到,只要表中存在记录,不管是否有字段为NULL,都会被count出来,查询出来数量4(全部)

 

2、count(1)

 SELECT COUNT(1) count FROM t_iov_help_feedback

 结果:

可以看到,count(1)这个用法和count(*)的结果是一样的,查询出来数量为4(全部)

如果表没有主键,那么count(1)比count(*)快;

如果有主键,那么count(主键,联合主键)比count(*)快;

如果表只有一个字段,count(*)最快。

count(1)跟count(主键)一样,只扫描主键。count(*)跟count(非主键)一样,扫描整个表。明显前者更快一些。

性能问题:
1.任何情况下SELECT COUNT(*) FROM tablename是最优选择,(指没有where的情况);
2.尽量减少SELECT COUNT(*) FROM tablename WHERE COL = ‘value’ 这种查询;
3.杜绝SELECT COUNT(COL) FROM tablename WHERE COL2 = ‘value’ 的出现。


 3、count(column)

 SELECT COUNT(UPLOAD_PICTURES) count FROM t_iov_help_feedback;

结果:

 

可以看到,将UPLOAD_PICTURES 字段为 NULL 的记录不计算在内,有1条记录为NULL,所以查询出来数量为3。

 

4、count(DISTINCT column)

 SELECT COUNT(DISTINCT UPLOAD_PICTURES) count FROM t_iov_help_feedback;

结果:

 可以看到,将UPLOAD_PICTURES 字段为 NULL 的记录不计算在内,以及重复的记录只算1条。

有条记录为NULL,有两条记录UPLOAD_PICTURES 字段值重复(都为“s”),所以查询出来数量为2。

 

5、count(expression)

expression表示一个表达式,意思是在count中我们可以得到符合特点条件的记录数。

例子1,查询 is_reply=0 的数量:

 SELECT COUNT(IF(is_reply=0,1,NULL)) count FROM t_iov_help_feedback;

结果:

可以看到,is_reply=0 的记录是3条,所以查询出来数量为3。

 

例子2,查询 is_reply=1 的数量:

 SELECT COUNT(IF(is_reply=1,1,NULL)) count FROM t_iov_help_feedback;

结果:

可以看到,is_reply=1 的记录是1条,所以查询出来数量为1。

 

COUNT(IF(is_reply=1,1,NULL)) 语句解析:

IF(表达式1,表达式2,表达式3),

IF() 函数就是一个简单的判断器,它会判断第一个参数是否成立,如果成立,IF函数将返回表达式2,否则返回表达式3

这里意思是:如果is_reply=1,IF函数将返回1
,否则返回NULL
。 COUNT
函数只计数1
,而不是NULL
值,因此查询根据相应的状态返回记录数。

 

OK,That's all.

文章转载自Java修炼记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论