在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);

这个问题刚刚出现在评论中。 我研究了最stream行的RDBMS的手册:

  • MS SQL似乎赞成手册中的 SELECT *
  • PostgreSQL 9.4手册中的例子使用SELECT 1
  • Oracle 11g在语言参考中有SELECT *
  • MySQL 5.7在参考手册中有SELECT * ,而在注释中也是SELECT 1
  • SQLite在语言参考中没有例子。

在SO上searchcode:"EXISTS (SELECT 1"得到5,048个结果。
在SO上searchcode:"EXISTS (SELECT *"得到5,154个结果。
更新链接和统计07.2015。

所以SELECT *拥有广受欢迎的投票和大型商业RDBMS。
我发现SELECT 1更直观。 就像是说“至less有一个存在”。
SELECT *更直观吗?

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

  • 唯一重要的关键字是EXISTS
  • ...EXISTS (SELECT 1 ..使...EXISTS (SELECT 1 ..的一般神话和迷信永久化(例如对MySQL文档的评论)。
  • ANSI标准说“没关系”
  • 理解EXISTS是一个半连接更有意思。

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

EXISTS情况下 ,SQL优化器知道只要它返回什么就返回什么并不重要。 所以对你来说没关系。

对于直观的部分:我不认为*会是正确的。

最好用文字来问:“检查是否有丝毫的部分存在” – 意思是1 (或其他)。