我有这样的疑问:
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)
我为什么要这么写?它有什么好处?
3条答案
按热度按时间zzlelutf1#
简而言之:
EXISTS
在找到第一个结果时返回,而不是获取所有匹配的记录(因此,当有多个记录匹配条件时,它的效率更高)EXISTS
在语义上是正确的。1
,并且该列包含NULL
、FALSE
、0
等时,MySQL将隐式地将其转换为FALSE
,这将导致错误的结果。EXISTS
实际上是由ANSI标准定义的,而第二种形式不是。(第二种查询在其他DBMS中可能会失败)另外,当您使用
EXISTS
时,使用*
也可以,因为它检查是否存在匹配的记录,而不是值。n3ipq98p2#
我将展示
EXISTS
的用例。http://sqlfiddle.com/#!9/066db1/1原始结果:
使用具有
WHERE
条件的帐簿1进行过滤:使用手册1和
EXISTS
进行过滤:查询:
gwo2fgha3#
如果子查询返回任何行,则EXISTS子查询为TRUE,NOT EXISTS子查询为FALSE。
当你使用
... (SELECT 1 FROM t2 WHERE t2.post_id = :id LIMIT 1)
时,你要么在成功时返回1
,要么在没有东西时返回NULL
,这分别被认为是True
或False
。使用
Exists
更专业,因为:传统上,EXISTS子查询以SELECT * 开头,但它也可以以SELECT 5或SELECT column1或任何其他开始,MySQL忽略了这样的子查询中的SELECT列表,因此没有区别。
返回
True
或False
的方法最好。从MySQL Dev site引用