【发布时间】:2011-12-04 08:09:48
【问题描述】:
这是可读性的问题。性能上没有区别。
旧版本的 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);
刚才在cmets中弹出了这个问题。我研究了最流行的 RDBMS 的手册:
- MS SQL 似乎偏爱
SELECT *in the manual。 -
example in the PostgreSQL 9.4 manual 使用
SELECT 1。 - Oracle 11g 在language reference 中有
SELECT *。 - MySQL 5.7 在reference manual 中有
SELECT *,在cmets 中也有SELECT 1。 - SQLite 在language reference 中没有示例。
在 SO 上搜索 code:"EXISTS (SELECT 1" 会产生 5,048 个结果。
在 SO 上搜索 code:"EXISTS (SELECT *" 会产生 5,154 个结果。
更新链接和计数 07.2015。
所以SELECT * 拥有大众投票和大型商业 RDBMS。
我发现SELECT 1 更直观。这就像说“如果至少存在一个”。SELECT * 更直观吗?
【问题讨论】:
-
为什么
SELECT 1会说“如果至少存在一个”?我认为这根本没有直觉意义。如果有人写了SELECT 2,你会直观地认为这是在检查至少 2 个存在吗? -
@MartinSmith:你在一句话中使用了 intuition 和 thinking。
-
也许这些更适合讨论这些非开发概念? linguistics.stackexchange.com 和 philosophy.stackexchange.com
-
@Erwin,我知道你已经说过你不会考虑
select NULL,但我会要求你重新考虑。 only 任何人选择 null 的时间是他们不关心返回的 what - 对我来说,这意味着查询的唯一目的是检查是否存在,因此比任何其他选项都更直观。 -
您想知道哪个更直观,但这里唯一能增加直观性的地方就是真正的初学者。在我做“Select 1”之前,我有初学者问过我,但他们似乎很直观地理解“Select *”发生了什么。因此,一个提出问题而另一个没有让我相信 * 更直观的事实。