Answers:
最好使用以下两种方法之一:
-- Method 1.
SELECT 1
FROM table_name
WHERE unique_key = value;
-- Method 2.
SELECT COUNT(1)
FROM table_name
WHERE unique_key = value;
第一个选择应该没有结果或一个结果,第二个计数应该为零或一个。
您使用的文档多久了?尽管您已经阅读了很好的建议,但SELECT COUNT(*)
无论如何,最新的RDBMS优化中的大多数查询优化器还是会如此,因此尽管理论(和较旧的数据库)有所不同,但您在实践中应该不会注意到任何差异。
我宁愿完全不使用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
您可以使用:
SELECT 1 FROM MyTable WHERE <MyCondition>
如果没有符合条件的记录,则结果记录集为空。
SELECT COUNT(1) FROM MyTable WHERE ...
将遍历所有记录。这就是很难用于记录存在的原因。
我会用
SELECT TOP 1 * FROM MyTable WHERE ...
找到1条记录后,它将终止循环。
SELECT TOP 1
找到一个后实际上终止了它还是继续找到了所有可以说出哪个是TOP的东西?
IF EXISTS (SELECT TOP 1 1 FROM ... WHERE ..)
您可以使用:
SELECT COUNT(1) FROM MyTable WHERE ...
要么
WHERE [NOT] EXISTS
( SELECT 1 FROM MyTable WHERE ... )
这将比SELECT *
您只需为每一行而不是所有字段选择值1 来提高效率。
COUNT(*)和COUNT(列名)之间也有细微的区别:
COUNT(*)
将计算所有行,包括空值COUNT(column name)
将仅计算出现的列名称的非空值count(1)
和之间的性能差异count(*)
仅在大多数脑瘫的DBMS中有所不同。
count(*)
和之间没有真正的区别count(1)
。我不能说其他 DBMS 是否如此。
您可以使用:
SELECT 1 FROM MyTable WHERE... LIMIT 1
使用select 1
以避免不必要的字段的检查。
使用LIMIT 1
以避免不必要的行的检查。