Normalmente, todas as seleções são da forma
SELECT [columns, scalar computations on columns, grouped computations on columns, or scalar computations] FROM [table or joins of tables, etc]
Como isso permite cálculos escalares simples, podemos fazer algo como
SELECT 1 + 1 FROM SomeTable
e retornará um conjunto de registros com o valor 2 para cada linha na tabela SomeTable
. Agora, se não nos importamos com nenhuma tabela, mas apenas queríamos fazer nosso cálculo escalar, poderíamos fazer algo como
SELECT 1 + 1
. Isso não é permitido pelo padrão, mas é útil e a maioria dos bancos de dados permite (o Oracle não permite, a menos que tenha sido alterado recentemente, pelo menos costumava não). Portanto, esses SELECTs simples são tratados como se tivessem uma cláusula from que especificasse uma tabela com uma linha e nenhuma coluna (impossível, é claro, mas funciona). Portanto,
SELECT 1 + 1
torna-se SELECT 1 + 1 FROM ImaginaryTableWithOneRow
que retorna uma única linha com uma única coluna com o valor 2
. Na maioria das vezes, não pensamos nisso, apenas nos acostumamos com o fato de que SELECTs simples dão resultados e nem pensamos no fato de que deve haver alguma coisa de uma linha selecionada para retornar uma linha.
Ao fazer
SELECT COUNT(*)
você fez o equivalente a SELECT COUNT(*) FROM ImaginaryTableWithOneRow
que obviamente retorna 1.