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

SQL查询优化:count(1)vscount(*)vscount(指定字段)
文章比较了count(1),count(*),和count(指定字段)在统计记录数和执行效率上的差异,指出count(*)在大多数情况下自动优化,而count(1)在有主键时可能更快,但count(指定字段)针对具体字段统计,忽略NULL值。

一、count(1)和count(*)
当表的数据量比较大,对表作分析之后,使用count(1)比使用count(*)用时多。
从执行计划看,count(1)和count(*)的效果是一样的。 但是在表做过分析之后,count(1)会比count()的用时少些。
如果count(1)是聚索引,id,那肯定是count(1)快。但是差的很小的。
因为count(*),自动会优化指定到那一个字段。所以没必要去count(1),用count(*),sql会帮你完成优化,所以count(1)和count()基本没有差别。

二、count(1)和count(指定字段)
两者的主要区别是
(1) count(1) 会统计表中的所有的记录数, 包含字段为null 的记录。
(2) count(字段) 会统计该字段在表中出现的次数,忽略字段为null 的情况。即 不统计字段为null 的记录。

三、count(*) 和 count(1)和count(指定字段)区别
执行效果上 :
count(*)包括了所有的列,相当于行数,在统计结果的时候, 不会忽略列值为NULL
count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候, 不会忽略列值为NULL
count(字段)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者0,而是表示null)的计数, 即某个字段值为NULL时,不统计。

执行效率上:
列名为主键,count(指定字段)会比count(1)快
列名不为主键,count(1)会比count(指定字段)快
如果表多个列并且没有主键,则 count(1) 的执行效率优于 count(*)
如果有主键,则 select count(主键)的执行效率是最优的
如果表只有一个字段,则 select count(*)最优。
————————————————
版权声明:本文为优快云博主「小王聊技术」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/qq_21103471/article/details/124706159

在SQL中,`COUNT(*)` `COUNT(1)` 是两种常见的用法,它们在大多数数据库系统中(如Oracle、MySQL、SQL Server)的行为是相同的,但理解它们的设计意图潜在区别对于深入掌握SQL查询是有帮助的。 ### `COUNT(*)` 的含义 `COUNT(*)` 用于计算查询返回的所有行数,包括所有列中的 `NULL` 值重复行。它不关心某列是否有值,只要该行存在,就会被计入总数。例如: ```sql SELECT COUNT(*) "Total" FROM employees; ``` 这条语句将返回 `employees` 表中的总记录数,无论任何列是否有值[^2]。 ### `COUNT(1)` 的含义 `COUNT(1)` 实际上 `COUNT(*)` 是等效的。这里的 `1` 是一个常量表达式,表示每一行都会被计数,而不论表中实际列的内容如何。数据库优化器通常会将 `COUNT(1)` 转换为 `COUNT(*)` 来执行。例如: ```sql SELECT COUNT(1) "Total" FROM employees; ``` 这条语句同样返回 `employees` 表中的总记录数[^1]。 ### `COUNT(*)` `COUNT(1)` 的区别 尽管两者在功能上是相同的,但在语义可读性方面存在细微差异: - **语义清晰性**:`COUNT(*)` 更加直观,明确表示“统计所有行”,而 `COUNT(1)` 则可能让初学者困惑,不知道 `1` 的意义。 - **性能差异**:在大多数现代数据库系统中,`COUNT(*)` `COUNT(1)` 的执行计划是相同的,因此性能上没有显著差异。然而,某些旧版本的数据库可能会对两者有不同的处理方式,但这在当前主流系统中已不常见[^1]。 ### 使用场景建议 - 如果你的目标是统计表中的总行数,推荐使用 `COUNT(*)`,因为它更具可读性语义清晰性。 - 如果出于某种原因需要使用常量表达式(如在某些复杂查询中作为子查询的一部分),可以使用 `COUNT(1)`,但这种情况较为少见。 ### 示例代码 以下是一个简单的对比示例: ```sql -- 使用 COUNT(*) SELECT COUNT(*) AS total_rows FROM employees; -- 使用 COUNT(1) SELECT COUNT(1) AS total_rows FROM employees; ``` 两个查询将返回相同的结果。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值