count(1)和count(*)区别详述

文章讨论了在SQL查询中使用count(1)和count(*)的区别,两者在统计包含NULL值的记录时几乎没有差异。count(1)和count(*)都会计算NULL,因为它们分别对应于主键和非主键的计数。在执行时间方面,若表无主键,count(1)更快;若有主键,两者接近;若只有一个字段,count(*)最快。因此,在对执行时间要求高的情况下,count(1)可能是更好的选择。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

最近在使用select查询语句时,使用了聚合函数中的count(),但是在使用时,遇到查数时有时候用count(*),有时候使用count(1),就突然好奇其区别。研究了一会,总结如下:

几乎没区别

几乎没区别的原因如下

count(1)和count(*)  在统计数量时都可以统计Null    

注:1、NULL或者null,不是空值     2、NULL与null无区别

idtype
11
2NULL
3

 如上表:第二行:NULL; 第三行:空

select count(1) from table   
结果为3

select count(*) from table 
结果为3


补充1:count(1)和count(*)为什么会计算Null

一、count(1)为啥会计算Null?

  1.        原因是count(1)是相对于count(主键)
  2.        对于主键的定义有一个点即不可为Null

  所以综上两点:count(1)是可以统计Null

二、count(*)为啥会计算Null?

       1、原因是count(*)是相对于count(非主键)

       2、count(非主键)相当于扫描整个表

  所以综上两点:count(*)是可以统计Null


补充2:count(1)和count(*)谁执行时间更短?

针对补充1中所述,分多种情况考虑:

  1. 若表无主键,则count(1)比count(*)执行时间更短。因为count(*)相当于整表的扫描。
  2. 若表有主键,count(*)会自动优化到主键列,此时count(1)与count(*)接近
  3. 若表仅一个字段,则count(*)执行时间最短


小结:

        count(1)和count(*)几乎没差别,但是对sql时间要求极为严格时候使用count(1)最好,这是因为大部分表都存在主键,同时也很少表仅一个字段。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木木子!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值