180

正如标题所暗示的那样......我试图以最少的开销找出最快的方法来确定表中是否存在记录。

示例查询:

SELECT COUNT(*) FROM products WHERE products.id = ?;

    vs

SELECT COUNT(products.id) FROM products WHERE products.id = ?;

    vs

SELECT products.id FROM products WHERE products.id = ?;

假设?'TB100'...交换了第一个和第二个查询都将返回完全相同的结果(例如...1对于此对话)。最后一个查询将按'TB100'预期返回,或者如果id表中不存在则什么也不返回。

目的是确定是否id在表中。如果不是,程序将接下来插入记录,如果是,程序将跳过它或执行基于此问题范围之外的其他程序逻辑的 UPDATE 查询。

哪个更快并且开销更少?(每次程序运行都会重复上万次,一天会运行很多次)。

(通过 M$ 提供的 JDBC 驱动程序从 Java 对 M$ SQL Server 运行此查询)

4

14 回答 14

232

EXISTS(or NOT EXISTS) 是专门为检查是否存在而设计的,因此应该是(并且是)最好的选择。它将在匹配的第一行停止,因此它不需要TOP子句,并且它实际上不选择任何数据,因此没有列大小的开销。您可以在这里安全地使用- 与,或...SELECT *没有什么不同(您甚至可以使用无效的表达式,例如,它不会中断)SELECT 1SELECT NULLSELECT AnyColumnSELECT 1/0

IF EXISTS (SELECT * FROM Products WHERE id = ?)
BEGIN
--do what you need if exists
END
ELSE
BEGIN
--do what needs to be done if not
END
于 2013-08-07T22:17:28.673 回答
198

SELECT TOP 1 products.id FROM products WHERE products.id = ?;将优于您的所有建议,因为它会在找到第一条记录后终止执行。

于 2013-08-07T21:56:07.267 回答
25

没有什么比得上——

SELECT TOP 1 1 FROM products WHERE id = 'some value';

您无需计数即可知道表中是否有数据。并且不要在不需要时使用别名。

于 2013-08-07T22:09:52.173 回答
16
SELECT CASE WHEN EXISTS (SELECT TOP 1 *
                         FROM dbo.[YourTable] 
                         WHERE [YourColumn] = [YourValue]) 
            THEN CAST (1 AS BIT) 
            ELSE CAST (0 AS BIT) END

这种方法为您返回一个布尔值。

于 2015-12-23T20:35:25.547 回答
11

你也可以使用

 If EXISTS (SELECT 1 FROM dbo.T1 WHERE T1.Name='Scot')
    BEGIN
         --<Do something>
    END 

ELSE    
     BEGIN
       --<Do something>
     END
于 2016-08-17T10:11:59.573 回答
11

不要以为有人提到过它,但如果您确定数据不会在您下方更改,您可能还需要应用 NoLock 提示以确保在读取时不会阻止它。

SELECT CASE WHEN EXISTS (SELECT 1 
                     FROM dbo.[YourTable] WITH (NOLOCK)
                     WHERE [YourColumn] = [YourValue]) 
        THEN CAST (1 AS BIT) 
        ELSE CAST (0 AS BIT) END
于 2017-07-04T02:02:18.393 回答
4

以下是确定数据库中是否存在记录的最简单和最快的方法 好在它适用于所有关系数据库

SELECT distinct 1 products.id FROM products WHERE products.id = ?;
于 2017-02-07T09:24:42.927 回答
3
SELECT COUNT(*) FROM products WHERE products.id = ?;

这是适用于所有数据库的跨关系数据库解决方案。

于 2015-09-21T09:12:38.827 回答
1

对于那些从 MySQL 或 Oracle 背景绊倒的人 - MySQL 支持 LIMIT 子句来选择有限数量的记录,而 Oracle 使用 ROWNUM。

于 2018-01-23T08:42:44.963 回答
0
create or replace procedure ex(j in number) as
i number;
begin
select id into i from student where id=j;
if i is not null then
dbms_output.put_line('exists');
end if;
exception
   when no_data_found then
        dbms_output.put_line(i||' does not exists');

end;
于 2014-05-25T14:01:54.583 回答
0

我过去使用过它,它不需要全表扫描来查看是否存在。它超级快...

UPDATE TableName SET column=value WHERE column=value
IF @@ROWCOUNT=0
BEGIN
     --Do work
END             
于 2015-04-01T19:38:08.787 回答
0

对于 MySql,您可以使用 LIMIT 如下所示(示例显示在 PHP 中)

  $sql = "SELECT column_name FROM table_name WHERE column_name = 'your_value' LIMIT 1";
  $result = $conn->query($sql);
  if ($result -> num_rows > 0) {
      echo "Value exists" ;
  } else {
      echo "Value not found";
  }
于 2021-01-31T08:55:17.280 回答
0

SQL 服务器 2012+

SELECT IIF((SELECT TOP 1 1 FROM dbo.[YourTable] WHERE [YourColumn] = [YourValue]) IS NULL, 0, 1)
于 2021-04-13T06:24:21.430 回答
-1

为什么不简单地使用

SELECT EXISTS (SELECT 1 FROM products WHERE products.id = ?)
于 2021-04-21T04:55:19.417 回答