Normalnie wszystkie selekcje mają postać SELECT [columns, scalar computations on columns, grouped computations on columns, or scalar computations] FROM [table or joins of tables, etc]
Ponieważ pozwala to na proste obliczenia skalarne, możemy zrobić coś takiego jak SELECT 1 + 1 FROM SomeTable
i zwróci zestaw rekordów z wartością 2 dla każdego wiersza w tabeli SomeTable
.
Teraz, jeśli nie obchodziła nas żadna tabela, ale po prostu chcieliśmy wykonać nasze obliczenia skalarne, moglibyśmy chcieć zrobić coś takiego jak SELECT 1 + 1
. Nie jest to dozwolone przez standard, ale jest przydatne i większość baz danych na to pozwala (Oracle nie, chyba że zostało to ostatnio zmienione, przynajmniej kiedyś nie).
Stąd takie same SELECTy są traktowane tak, jakby miały klauzulę from, która określa tabelę z jednym wierszem i bez kolumny (oczywiście jest to niemożliwe, ale to załatwia sprawę). Stąd SELECT 1 + 1
staje się SELECT 1 + 1 FROM ImaginaryTableWithOneRow
co zwraca pojedynczy wiersz z pojedynczą kolumną o wartości 2
.
Przeważnie o tym nie myślimy, po prostu przyzwyczajamy się do tego, że same SELECTy dają wyniki i nawet nie myślimy o tym, że musi być wybrana jednowierszowa rzecz, aby zwrócić jeden wiersz.
Wykonując SELECT COUNT(*)
zrobiłeś odpowiednik SELECT COUNT(*) FROM ImaginaryTableWithOneRow
co oczywiście zwraca 1.