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
Identificación del cliente | Nombre del cliente | Ciudad | País |
1 | Anja Damian | Berlina | Alemania |
2 | Denny Cockett | México DF | Mexico |
3 | Eleanor Calnan | México DF | Mexico |
4 4 | Albertha Albury | Londres | Reino Unido |
5 5 | Latisha Nembhard | Luleå | Suecia |
6 6 | Madalene Bing | Mannheim | Alemania |
7 7 | Rebecka Beegle | Estrasburgo | Francia |
8 | Rosy Tippie | Madrid | España |
9 9 | Audie Khan | Marsella | Francia |
10 | Hildegard Burrowes | Tsawassen | Canadá |
11 | Cordell Dutremble | Londres | Reino Unido |
12 | Nora Reyna | Buenos Aires | Argentina |
13 | Ursula Laforest | México DF | Mexico |
14 | Claudie Neel | Berna | Suiza |
15 | Portia Yee | Sao Paulo | Brasil |
dieciséis | Angila Segarra | Londres | Reino Unido |
17 | Lise Wexler | Aquisgrán | Alemania |
18 años | Ned Mendivil | Nantes | Francia |
19 | Sara Vidaurri | Londres | Reino Unido |
20 | Tayna Navin | Graz | Austria |
21 | Rayo Pura | Sao Paulo | Brasil |
22 | Erika Byard | Madrid | España |
23 | Jimmie Luke | Lille | Francia |
24 | Shayla Byington | Bräcke | Suecia |
25 | Christiana Boden | München | Alemania |
26 | Irina Nitta | Nantes | Francia |
27 | Bryanna Alls | Torino | Italia |
28 | Norah Picken | Lisboa | Portugal |
29 | Moriah Stwart | Barcelona | España |
30 | Idella Harriott | Sevilla | España |
Solicitar ID | Identificación del cliente | Fecha de orden |
10254 | 14 | 11-07-1996 |
10258 | 20 | 17-07-1996 |
10259 | 13 | 18-07-1996 |
10263 | 20 | 23-07-1996 |
10264 | 24 | 24-07-1996 |
10265 | 7 7 | 25-07-1996 |
10267 | 25 | 29-07-1996 |
10278 | 5 5 | 12-08-1996 |
10280 | 5 5 | 14-08-1996 |
10289 | 11 | 26-08-1996 |
10290 | 15 | 27-08-1996 |
10297 | 7 7 | 04-09-1996 |
10303 | 30 | 11-09-1996 |
10308 | 2 | 18-09-1996 |
10311 | 18 años | 20-09-1996 |
10326 | 8 | 10-10-1996 |
10327 | 24 | 11-10-1996 |
10328 | 28 | 14-10-1996 |
10331 | 9 9 | 16-10-1996 |
10337 | 25 | 24-10-1996 |
10340 | 9 9 | 29-10-1996 |
10342 | 25 | 30-10-1996 |
10347 | 21 | 06-11-1996 |
10351 | 20 | 11-11-1996 |
10352 | 28 | 12-11-1996 |
10355 | 4 4 | 15-11-1996 |
10360 | 7 7 | 22-11-1996 |
10362 | 9 9 | 25-11-1996 |
10363 | 17 | 26-11-1996 |
10364 | 19 | 26-11-1996 |
10365 | 3 | 27-11-1996 |
10366 | 29 | 28-11-1996 |
10368 | 20 | 29-11-1996 |
10370 | 14 | 03-12-1996 |
10378 | 24 | 10-12-1996 |
10382 | 20 | 13-12-1996 |
10383 | 4 4 | 16-12-1996 |
10384 | 5 5 | 16-12-1996 |
10386 | 21 | 18-12-1996 |
10389 | 10 | 20-12-1996 |
10390 | 20 | 23-12-1996 |
10391 | 17 | 23-12-1996 |
10396 | 25 | 27-12-1996 |
10400 | 19 | 01-01-1997 |
10402 | 20 | 02-01-1997 |
10403 | 20 | 03-01-1997 |
10408 | 23 | 08-01-1997 |
10410 | 10 | 10-01-1997 |
10411 | 10 | 10-01-1997 |
10414 | 21 | 14-01-1997 |
10422 | 27 | 22-01-1997 |
10426 | 29 | 27-01-1997 |
10430 | 20 | 30-01-1997 |
10431 | 10 | 30-01-1997 |
10434 | 24 | 03-02-1997 |
10435 | dieciséis | 04-02-1997 |
10436 | 7 7 | 05-02-1997 |
10442 | 20 | 11-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ís | Numero de ordenes |
Austria | 10 |
Francia | 9 9 |
Suecia | 7 7 |
Alemania | 6 6 |
Reino Unido | 6 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:
- Consulta de inserción de SQL
- Clave externa en SQL
- Palabra clave distinta en SQL
- Vistas SQL
- Los 6 mejores ejemplos de consultas de unión interna en Oracle