Sql:如何正确地检查一条logging是否存在

读一些SQL调优文档我发现这个:

Select count(*)
– 统计行数
– 通常被错误地用来validationlogging的存在

Select count(*)真的不好吗?

validationlogging存在的正确方法是什么?

最好用一个

 select 1 from table where key = value; select count(1) from table where key = value; 

第一个select应该没有结果或者一个结果,第二个select应该是零或者一个。

您使用的文档有多大? 虽然你已经阅读了很好的build议,但是最近RDBMS中的大多数查询优化器都会优化select count(*) ,所以尽pipe在理论上(和较老的数据库)有所不同,但在实践中不应该注意到任何差异。

我宁愿不使用计数function:

 IF [NOT] EXISTS ( SELECT 1 FROM MyTable WHERE ... ) <do smth> 

例如,如果要在将用户插入数据库之前检查用户是否存在,则查询可以如下所示:

 IF NOT EXISTS ( SELECT 1 FROM Users WHERE FirstName = 'John' AND LastName = 'Smith' ) BEGIN INSERT INTO Users (FirstName, LastName) VALUES ('John', 'Smith') END 

您可以使用:

 SELECT 1 FROM MyTable WHERE <MyCondition> 

如果没有匹配条件的logging,则结果logging集为空。

其他的答案是相当不错的,但是添加LIMIT 1 (或者相当于防止检查不必要的行也是有用的。

您可以使用:

 SELECT COUNT(1) FROM MyTable WHERE ... 

要么

 WHERE [NOT] EXISTS ( SELECT 1 FROM MyTable WHERE ... ) 

这比SELECT *效率更高,因为您只需为每行select值1,而不是所有的字段。

COUNT(*)和COUNT(列名称)之间也有细微差别:

  • COUNT(*)将统计所有行,包括空值
  • COUNT(column name)只会计算列名称的非空出现次数
 SELECT COUNT(1) FROM MyTable WHERE ... 

将循环所有的logging。 这是logging存在不好的原因。

我会用

 SELECT TOP 1 * FROM MyTable WHERE ... 

find1条logging后,会终止循环。

您可以使用:

 SELECT 1 FROM MyTable WHERE... LIMIT 1 

使用select 1来防止检查不必要的字段。

LIMIT 1以防止检查不必要的行。