用于检查 SQLite3 中是否存在行的有效查询

问题描述 投票:0回答:2

这是检查表中是否存在行的最有效方法吗?

SELECT EXISTS(SELECT 1 FROM myTbl WHERE u_tag="tag");

桌子是...

CREATE TABLE myTbl(id INT PRIMARY KEY, u_tag TEXT);

如果该行不存在,那么返回值是什么?是 false (bool) 还是 0 (int) 还是 NULL?

sqlite
2个回答
144
投票

虽然文档没有暗示这一点,但显然主要的 sqlite 开发人员(Richard Hipp)已经在邮件列表中确认

EXISTS
对你来说是短路的。

SQLite 中的查询规划器虽然并不出色,但足够聪明 知道它一看到第一行就可以停止并返回 true 来自 EXISTS() 内部的查询。

因此您提出的查询将是最有效的:

SELECT EXISTS(SELECT 1 FROM myTbl WHERE u_tag="tag");

如果您对可移植性感到紧张,您可以添加限制。我怀疑大多数 DB 都会为您提供相同的短路。

SELECT EXISTS(SELECT 1 FROM myTbl WHERE u_tag="tag" LIMIT 1);

如果您不需要记录中的某些内容,则选择 1 是可接受的做法,尽管您选择的内容无论如何都不重要。

在标签字段上放置索引。如果不这样做,对不存在标签的查询将进行全表扫描。

EXISTS
表示它将返回 1 或 0,而不是 null。


17
投票

再次引用文档

EXISTS 运算符的计算结果始终为整数值 0 和 1 之一。如果执行指定为 EXISTS 运算符右侧操作数的 SELECT 语句将返回一行或多行,则 EXISTS 运算符的计算结果为 1。如果执行SELECT 将根本不返回任何行,然后 EXISTS 运算符的计算结果为 0。

至于使用

EXISTS
是否比使用
count(*)
更高效,这可能取决于表的大小以及表是否有索引。尝试对两个查询进行 EXPLAIN 进行基准测试(或者只对每个查询进行计时)。

© www.soinside.com 2019 - 2024. All rights reserved.