Dónde vs Tener en MySQL
-
DONDE
vsTENIENDO
en MySQL -
la cláusula
WHERE
en MySQL -
la cláusula
HAVING
en MySQL -
Diferencias entre las cláusulas
WHERE
yHAVING
en MySQL
Hoy aprenderemos sobre las diferencias entre las cláusulas WHERE
y HAVING
en MySQL. Comprenderemos las cláusulas individualmente con ejemplos de código y los compararemos en forma tabular para resaltar las diferencias.
DONDE
vs TENIENDO
en MySQL
Las cláusulas WHERE
y HAVING
son bastante similares. La principal diferencia entre estas cláusulas ocurre cuando se usan con GROUP BY
.
No podemos usar la cláusula WHERE
con datos agregados, pero se puede usar HAVING
.
Podemos decir que WHERE
filtra los registros (filas) antes de agrupar, pero la cláusula HAVING
excluye los registros (filas) después de agrupar.
Para continuar paso a paso con este artículo, deberíamos tener una tabla.
Por lo tanto, cree una tabla de transacciones
que contenga cuatro atributos llamados ID
, Producto
, MonthOfTransaction
y AmountInUSD
.
Código de ejemplo:
#create a table
CREATE TABLE `ms20`.`transactions` (
`ID` INT NOT NULL AUTO_INCREMENT,
`Product` VARCHAR(45) NOT NULL,
`MonthOfTransaction` VARCHAR(20) NOT NULL,
`AmountInUSD` INT NOT NULL,
PRIMARY KEY (`ID`));
#insert data into a table
INSERT INTO ms20.transactions(Product, MonthOfTransaction, AmountInUSD) VALUES
('Air Conditioner', 'January', 500),
('Television', 'January', 600),
('Refrigerator', 'January', 550),
('Television', 'March', 600),
('Air Conditioner', 'March', 500),
('Juicer Machine', 'March', 200);
#select all data from the table
SELECT * FROM ms20.transactions;
Producción:
la cláusula WHERE
en MySQL
En MySQL, usamos la cláusula WHERE
para filtrar los registros y extraer solo aquellas filas (registros) que cumplen la condición especificada. Podemos usarlo con declaraciones SELECT
y los comandos UPDATE
, INSERT
y DELETE
.
La cláusula WHERE
se refiere a una condición particular colocada en las columnas seleccionadas al recuperar registros de tablas únicas o múltiples utilizando la cláusula JOIN
. Podemos realizar operaciones lógicas en la cláusula WHERE
, por ejemplo, AND
, NOT
, OR
.
También podemos llamarlas condiciones booleanas que deben ser verdaderas
al recuperar la información de la tabla (también llamada relación). Estos operadores lógicos utilizan operadores de comparación, incluidos <
, >
, <=
, >=
, =
y <>
.
Código de ejemplo:
SELECT Product, sum(AmountInUSD) AS Total
FROM ms20.transactions
WHERE Product in ( 'Television', 'Refrigerator')
GROUP BY Product;
Producción:
la cláusula HAVING
en MySQL
En MySQL, la cláusula HAVING
se combina con la cláusula GROUP BY
. El objetivo de usar esta cláusula es hacer una operación de columna y aplicarla en datos agregados o grupos según las condiciones dadas.
La cláusula HAVING
solo devuelve aquellos resultados de grupos que cumplen una determinada condición. Si las cláusulas WHERE
y HAVING
se usan juntas, WHERE
filtra los registros individuales (filas).
Luego, se agrupan los registros (filas), se realizan los cálculos agregados y, finalmente, HAVING
filtra los grupos. La cláusula HAVING
comprueba la condición de los grupos que creó la cláusula GROUP BY
.
En ausencia de la cláusula GROUP BY
, la cláusula HAVING
se comporta como la cláusula WHERE
.
También podemos usar varias funciones agregadas combinando la cláusula HAVING
con la instrucción SELECT
. Los métodos agregados (grupo) incluyen SUM
, MAX
, MIN
, COUNT
y AVG
.
Podemos usar fácilmente las funciones agregadas con la cláusula HAVING
, mientras que obtendremos un error como uso no válido de la función de grupo
si se usa con la cláusula WHERE
.
Código de ejemplo (sin función agregada):
SELECT Product, sum(AmountInUSD) AS Total
FROM ms20.transactions
GROUP BY Product
HAVING Product in ('Television', 'Refrigerator');
Producción:
Código de ejemplo (con función agregada):
SELECT Product, sum(AmountInUSD) AS Total
FROM ms20.transactions
GROUP BY Product
HAVING sum(AmountInUSD) > 800;
Producción:
Es importante conocer el orden de ejecución cuando tenemos varias cláusulas en una consulta. Debemos recordar el orden FWGHSOL
(empieza en F
y termina en L
) para saber la secuencia de ejecución donde F = DESDE
, W = DONDE
, G = GROUP BY
, H = HAVING
, S = SELECCIONAR
, O = ORDENAR POR
, y L = LÍMITE
.
Diferencias entre las cláusulas WHERE
y HAVING
en MySQL
Debemos considerar los siguientes puntos al escribir las consultas para manipular datos.
La cláusula WHERE |
La cláusula HAVING |
---|---|
Implementado en las operaciones de fila (registro). | Implementado en las operaciones de columna (atributo). |
Realice la operación de filtro en las filas individuales antes de los cálculos agregados. | Realice la operación de filtro en datos agregados (grupo). |
Recupera los datos específicos de filas específicas que cumplen la condición dada. | Primero recupera todos los datos y luego los separa según la condición especificada. |
No podemos usar métodos agregados con esta cláusula. | Podemos usar fácilmente métodos agregados con esta cláusula. |
Se comporta como un prefiltro y va antes de la cláusula GROUP BY . |
Se comporta como un filtro posterior y viene después de la cláusula GROUP BY . |
Se puede utilizar con las sentencias DELETE , SELECT y UPDATE . |
Solo se puede utilizar con la sentencia SELECT . |