在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
(或其他)。