在我的SQL查询中,我只需要检查特定用户标识是否存在数据。
我总是只想要一个在数据存在时返回的行。
我有两个选择
1. select count(columnname) from table where userid=:userid
2. select count(1) from tablename where userid=:userid
我认为第二个是我应该使用的那个,因为与第一个相比,它可能有更好的响应时间。
答案 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?这样查询看起来更友好。