为什么要在 MySQL 中使用 EXISTS() 函数?

Why should I use EXISTS() function in MySQL?

我有这个查询:

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 returns 当它找到第一个结果而不是获取所有匹配的记录时(因此当有多个记录匹配条件时效率更高)
  • EXISTS 在语义上是正确的。
  • 当第二个查询中有列名而不是1,且该列包含NULLFALSE0等时,MySQL 会将其隐式转换为 FALSE,这会导致错误的结果。
  • EXISTS实际上是由ANSI标准定义的,而第二种形式则没有。 (第二个查询在其他 DBMS 中可能会失败)

作为额外的旁注,当您使用 EXISTS 时,您也可以使用 *,因为它检查是否有匹配的记录,而不是值。

If a subquery returns any rows at all, EXISTS subquery is TRUE, and NOT EXISTS subquery is FALSE.

当你使用 ... (SELECT 1 FROM t2 WHERE t2.post_id = :id LIMIT 1) 时,你要么 return 1 成功,要么 NULL 没有任何东西被认为是 TrueFalse分别。

Exists 一起工作更专业,因为:

Traditionally, an EXISTS subquery starts with SELECT *, but it could begin with SELECT 5 or SELECT column1 or anything at all. MySQL ignores the SELECT list in such a subquery, so it makes no difference.

最好的方法是 return TrueFalse.

引用自 MySQL Dev site