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

Erw*_*ter 12 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);
Run Code Online (Sandbox Code Playgroud)

我不是在考虑对我来说似乎不直观的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的手册:

搜索SO以code:"EXISTS (SELECT 1"获得5,048个结果.
搜索SO以code:"EXISTS (SELECT *"获得5,154个结果.
更新的链接和计数07.2015.

因此,SELECT *有民众投票,并在其一侧的大型商业RDBMS.
我觉得SELECT 1更直观.这就像说"如果至少存在一个".
SELECT *更直观?

gbn*_*gbn 8

直觉是...EXISTS (SELECT * ..因为你真的不在乎

  • 唯一重要的关键词是EXISTS
  • 选择会...EXISTS (SELECT 1 ..延续EXISTS的一般神话和迷信(例如对MySQL文档的评论).
  • ANSI标准说"无关紧要"
  • 理解EXISTS是半连接更有趣.

  • 好吧,如果你关心绝对的"清洁",`EXISTS(SELECT FROM a)`在Postgres中正常工作;) (4认同)
  • 我总是使用`EXISTS(选择'任何行?'FROM ...`因为它的语言精神就像英语一样. (2认同)

wil*_*ser 5

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

  • 你的意思是"歇斯底里"或"历史"......?在谈论神话和迷信时,"歇斯底里"更为正确...... (3认同)

Roy*_*mir 3

EXISTS上下文中,SQL 优化器知道只要返回某些内容,返回什么并不重要。所以对你来说这并不重要。

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

最好用语言来问:“检查是否存在哪怕是最微小的部分”——意思1(或其他东西)。

  • 最轻微的部分是这里的一排。如果行存在,这就是“EXISTS”检查的内容。这就是为什么“SELECT *”作为“SELECT the-whole-row”对许多人来说看起来更直观。 (2认同)