为什么要在 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
,且该列包含NULL
、FALSE
、0
等时,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
没有任何东西被认为是 True
或 False
分别。
与 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 True
或 False
.
引用自 MySQL Dev site
我有这个查询:
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
,且该列包含NULL
、FALSE
、0
等时,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
没有任何东西被认为是 True
或 False
分别。
与 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 True
或 False
.
引用自 MySQL Dev site