sql where having

sql - ¿Es posible tener una cláusula WHERE después de una cláusula HAVING?



(5)

Dentro del mismo ámbito, la respuesta es no. Si se permiten subconsultas, entonces puede evitar usar HAVING completo.

Creo que tener es un anacronismo. Hugh Darwen se refiere a HAVING como "La locura de las consultas estructuradas":

En el antiguo SQL, la cláusula WHERE no podía usarse en los resultados de la agregación, por lo que tenían que inventar HAVING (con el mismo significado que WHERE ):

SELECT D#, AVG(Salary) AS Avg_Sal FROM Emp GROUP BY D# HAVING AVG(Salary) > 999;

Pero, ¿hubiéramos tenido alguna vez si en 1979 se pudiera escribir:

SELECT * FROM ( SELECT D#, AVG(Sal) AS Avg_Sal FROM Emp GROUP BY D# ) AS dummy WHERE Avg_Sal > 999;

Sospecho fuertemente que la respuesta a la pregunta de Darwen es no.

¿Es posible utilizar una cláusula WHERE después de una cláusula HAVING?

Lo primero que me viene a la mente son las consultas secundarias, pero no estoy seguro.

PD: Si la respuesta es afirmativa, ¿podría dar algunos ejemplos?


Desde ayuda SELECT

Orden de procesamiento de las cláusulas WHERE, GROUP BY y HAVING Los siguientes pasos muestran el orden de procesamiento de una instrucción SELECT con una cláusula WHERE, una cláusula GROUP BY y una cláusula HAVING:

La cláusula FROM devuelve un conjunto de resultados inicial.

La cláusula WHERE excluye las filas que no cumplen con su condición de búsqueda.

La cláusula GROUP BY recopila las filas seleccionadas en un grupo para cada valor único en la cláusula GROUP BY.

Las funciones agregadas especificadas en la lista de selección calculan valores de resumen para cada grupo.

La cláusula HAVING además excluye las filas que no cumplen con su condición de búsqueda.

Entonces, no, no puedes.


No, no en la misma consulta.

La cláusula where va delante del having y del group by . Si desea filtrar registros antes de la agrupación, la condición va en la cláusula where , y si quiere filtrar registros agrupados, la condición va en la cláusula having :

select ... from ... where ... group by ... having ...

Si no es posible usar ninguno de estos por alguna razón extraña, debe hacer que la consulta sea una subconsulta para poder colocar la cláusula where en la consulta externa:

select ... from ( select ... from ... where ... group by ... having ... ) x where ...


Si es una pregunta con trampa, es posible si el DÓNDE y el QUE TIENEN no estén al mismo nivel, como usted mencionó, con subconsulta.

Supongo que algo así funcionaría

QUE TIENE valor = (SELECCIONAR max (valor) DESDE foo DONDE crit = 123)

ps: por que estabas preguntando ¿Tienes un problema específico?

pss: ok, tonto, me perdí la etiqueta "entrevista *" ...


Una cláusula HAVING es solo una cláusula WHERE después de GROUP BY. ¿Por qué no poner sus condiciones WHERE en la cláusula HAVING?