Sql:如何正确检查记录是否存在

时间:2010-11-23 08:15:26

标签: sql optimization query-optimization

阅读一些 SQL Tuning 文档,我发现了这个:

Select count(*)
- 计算行数
- 通常不正确地用于验证记录的存在

Select count(*)真的那么糟糕吗?

验证记录存在的正确方法是什么?

9 个答案:

答案 0 :(得分:207)

最好使用以下任一项:

-- Method 1.
SELECT 1
FROM table_name
WHERE key = value;

-- Method 2.
SELECT COUNT(1)
FROM table_name
WHERE key = value;

第一种选择不应该给你一个结果或一个结果,第二个计数应该是零或一。

您使用的文档多大了?虽然你已经阅读了很好的建议,但最近RDBMS中的大多数查询优化器无论如何都会优化SELECT COUNT(*),所以虽然理论上(和旧数据库)存在差异,但你不应该注意到实践中的任何差异。

答案 1 :(得分:172)

我不想完全使用Count函数:

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

答案 2 :(得分:18)

您可以使用:

SELECT 1 FROM MyTable WHERE <MyCondition>

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

答案 3 :(得分:12)

其他答案非常好,但添加LIMIT 1(或the equivalent以防止检查不必要的行也很有用。

答案 4 :(得分:9)

您可以使用:

SELECT COUNT(1) FROM MyTable WHERE ... 

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

这比SELECT *更有效,因为您只是为每一行选择值1,而不是为所有字段选择值。

COUNT(*)和COUNT(列名)之间也存在细微差别:

  • COUNT(*)将计算所有行,包括空值
  • COUNT(column name)只会计算列名
  • 非空出现次数

答案 5 :(得分:8)

SELECT COUNT(1) FROM MyTable WHERE ...

将循环播放所有记录。这就是用于记录存在的原因。

我会用

SELECT TOP 1 * FROM MyTable WHERE ...

找到1条记录后,它将终止循环。

答案 6 :(得分:7)

您可以使用:

SELECT 1 FROM MyTable WHERE... LIMIT 1

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

使用LIMIT 1来阻止检查不必要的行。

答案 7 :(得分:0)

我正在使用这种方式:

IIF(EXISTS (SELECT TOP 1 1 
                FROM Users 
                WHERE FirstName = 'John'), 1, 0) AS DoesJohnExist

答案 8 :(得分:0)

其他选项:

SELECT CASE
    WHEN EXISTS (
        SELECT 1
        FROM [MyTable] AS [MyRecord])
    THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT)
END