¿Cuál es la diferencia entre GROUP BY y DISTINCT en MySQL?

publicado por: Anonymous

Si hago las siguientes consultas, uniendo varias tablas mediante JOIN, me arrojan exactamente el mismo resultado tanto si uso GROUP BY como si uso DISTINCT:

Usando GROUP BY:

SELECT s.TITLE FROM series_episodes se
INNER JOIN series s ON se.SERIESID = s.ID
INNER JOIN series_trailers st ON se.ID = st.EPISODEID 
GROUP BY s.ID
ORDER BY se.ID DESC;

Usando DISTINCT:

SELECT DISTINCT s.TITLE FROM series_episodes se
INNER JOIN series s ON se.SERIESID = s.ID
INNER JOIN series_trailers st ON se.ID = st.EPISODEID
ORDER BY se.ID DESC;

Yo suelo usar GROUP BY, pero no sé si en algunos casos podría ser mejor usar DISTINCT. Por eso quisiera saber cuál sería la diferencia entre ambos y si hay casos específicos en los que se debería usar uno u otro.

Aquí hay datos de prueba del código indicado más arriba.

solución

Nota: Sentencias realizadas en MySQL

GROUP BY:

Permite agrupar datos una colección de datos en una o mas columnas, los cuales para poderse agrupar deben cumplir condiciones o características especificas.

Retorna un solo registro por cada grupo que se forme.

Ademas permite aplicar funciones de agregamiento (para ver mas sobre ellas aqui: ) a nuestro grupo, cabe destacar esta es su principal función.

Las funciones serian las siguientes: COUNT, MAX, MIN, SUM, AVG

Para ver su funcionamiento conozcamos la estructura de la sentencia:

SELECT FUNCION_DE_AGREGADO(opcional), nombre_columna(s)
FROM nombre_tabla
WHERE condicion
GROUP BY nombre_columna(s)
ORDER BY nombre_columna(s)

Ahora veamos su aplicación:

Tenemos una tabla que guarda datos para una tienda sobre sus clientes, añadiendo en ella su “producto favorito”

-------------------------------
|          CLIENTE            |
-------------------------------
| ID | NOMBRE |    PRODUCTO   | 
-------------------------------
| 1  | juan   | queso         |
| 2  | luis   | queso         |
| 3  | pedro  | arroz         |
| 4  | jacobo | arroz         |
| 5  | vicente| lumpia        |
| 6  | ricky  | jugo de mora  |
| 7  | kevin  | jugo de mora  |
| 8  | gustavo| arroz         |
-------------------------------

Deseamos saber el numero de platos comidos por cada cliente, ya que, asi sabremos que cantidad de platos debemos preparar en nuestra tienda:

Comenzemos agrupando nuestros datos usando:

SELECT id, nombre FROM cliente GROUP BY producto

Obtenemos:

-------------------------------
|          Resultado          |
-------------------------------
| ID | NOMBRE  |   PRODUCTO   | 
-------------------------------
| 3  | pedro   | arroz        |
| 6  | ricky   | jugo de mora |
| 5  | vicente | lumpia       |
| 1  | juan    | queso        |
| 5  | vicente | lumpia       |
-------------------------------

¿Que hicimos?: Agrupamos por filas usando el campo de comidas, ademas de seleccionar el id y el nombre. ¿que hara group by?, seleccionara para cada fila la comida que mas datos repetidos tiene y la colocara en orden descreciente.

Ahora utilizemos las funciones de agregado, para ver por completo el funcionamiento:

SELECT count(COMIDA), nombre FROM cliente GROUP BY COMIDA

En este caso vamos a agrupar por producto, es decir, cada fila tendrá la mayor cantidad de productos e ira en orden decreciente, y junto a ella agregamos una cuenta del producto y el nombre, para saber así la cantidad de productos comprados por esa persona.

Obtenemos:

--------------------------
|count(comida) | nombre  |
--------------------------
|3             |  pedro  |
|2             |  ricky  |
|1             | vicente |
|2             |  juan   |
--------------------------

Como tenemos agrupados los datos podemos fácilmente calcular una cuenta de ese grupo de datos.

Para terminar de diferenciar con DISTINCT apliquemos ahora dicha función:

SELECT DISTINCT COMIDA, nombre from cliente group by COMIDA

Obtenemos:

-------------------------
|comida        | nombre |
-------------------------
|arroz         | pedro  |
|jugo de mora  | ricky  |
|lumpia        | vicente| 
|queso         |  juan  | 
-------------------------

¿Que hace?: Selecciona un ÚNICO valor por cada fila, NO un ÚNICO GRUPO de valores por cada fila.

Como vimos en el ejemplo el registro ARROZ esta tres veces, aqui solo sale para pedro, pues fue el PRIMERO DISTINTO en encontrar y SELECCIONAR.

Ahora podemos entrar a la otra definición:


DISTINCT:

Permite seleccionar unicamente los valores no repetidos del campo seleccionado del(os) registro(s).

A MODO DE RESUMEN: La diferencia es:

GROUP BY: agrupa una colección de datos en una FILA ÚNICA para luego aplicarle una función determinada.

DISTINCT: selecciona solo REGISTROS ÚNICOS según un campo determinado, es decir, remueve duplicados.


APARTE…

Al usar GROUP BY optimizamos la velocidad, ya que, busca todos los registros de la tabla y los copia a una hashtable.

Con DISTINCT optimizamos la memoria, copia todos los valores a una tabla temporal, la ordena y luego va retornando los elementos que son distintos al anterior.


OYE ESPERA SHERLOCK!!!

¿Que me dices de estas dos sentencias?:

SELECT nombre FROM cliente GROUP BY nombre

SELECT DISTINCT nombre FROM cliente

Obtenemos:

-----------
| CLIENTE |
----------|   
| juan    |
| luis    |
| pedro   |
| jacobo  |
| vicente |
| ricky   |
| kevin   |
| gustavo | 
-----------

Esto DEMUESTRA que ambos SON IGUALES.

Si, y no.

En funcionamiento uno agrupa datos y el otro regresa valores únicos, en el caso de GROUP BY su funcion es aplicar funciones (redundancia al limite) y DISTINCT sencillamente limpia duplicado.

¿Por que dan los mismos valores?:

  • GROUP BY dice: vamos a seleccionar los nombres y los agrupamos por nombre, como hay uno de cada uno, solo saldra uno, tengo un grupo de nombre pedro que tiene 1 registro pedro.

  • DISTINCT dice: dejemos un registro de cada uno, tengo 1 registro de pedro.

Si queremos obligar a DISTINCT pudieramos obtener la cuenta de valores asi:

SELECT DISTINCT nombre FROM cliente GROUP BY nombre

De igual manera, debemos agrupar.

ADICIONAL

Estuve leyendo sobre estas dos funciones en otros manejadores fuera de MySQL, y en la documentación de Oracle y SQLServer ambos funcionan de la misma manera, solo difiere GROUPBY por la capacidad de ser el grupo creado un valor para funciones de agregado.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *