Introducción a la cláusula HAVING de SQL

La pregunta muy básica que viene a la mente es: ¿qué es esta cláusula HAVING? Bueno, la cláusula HAVING se usa para filtrar los resultados de una consulta SQL con funciones agregadas. Para entender en inglés simple, está ordenando el analizador SQL 'Hey SQL, de nuestra tabla de datos del cliente, tráeme los nombres de los países que TIENEN más de 1 millón de clientes'.

Espera, eso es lo que hace la cláusula WHERE, ¿no? Sí, eso es muy similar a cómo funciona la cláusula WHERE pero con una ligera diferencia. La cláusula WHERE no funciona con funciones agregadas.

Ahora, solo para recapitular un poco sobre las funciones agregadas, estas son funciones que toman múltiples filas como entrada y dan una salida procesada más significativamente. Algunos ejemplos son Count (), Sum (), Min (), Max (), Avg (), etc.

¿Por qué tener y no dónde?

Vemos que las cláusulas HAVING y WHERE realizan una tarea muy similar para filtrar los resultados. Entonces, ¿cuál era la necesidad de la cláusula HAVING? ¿Por qué no se puede usar la cláusula WHERE con funciones agregadas?

Para responder a esto, necesitaríamos entender cómo el motor SQL trata las dos cláusulas. La cláusula FROM en cada comando SQL le dice al motor desde dónde leer las filas. Los datos se almacenan en el disco y se recuperan en la memoria para su procesamiento. A medida que las filas se leen una por una desde el disco a la memoria, se comprueba la cláusula WHERE. Las filas que fallan la cláusula WHERE no se cargan en la memoria. Por lo tanto, la cláusula WHERE se evalúa para cada fila a medida que son procesadas por el motor SQL.

Por el contrario, la cláusula HAVING aparece solo después de que las filas se han cargado en la memoria. Una vez cargadas en la memoria, las funciones agregadas realizan su tarea en las filas que TIENEN la condición deseada.

Ahora, si tuviéramos que poner una cláusula WHERE con la función agregada como avg (), esto confundiría al motor SQL sobre si incluir la fila para calcular el promedio o no. Esencialmente, estaríamos ordenando al motor que no lea la fila ya que no pasó el criterio avg () en la cláusula WHERE. Pero bueno, para determinar si pasó o no el criterio de cálculo avg (), la fila debe leerse en la memoria. Un estado de punto muerto.

La sintaxis

SELECT
FROM


DONDE - opcional
GROUP BY: agrupa las filas para aplicar la función de agregado
HAVING - función agregada en la condición
ORDENAR POR; - definir el orden de clasificación, opcional

Nota: la cláusula GROUP BY se requiere con la cláusula HAVING. Esto se debe a que la cláusula Tener necesita un grupo de datos para aplicar una función agregada y filtrar los resultados.

¿Cómo funciona la cláusula HAVING?

Comprendamos el funcionamiento de la cláusula HAVING en SQL.

La cláusula HAVING siempre va acompañada de la cláusula GROUP BY. La cláusula GROUP BY agrupa los datos que coinciden con un determinado criterio. Tiene tres fases: dividir, aplicar y combinar. La fase dividida divide las filas en grupos. La fase de aplicación aplica algunas funciones agregadas en los grupos de datos. La fase combinada produce un único resultado al combinar los grupos con el resultado de la función agregada.

Ahora que los grupos están formados, la cláusula HAVING entra en escena. La cláusula HAVING filtra los grupos que no satisfacen la condición dada.

SELECT Col_A, avg(Col_B) as Col_B
FROM MyTable
GROUP BY Col_A
HAVING avg(Col_B)>30

Por lo tanto, en el ejemplo anterior, vemos que la tabla se divide primero en tres grupos según la columna Col_A. La función agregada para calcular el promedio de los valores Col_B se aplica a los grupos. Esto da como resultado una sola fila para cada grupo. Las filas se combinan y filtran según la condición de la cláusula HAVING.

Ejemplo

Ahora veamos un ejemplo del mundo real. Considere que tenemos la siguiente tabla de clientes y los pedidos que han realizado con nosotros.

Identificación del clienteNombre del clienteCiudadPaís
1Anja DamianBerlinaAlemania
2Denny CockettMéxico DFMexico
3Eleanor CalnanMéxico DFMexico
4 4Albertha AlburyLondresReino Unido
5 5Latisha NembhardLuleåSuecia
6 6Madalene BingMannheimAlemania
7 7Rebecka BeegleEstrasburgoFrancia
8Rosy TippieMadridEspaña
9 9Audie KhanMarsellaFrancia
10Hildegard BurrowesTsawassenCanadá
11Cordell DutrembleLondresReino Unido
12Nora ReynaBuenos AiresArgentina
13Ursula LaforestMéxico DFMexico
14Claudie NeelBernaSuiza
15Portia YeeSao PauloBrasil
dieciséisAngila SegarraLondresReino Unido
17Lise WexlerAquisgránAlemania
18 añosNed MendivilNantesFrancia
19Sara VidaurriLondresReino Unido
20Tayna NavinGrazAustria
21Rayo PuraSao PauloBrasil
22Erika ByardMadridEspaña
23Jimmie LukeLilleFrancia
24Shayla ByingtonBräckeSuecia
25Christiana BodenMünchenAlemania
26Irina NittaNantesFrancia
27Bryanna AllsTorinoItalia
28Norah PickenLisboaPortugal
29Moriah StwartBarcelonaEspaña
30Idella HarriottSevillaEspaña
Solicitar IDIdentificación del clienteFecha de orden
102541411-07-1996
102582017-07-1996
102591318-07-1996
102632023-07-1996
102642424-07-1996
102657 725-07-1996
102672529-07-1996
102785 512-08-1996
102805 514-08-1996
102891126-08-1996
102901527-08-1996
102977 704-09-1996
103033011-09-1996
10308218-09-1996
1031118 años20-09-1996
10326810-10-1996
103272411-10-1996
103282814-10-1996
103319 916-10-1996
103372524-10-1996
103409 929-10-1996
103422530-10-1996
103472106-11-1996
103512011-11-1996
103522812-11-1996
103554 415-11-1996
103607 722-11-1996
103629 925-11-1996
103631726-11-1996
103641926-11-1996
10365327-11-1996
103662928-11-1996
103682029-11-1996
103701403-12-1996
103782410-12-1996
103822013-12-1996
103834 416-12-1996
103845 516-12-1996
103862118-12-1996
103891020-12-1996
103902023-12-1996
103911723-12-1996
103962527-12-1996
104001901-01-1997
104022002-01-1997
104032003-01-1997
104082308-01-1997
104101010-01-1997
104111010-01-1997
104142114-01-1997
104222722-01-1997
104262927-01-1997
104302030-01-1997
104311030-01-1997
104342403-02-1997
10435dieciséis04-02-1997
104367 705-02-1997
104422011-02-1997

Ahora, queremos conocer a los clientes de qué países han realizado un total combinado de 5 o más pedidos con nosotros. Podría ser un solo cliente que realiza más de 5 pedidos o 5 clientes que realizan 1 pedido cada uno.

Para lograr esto, necesitaríamos

Paso 1 : une las dos tablas

Paso 2: Agrupe a los clientes según sus países

Paso 3: cuenta el número de pedidos para cada grupo

Paso 4: filtre los resultados para 5 o más pedidos

Formulemos el comando:

SELECT C.Country, COUNT(O.OrderId) as NumberOfOrders -- Step 1, 3
FROM Customers C -- Step 1
INNER JOIN Orders O on C.CustomerID = O.CustomerID -- Step 1
GROUP BY C.Country -- Step 2
HAVING COUNT(O.OrderId) >= 5 -- Step 4
ORDER BY COUNT(O.OrderId) DESC

Aquí están los resultados:

PaísNumero de ordenes
Austria10
Francia9 9
Suecia7 7
Alemania6 6
Reino Unido6 6

Conclusión - Cláusula HAVING de SQL

Por lo tanto, hemos visto cuál es el propósito de la cláusula HAVING y cómo funciona. Es importante comprender el funcionamiento básico o de lo contrario puede terminar confundido acerca de por qué la cláusula HAVING no produce los resultados deseados. Sigue jugando con varias mesas y combinaciones y combinaciones junto con la cláusula HAVING.

Artículos recomendados

Esta es una guía de la cláusula SQL HAVING. Aquí discutimos el funcionamiento de la cláusula HAVING en SQL y un ejemplo con la siguiente tabla de clientes. También puede consultar nuestros otros artículos sugeridos:

  1. Consulta de inserción de SQL
  2. Clave externa en SQL
  3. Palabra clave distinta en SQL
  4. Vistas SQL
  5. Los 6 mejores ejemplos de consultas de unión interna en Oracle