2012-08-23 15 views
6

Si creo un alias en la cláusula select entonces no se puede utilizar en la cláusula where porque de acuerdo a la orden de ejecución de consultas SQL where viene antes select.diferencia entre dónde y con respecto a los alias

Pero puedo crear un alias en la cláusula select y utilizarlo en una cláusula havinghaving aunque viene antes select.

¿Por qué es así?

Ex:

select type, (case when number>25 then 1 else 0 end) inc 
from animals 
where inc='1'; 

esto no funcionará. Pero,

select type, (case when number>25 then 1 else 0 end) inc 
from animals 
having inc='1'; 

Esto funciona. ¿Porque?

+6

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. –

Respuesta

5

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

+0

Pero, ¿cómo es que 'having' recoge el alias incluso antes de que se ejecute 'select'? – pooja

+0

Cualquier cita para "En SQL estándar no puede usar una cláusula HAVING sin GROUP BY"? –

+0

Sin cita, pero es bien conocido que HAVING se creó para filtrar filas resultantes de una cláusula GROUP BY. http://en.wikipedia.org/wiki/SQL – davidmontoyago

Cuestiones relacionadas