什么在EXISTS子查询中更容易阅读?

时间:2011-10-10 08:24:36

标签: sql syntax exists

这是可读性的问题。表现没有差异 旧版本的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手册:

搜索code:"EXISTS (SELECT 1"的SO会产生5,048个结果 在SO上搜索code:"EXISTS (SELECT *"会产生5,154个结果 更新的链接和计数07.2015。

所以SELECT *拥有大众投票和大型商业RDBMS 我发现SELECT 1更直观。这就像说“如果至少存在一个” SELECT *更直观吗?

3 个答案:

答案 0 :(得分:9)

直觉是{​​{1}}因为你真的不关心

  • 唯一重要的关键字是 EXISTS
  • ...EXISTS (SELECT * ..的选择使得围绕EXISTS的一般神话和迷信永久存在(例如对MySQL文档的评论)。
  • ANSI标准说“无所谓”
  • 了解EXISTS是半连接更有趣。

答案 1 :(得分:6)

我仍然使用EXISTS (SELECT * ...),因为历史(gbn:应该是歇斯底里?)的原因。从技术上讲,当然没有区别;优化器/计划器会将其丢弃并将其减少为一位信息。对于人类读者来说,*看起来更特殊,它将作为一个特殊的符号而不是价值或常数。此外,我倾向于减少程序中文字和魔术常量的数量(最终,只剩下0和1)。

答案 2 :(得分:2)

EXISTS 上下文中,SQL优化器知道只要返回内容它返回的内容并不重要。所以对你来说没关系。

对于直观部分:我认为*不对。

最好用语言问:“检查是否存在最轻微的部分” - 意思是1(或其他)。