在Oracle SQL中,SELECT 1和SELECT COUNT(1)分别是什么意思?

3

今天我参加了一次Java开发者职位的面试,他们问了我这个问题:

你能不能解释以下这两个概念之间的区别:

SELECT 1 FROM table
SELECT count(1) FROM table
SELECT count(*) FROM table

我在stackoverflow上查找,但没有找到令人满意的答案。我是一名Java开发者,有SQL知识已经几年了,但从来没有使用过像Select 1或select count(1)这样的陌生语句。
此外,这就是整个问题。即,这些查询语句不是任何更大查询的一部分。
你能帮我找到一个答案吗?

count(*)count(1) 正在 完全相同 的事情。 - user330315
1
顺便说一句:这些面试问题真的很糟糕。不知道它们有什么用处,特别是当一个人正在申请Java开发人员职位时。 - Mick Mnemonic
1个回答

7
SELECT 1 FROM table

当有多条记录在table中时,将会返回1的结果。

SELECT count(1) FROM table

将返回table中所有记录的计数。

SELECT count(*) FROM table

与上述相同。

*被Oracle用作提示(不是技术上的提示,但类似),因此它允许它选择最佳索引来计算计数。这是与select count(1)...的主要区别。类比地说,这就是WHERE EXISTS (SELECT 1 FROM ...)WHERE EXISTS(SELECT * FROM ...)背后的相同想法。 这个语句对现代Oracle RDBMS引擎已经 不再相关了。


1
COUNT(*) 和 COUNT(任何其他常量) 在操作或输出方面没有区别。它们是完全相同的。 - LoztInSpace
2
为了完整性,COUNT(1)是COUNT(expression)的一个例子,它计算表达式非空的行数。还有一种变体COUNT(DISTINCT expression),它执行其所示的操作。 - LoztInSpace
1
Oracle 不会为 count(*)count(1) 选择不同的索引,这两个表达式执行的任务完全相同,也没有一个比另一个更快。 - user330315
@a_horse_with_no_name 谢谢,我意识到我已经过时了。 - Sebas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接