Quando você
select distinct count(id)
então você está basicamente fazendo:select distinct cnt
from (select count(id) as cnt from t) t;
Como a consulta interna retorna apenas uma linha, o
distinct
não está fazendo nada. A consulta conta o número de linhas na tabela (bem, mais precisamente, o número de linhas em que id
não é null
). Por outro lado, quando você faz:
select count(distinct id)
from t;
Em seguida, a consulta conta o número de valores diferentes que
id
assume na mesa. Isso parece ser o que você quer.