SQL查询:我应该使用哪一个? count(“columnname”)或count(1)

时间:2010-01-05 08:31:40

标签: sql

在我的SQL查询中,我只需要检查特定用户标识是否存在数据。

我总是只想要一个在数据存在时返回的行。

我有两个选择

1. select count(columnname) from table where userid=:userid

2. select count(1) from tablename where userid=:userid

我认为第二个是我应该使用的那个,因为与第一个相比,它可能有更好的响应时间。

6 个答案:

答案 0 :(得分:2)

count(*)count(column)之间可能存在差异。出于discussed here的原因,count(*)通常最快。基本上,对于count(column),数据库必须检查每行中column是否为空。使用count(column),它只返回表中可能存在的总行数。确切的细节可能取决于数据库和数据库的版本。

简答:使用count(*)count(1)。好吧,忘了点数和select userid

您还应该确保where子句运行良好,并使用索引。查看EXPLAIN

答案 1 :(得分:2)

我想指出:

select count(*) from tablename where userid=:userid

与第二个解决方案具有相同的效果,其优点是count(*)明确表示“计算所有行”。

*中的COUNT(*)不会扩展到所有列 - 也就是说*中的SELECT COUNT(*)SELECT *中的COUNT(*)不同。因此,在编写COUNT(1)

时,您无需担心性能问题

1的缺点是它不太清楚:你的意思是什么?在某些字体中,字面值(l)可能看起来像小写字母L(this:{{1}})。

答案 2 :(得分:1)

如果columnname可以为NULL,则会给出不同的结果,否则性能相同。

优化器(至少SQL Server)实现COUNT(1)是微不足道的。您也可以使用COUNT(1/0)

答案 3 :(得分:1)

这取决于你想做什么。

第一个计算具有非null值columnname的行。第二个计算所有行。

您想要哪种行为?从问题的措辞方式来看,我想你想要第二个。

答案 4 :(得分:1)

要计算您应该使用第二个选项的记录数,或者更确切地说:

select count(*) from tablename where userid=:userid

您还可以使用exists()函数:

select case when exists(select * from tablename where userid=:userid) then 1 else 0 end

在某些情况下,数据库可能会更有效地执行后者,因为它可以在找到匹配后立即停止查找,而不是比较所有记录。

答案 5 :(得分:-1)

嘿如何从tablename中选择count(userid)userid =:userid?这样查询看起来更友好。