SQL HAVINGCláusulas


Cláusula HAVING

La razón para agregar la cláusula HAVING en SQL es que la palabra clave WHERE no se puede usar con funciones agregadas.

La cláusula HAVING nos permite filtrar los datos de cada grupo después de agrupar.

Sintaxis de SQL HAVING

Sintaxis de SQL HAVING

SELECT column1, aggregate_function(column2) FROM table_name GROUP BY column1 HAVING condition;

Descripción de parámetros:

  • column1: la columna a recuperar.
  • aggregate_function(column2): una función agregada, como SUM, COUNT, AVG, etc., aplicada acolumn2el valor de.
  • table_name: la tabla de la que se recuperan los datos.
  • GROUP BY column1: segúncolumn1los valores de la columna se agrupan los datos.
  • HAVING condition: una condición para filtrar los resultados agrupados. Solo los grupos que cumplan la condición se incluirán en el conjunto de resultados.


Base de datos de demostración

En este tutorial, usaremos la base de datos de muestra EJEMPLO.

A continuación se muestran los datos de la tabla "Websites":

+----+--------------+---------------------------+-------+---------+
| id | name         | url                       | alexa | country |
+----+--------------+---------------------------+-------+---------+
| 1  | Google       | https://www.google.cm/    | 1     | USA     |
| 2  | 淘宝          | https://www.taobao.com/   | 13    | CN      |
| 3  | Ejemplo      | http://www.example.com/    | 4689  | CN      |
| 4  | 微博          | http://weibo.com/         | 20    | CN      |
| 5  | Facebook     | https://www.facebook.com/ | 3     | USA     |
| 7  | stackoverflow | http://stackoverflow.com/ |   0 | IND     |
+----+---------------+---------------------------+-------+---------+

A continuación se muestran los datos de la tabla de registros de acceso al sitio web "access_log":

mysql> SELECT * FROM access_log;
+-----+---------+-------+------------+
| aid | site_id | count | date       |
+-----+---------+-------+------------+
|   1 |       1 |    45 | 2016-05-10 |
|   2 |       3 |   100 | 2016-05-13 |
|   3 |       1 |   230 | 2016-05-14 |
|   4 |       2 |    10 | 2016-05-14 |
|   5 |       5 |   205 | 2016-05-14 |
|   6 |       4 |    13 | 2016-05-15 |
|   7 |       3 |   220 | 2016-05-15 |
|   8 |       5 |   545 | 2016-05-16 |
|   9 |       3 |   201 | 2016-05-17 |
+-----+---------+-------+------------+
9 rows in set (0.00 sec)


Ejemplo de SQL HAVING

Ahora queremos encontrar los sitios web con un total de visitas mayor que 200.

Usamos la siguiente sentencia SQL:

Ejemplo

SELECT Websites.name, Websites.url, SUM(access_log.count) AS nums FROM (access_log INNER JOIN Websites ON access_log.site_id=Websites.id) GROUP BY Websites.name HAVING SUM(access_log.count) > 200;

Al ejecutar el SQL anterior, el resultado es el siguiente:

Ahora queremos encontrar los sitios web con un total de visitas mayor que 200 y un ranking de Alexa menor que 200.

Agregamos una cláusula WHERE normal a la sentencia SQL:

Ejemplo

SELECT Websites.name, SUM(access_log.count) AS nums FROM Websites INNER JOIN access_log ON Websites.id=access_log.site_id WHERE Websites.alexa < 200 GROUP BY Websites.name HAVING SUM(access_log.count) > 200;

Al ejecutar el SQL anterior, el resultado es el siguiente:

Otras extensiones