这是可读性的问题。表现没有差异 旧版本的SQL Server傻到查找元数据,但不再是。
SELECT foo FROM bar WHERE EXISTS (SELECT * FROM baz WHERE baz.id = bar.id);
SELECT foo FROM bar WHERE EXISTS (SELECT 1 FROM baz WHERE baz.id = bar.id);
我不是在考虑对我来说似乎不直观的NULL或“有趣变体”。
<击> SELECT foo FROM bar WHERE EXISTS (SELECT NULL FROM baz WHERE baz.id = bar.id);
SELECT foo FROM bar WHERE EXISTS (SELECT 1/0 FROM baz WHERE baz.id = bar.id);
击>
刚才的评论中出现了这个问题。我研究了最流行的RDBMS手册:
SELECT *
in the manual。SELECT 1
。SELECT *
。SELECT *
,在评论中也有SELECT 1
。搜索code:"EXISTS (SELECT 1"
的SO会产生5,048个结果
在SO上搜索code:"EXISTS (SELECT *"
会产生5,154个结果
更新的链接和计数07.2015。
所以SELECT *
拥有大众投票和大型商业RDBMS
我发现SELECT 1
更直观。这就像说“如果至少存在一个”
SELECT *
更直观吗?
答案 0 :(得分:9)
直觉是{{1}}因为你真的不关心
...EXISTS (SELECT * ..
的选择使得围绕EXISTS的一般神话和迷信永久存在(例如对MySQL文档的评论)。 答案 1 :(得分:6)
我仍然使用EXISTS (SELECT * ...)
,因为历史(gbn:应该是歇斯底里?)的原因。从技术上讲,当然没有区别;优化器/计划器会将其丢弃并将其减少为一位信息。对于人类读者来说,*
看起来更特殊,它将作为一个特殊的符号而不是价值或常数。此外,我倾向于减少程序中文字和魔术常量的数量(最终,只剩下0和1)。
答案 2 :(得分:2)
在 EXISTS 的上下文中,SQL优化器知道只要返回内容它返回的内容并不重要。所以对你来说没关系。
对于直观部分:我认为*
不对。
最好用语言问:“检查是否存在最轻微的部分” - 意思是1
(或其他)。