Resumen: en este tutorial, aprenderás a utilizar la cláusula MySQL HAVING para especificar una condición de filtro para grupos de filas o agregados.

Introducción a la cláusula HAVING de MySQL

La cláusula HAVING se utiliza en la sentencia SELECT para especificar condiciones de filtrado para un grupo de filas o agregados.

La cláusula HAVING suele utilizarse con la cláusula GROUP BY para filtrar grupos en función de una condición especificada. Si se omite la cláusula GROUP BY, la cláusula HAVING se comporta como la cláusula WHERE.

Lo siguiente ilustra la sintaxis de la cláusula HAVING:

SELECT select_listFROM table_nameWHERE search_conditionGROUP BY group_by_expressionHAVING group_condition;
Code language: SQL (Structured Query Language) (sql)

En esta sintaxis, se especifica una condición en la cláusula . Si una fila, generada por la cláusula group by, hace que la cláusula group_condition se evalúe como verdadera, la consulta la incluirá en el conjunto de resultados.

Nota que la cláusula HAVING aplica una condición de filtro a cada grupo de filas, mientras que la cláusula WHERE aplica la condición de filtro a cada fila individual.

MySQL evalúa la cláusula HAVING después de la cláusula FROMWHERESELECT y GROUP BY y antes de las cláusulas ORDER BY, y LIMIT.

Nota que el estándar SQL especifica que el HAVING se evalúa antes de la cláusula SELECT y después de la cláusula GROUP BY.

Ejemplos de la cláusula HAVING de MySQL

Vamos a poner algunos ejemplos de uso de la cláusula HAVING para ver cómo funciona. Utilizaremos la tabla orderdetails de la base de datos de ejemplo para la demostración.

Lo siguiente utiliza la cláusula GROUP BY para obtener los números de pedido, el número de artículos vendidos por pedido, y el total de ventas de cada uno desde la tabla orderdetails:

SELECT ordernumber, SUM(quantityOrdered) AS itemsCount, SUM(priceeach*quantityOrdered) AS totalFROM orderdetailsGROUP BY ordernumber;
Code language: SQL (Structured Query Language) (sql)

Prueba

Ahora, puedes encontrar qué pedido tiene un total de ventas superior a 1000 utilizando la cláusula HAVING de la siguiente manera:

SELECT ordernumber, SUM(quantityOrdered) AS itemsCount, SUM(priceeach*quantityOrdered) AS totalFROM orderdetailsGROUP BY ordernumberHAVING total > 1000;
Code language: SQL (Structured Query Language) (sql)

Prueba

Puedes construir una condición compleja en la cláusula HAVING utilizando operadores lógicos como OR y AND.

El siguiente ejemplo utiliza la cláusula HAVING para encontrar pedidos que tengan importes totales superiores a 1000 y que contengan más de 600 artículos:

SELECT ordernumber, SUM(quantityOrdered) AS itemsCount, SUM(priceeach*quantityOrdered) AS totalFROM orderdetailsGROUP BY ordernumberHAVING total > 1000 AND itemsCount > 600;
Code language: SQL (Structured Query Language) (sql)

Prueba

Supongamos que quieres encontrar todos los pedidos que están en estado de envío y tienen el importe total mayor de 1500, puedes unir la tabla orderdetails con la tabla orders utilizando la cláusula INNER JOIN y aplicar una condición sobre la columna status y el agregado total como se muestra en la siguiente consulta:

SELECT a.ordernumber, status, SUM(priceeach*quantityOrdered) totalFROM orderdetails aINNER JOIN orders b ON b.ordernumber = a.ordernumberGROUP BY ordernumber, statusHAVING status = 'Shipped' AND total > 1500;
Code language: SQL (Structured Query Language) (sql)

Prueba

El HAVING sólo es útil cuando se utiliza con la cláusula GROUP BY para generar la salida de los informes de altonivel de informes. Por ejemplo, puede utilizar la cláusula HAVING para responder a preguntas como encontrar el número de pedidos de este mes, este trimestre o este año que tienen un total de ventas superior a 10K.

En este tutorial, ha aprendido a utilizar la cláusula MySQL HAVING con la cláusula GROUP BY para especificar condiciones de filtrado para grupos de filas o agregados.

  • ¿Ha sido útil este tutorial?
  • SíNo

Se puede decir que este tutorial ha sido útil.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *