这是检查表格中是否存在行的最佳(最有效)方法吗?
SELECT EXISTS(SELECT 1 FROM myTbl WHERE u_tag="tag");
// Table is...
// CREATE TABLE myTbl(id INT PRIMARY KEY, u_tag TEXT);
还有什么是返回值,是假(bool)还是0(int)还是NULL?
答案 0 :(得分:71)
虽然文档并不暗示它,但显然主要的sqlite dev(Richard Hipp)有confirmed in the mailing list 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。
答案 1 :(得分:8)
再次引用the documentation:
EXISTS运算符始终求值为整数值0和1之一。如果执行指定为EXISTS运算符的右侧操作数的SELECT语句将返回一行或多行,则EXISTS运算符的计算结果为1。执行SELECT将根本不返回任何行,然后EXISTS运算符的计算结果为0。
关于使用EXISTS
是否比使用count(*)
更有效,这可能取决于表的大小以及表是否具有索引。在两个查询上尝试EXPLAIN进行基准测试(或者只计算每个查询的时间)。