【发布时间】:2016-05-25 13:53:47
【问题描述】:
我有这个问题:
SELECT * FROM mytable t1
WHERE t1.id = :id AND
EXISTS(SELECT 1 FROM t2 WHERE t2.post_id = :id)
当我删除 EXISTS() 函数时,我的代码仍然有效:
SELECT * FROM mytable t1
WHERE t1.id = :id AND
(SELECT 1 FROM t2 WHERE t2.post_id = :id LIMIT 1)
那我为什么要写这个?它有什么优势?
【问题讨论】:
-
Exists 在第一次匹配时返回。子查询检索所有匹配的记录。去阅读手册。
-
@Pred 感谢您的提示。但是我已经编辑了我的第二个查询,那么现在有什么不同吗?
-
ANSI SQL 合规性是原因之一。
-
输入
EXISTS会痛,但LIMIT 1不会?EXISTS在语义上是正确的。您的第二个查询将在其他 DBMS 上失败,这只是一个不好的做法。如果您不小心没有使用 1 而是使用列名,并且匹配记录包含 NULL 或 0,MySQL 会将其强制转换为 FALSE,您的查询将提供错误结果。 -
您的第二个查询,如
SELECT * FROM mytable t1 WHERE t1.id = :id AND 1,这是一个正确的查询。因为1评估为真