That's the point. * has no meaning without FROM
But COUNT(*)
does have meaning - it means "the number of rows". It's not counting the number of columns in the row, so postgres doesn't need to know what columns exist in the row to return a row count.
Geoff