ejemplos mysql sql where-clause having-clause

mysql - ejemplos - having sum sql



DONDE vs tener (8)

¿Por qué necesitas colocar las columnas que creas tú mismo (por ejemplo, select 1 as "number" ) después de HAVING y no WHERE en MySQL?

¿Y hay desventajas en lugar de hacer WHERE 1 (escribir la definición completa en lugar de un nombre de columna)?


¿Por qué es necesario que coloque las columnas que cree usted mismo (por ejemplo, "seleccione 1 como número") después de HAVING y no WHERE en MySQL?

WHERE se aplica antes de GROUP BY , HAVING se aplica después (y puede filtrar por agregados).

En general, puede hacer referencia a alias en ninguna de estas cláusulas, pero MySQL permite hacer referencia a los alias de nivel SELECT en GROUP BY , ORDER BY y HAVING .

¿Y hay desventajas en lugar de hacer "DONDE 1" (escribir la definición completa en lugar de un nombre de columna)

Si su expresión calculada no contiene agregados, lo más probable es que colocarla en la cláusula WHERE sea ​​más eficiente.


DONDE los filtros antes de agrupar los datos y HAVING filtra después de agrupar los datos. Esta es una distinción importante; Las filas eliminadas por una cláusula WHERE no se incluirán en el grupo. Esto podría cambiar los valores calculados que, a su vez, podrían afectar a qué grupos se filtran según el uso de esos valores en la cláusula HAVING .

Extracto de: Forta, Ben. “Sams Teach Yourself SQL en 10 minutos (4ª edición) (Sams Teach Yourself ...)”.


Estos 2 se sentirán igual que los primeros, ya que ambos se usan para decir sobre una condición para filtrar datos. Si bien podemos usar ''tener'' en lugar de ''donde'' en cualquier caso, hay casos en que no podemos usar ''donde'' en lugar de ''tener''. Esto se debe a que en una consulta de selección, ''donde'' filtra los datos antes de ''seleccionar'' mientras ''tiene'' filtrando los datos después de ''seleccionar''. Entonces, cuando usamos nombres de alias que no están realmente en la base de datos, ''donde'' no puede identificarlos pero ''tener'' puede.

Ej .: dejar que la tabla contenga Student_id, nombre, cumpleaños, dirección. Asumir que el cumpleaños es de tipo fecha.

SELECT * FROM Student WHERE YEAR(birthday)>1993; /*this will work as birthday is in database.if we use having in place of where too this will work*/ SELECT student_id,(YEAR(CurDate())-YEAR(birthday)) AS Age FROM Student HAVING Age>20; /*this will not work if we use ‘where’ here, ‘where’ don’t know about age as age is defined in select part.*/


Haber solo se usa con agregación pero donde con sentencias no agregadas Si tiene donde la palabra la pone antes de agregación (agrupar por)


La principal diferencia es que WHERE no se puede usar en un ítem agrupado (como SUM(number) ), mientras que HAVING puede.

La razón es el WHERE se realiza antes de la agrupación y HAVING se realiza después de la agrupación.


Todas las respuestas no alcanzaron el punto clave.

Supongamos que tenemos una tabla:

CREATE TABLE `table` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `value` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `value` (`value`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8

Y tiene 10 filas con id y valor de 1 a 10:

INSERT INTO `table`(`id`, `value`) VALUES (1, 1),(2, 2),(3, 3),(4, 4),(5, 5),(6, 6),(7, 7),(8, 8),(9, 9),(10, 10);

Intente las siguientes 2 consultas:

SELECT `value` v FROM `table` WHERE `value`>5; -- Get 5 rows SELECT `value` v FROM `table` HAVING `value`>5; -- Get 5 rows

Obtendrá exactamente los mismos resultados, puede ver que la cláusula HAVING puede funcionar sin la cláusula GROUP BY.

Aquí está la diferencia:

SELECT `value` v FROM `table` WHERE `v`>5;

Error # 1054 - Columna desconocida ''v'' en ''cláusula where''

SELECT `value` v FROM `table` HAVING `v`>5; -- Get 5 rows

La cláusula WHERE requiere que una condición sea una columna en una tabla, pero la cláusula HAVING puede usar una columna o un alias.

Esto se debe a que la cláusula WHERE filtra los datos antes de la selección, pero la cláusula HAVING filtra los datos después de la selección.

Así que ponga las condiciones en la cláusula WHERE será más eficiente si tiene muchas filas en una tabla.

Intente EXPLICAR para ver la diferencia clave:

EXPLAIN SELECT `value` v FROM `table` WHERE `value`>5; +----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+ | 1 | SIMPLE | table | range | value | value | 4 | NULL | 5 | Using where; Using index | +----+-------------+-------+-------+---------------+-------+---------+------+------+--------------------------+ EXPLAIN SELECT `value` v FROM `table` having `value`>5; +----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+ | 1 | SIMPLE | table | index | NULL | value | 4 | NULL | 10 | Using index | +----+-------------+-------+-------+---------------+-------+---------+------+------+-------------+

Puede ver DONDE o HABIENDO usa el índice, pero las filas son diferentes.


HAVING se utiliza para filtrar en agregaciones en su GROUP BY .

Por ejemplo, para verificar nombres duplicados:

SELECT Name FROM Usernames GROUP BY Name HAVING COUNT(*) > 1


  • Una cláusula WHERE se usa para filtrar registros de un resultado. El filtro se produce antes de realizar cualquier agrupación.
  • Una cláusula HAVING se usa para filtrar valores de un grupo. Antes de continuar, revisemos el formato de una declaración SQL. Es

    SELECCIONE SalesOrderID, SUM (UnitPrice * OrderQty) COMO TotalPrice DE Sales.SalesOrderDetail WHERE LineTotal> 100 GRUPO POR SalesOrderID QUE TIENE SUM (UnitPrice * OrderQty)> 10000

El punto clave, que también es la principal diferencia entre la cláusula WHERE y HAVING en SQL, es que la condición especificada en la cláusula WHERE se usa al recuperar datos (filas) de la tabla, y los datos que no pasan la condición no se obtendrán en el resultado set, por otro lado, la cláusula HAVING se usa más tarde para filtrar datos resumidos o datos agrupados.

En resumen, si las cláusulas WHERE y HAVING se utilizan en una consulta SELECT con función agregada o la cláusula GROUP BY, se ejecutará antes de la cláusula HAVING.