我有这样的疑问:
SELECT * FROM mytable t1
WHERE t1.id = :id AND
EXISTS(SELECT 1 FROM t2 WHERE t2.post_id = :id)
Run Code Online (Sandbox Code Playgroud)
当我删除该EXISTS()
函数时,我的代码仍然有效:
SELECT * FROM mytable t1
WHERE t1.id = :id AND
(SELECT 1 FROM t2 WHERE t2.post_id = :id LIMIT 1)
Run Code Online (Sandbox Code Playgroud)
那么我为什么要这样写呢?它的优点是什么?
简而言之:
EXISTS
当找到第一个结果时返回,而不是获取所有匹配的记录(因此当有多个记录匹配条件时效率更高)EXISTS
语义上是正确的。1
当第二个查询中存在列名而不是,并且该列包含NULL
、FALSE
、0
等时,MySQL 会将其隐式转换为FALSE
,从而导致错误结果。EXISTS
实际上是由 ANSI 标准定义的,而第二种形式则不是。(第二个查询在其他DBMS中可能会失败)作为额外的旁注,*
当您使用 时,您也可以使用EXISTS
,因为它检查是否存在匹配的记录,而不是值。