Básicamente porque se definieron para diferentes propósitos. La cláusula WHERE
es para el filtrado de registros y la cláusula HAVING
está diseñada para filtrar con funciones de agregado (GROUP BY
). En su segunda consulta se está utilizando un filtro GROUP BY
implícito, por lo que, por ejemplo, si agrega otra columna a la cláusula SELECT
, obtendrá resultados diferentes.
EDITAR basado en la corrección por Martin Smith
HAVING
fue creado para permitir el filtrado de filas resultantes de un GROUP BY
. Cuando no se especifica GROUP BY
, el resultado completo se considera un grupo.
Si ni se especifica un <where clause>
ni un <group by clause>
, a continuación, sea T el resultado de la anterior <from clause>
o
... El grupo es el entero mesa si no se especifica <group by clause>
EDIT 2 Ahora con respecto a la ALIAS:
La especificación de la cláusula WHERE con respecto a las referencias de columnas en la condición de búsqueda dice esto:
Cada <column reference>
contenida directamente en la <search condition>
se referencia sin ambigüedades una columna de T o sea una referencia externa.
Consulte: 7.6 <where clause>
, Sintaxis Regla 1.
La especificación para la cláusula HAVING con respecto a las referencias columnas en la condición de búsqueda dice esto:
Cada <column reference>
contenida directamente en la <search condition>
hará referencia de forma inequívoca una columna de agrupación de T o ser una combinación externa referencia.
referirse a: Regla 7.8 <having clause>
, Sintaxis 1.
Y una agrupación columna se define como:
Una columna referenciada en una <group by clause>
es una columna de agrupación.
Así que en conclusión el WHERE
debe hacer referencia a una columna de la tabla y la cláusula HAVING
debe hacer referencia a una columna de agrupación del conjunto de filas.
(Second Informal Review Draft) ISO/IEC 9075:1992, Database Language SQL- July 30, 1992
Esta es una extensión de MySQL al estándar. No puede hacer referencia a alias de columna en 'having' en SQL Server, por ejemplo. –