Las diapositivas de la conferencia de nuestro instructor de base de datos sobre HAVING y GROUP BY hacen esta afirmación:


enter image description here

Desafortunadamente, debido a que el SEO en torno a este tema está tan saturado, es casi imposible encontrar una fuente que responda a mi pregunta. Puedo encontrar muchos ejemplos en los que HAVING se usa de hecho con agregados, pero ¿eso implica necesariamente que DEBE usar agregados?

Según mi comprensión y experiencia, la cláusula HAVING no necesita solo utilizar atributos de agrupación o atributos que aparecen en agregados (aunque puede , a diferencia de su contraparte { {X1}}).

Según tengo entendido, HAVING se creó porque WHERE no puede operar a nivel de grupo.

Entonces, ¿qué es exactamente lo que me impide usar cualquier otra condición en una cláusula HAVING, como una condición HAVING attribute = value simple y antigua, donde attribute no aparece ni en GROUP BY ni en agregado en la cláusula SELECT? Hablando visualmente, para mí tiene mucho sentido decir:

"Elija solo aquellos grupos en los que haya una fila que tenga este valor en esta columna".

0
AlexH 6 oct. 2019 a las 02:45

1 respuesta

La mejor respuesta

HAVING es como una WHERE cláusula que tiene lugar después de la agregación. Las siguientes dos consultas son funcionalmente idénticas (asumiendo que las elipses son compatibles):

select key1, key2, . . . 
from t
group by key1, key2
having . . .

Y:

select x.*
from (select key1, key2, . . . 
      from t
      group by key1, key2
     ) x
having . . .

La cláusula having puede hacer referencia a:

  • Valores agregados de select.
  • claves del group by.
  • Funciones que no aceptan argumentos (como la fecha actual).
  • Expresiones compuestas por los anteriores.

No puede hacer referencia a columnas no agregadas que no son claves. Estas columnas simplemente no existen en el conjunto de resultados producido por group by.

Hay una excepción a esto, que explico a riesgo de confusión. Algunas bases de datos admiten columnas que son funcionalmente dependientes como claves group by. Lo que esto significa en inglés es que si la consulta se agrega mediante claves únicas / primarias, entonces se pueden usar otras columnas de esa tabla sin funciones de agregación. Sin embargo, esta es una extensión de la regla general de que las referencias en la cláusula having son solo aquellas disponibles después de la agregación.

2
Gordon Linoff 6 oct. 2019 a las 04:05