DISTINCT
Cuando una consulta devuelve filas con valores repetidos, puedes usar DISTINCT para eliminar los duplicados y obtener solo los valores únicos. Esto es útil cuando quieres saber qué valores existen en una columna sin que se repitan.
Sintaxis
SELECT DISTINCT columna1, columna2, ...
FROM tabla;La palabra clave DISTINCT se coloca inmediatamente después de SELECT, antes de las columnas. MySQL compara todas las columnas listadas para determinar si dos filas son iguales. Si lo son, solo muestra una de ellas.
DISTINCT con una columna
Para ver en qué ciudades viven nuestros clientes, sin repeticiones:
SELECT DISTINCT ciudad
FROM clientes;| ciudad |
|---|
| Madrid |
| Barcelona |
| Sevilla |
| Málaga |
| Valencia |
| Zaragoza |
| A Coruña |
| Córdoba |
| Pamplona |
| San Sebastián |
| Tarragona |
| Burgos |
| Salamanca |
| Bilbao |
| Gijón |
| Las Palmas |
Sin DISTINCT, Madrid, Barcelona, Valencia y Zaragoza aparecerían dos veces cada una (porque tienen dos clientes cada una). Con DISTINCT, cada ciudad aparece solo una vez.
Compara con la misma consulta sin DISTINCT:
SELECT ciudad
FROM clientes;Esta devolvería 20 filas (una por cada cliente), con ciudades repetidas.
DISTINCT con múltiples columnas
Cuando usas DISTINCT con varias columnas, MySQL considera la combinación de todas ellas para determinar si una fila es duplicada:
SELECT DISTINCT estado, empleado_id
FROM pedidos;| estado | empleado_id |
|---|---|
| entregado | 4 |
| entregado | 5 |
| entregado | 6 |
| enviado | 4 |
| enviado | 5 |
| enviado | 6 |
| procesando | 4 |
| procesando | 5 |
| procesando | 6 |
| pendiente | 4 |
| pendiente | 5 |
| pendiente | 6 |
| cancelado | 4 |
| cancelado | 5 |
| cancelado | 6 |
Cada fila representa una combinación única de estado y empleado. "entregado" con empleado 4 es diferente de "entregado" con empleado 5, así que ambas aparecen. La duplicación se evalúa sobre la combinación completa de columnas, no sobre cada columna por separado.
DISTINCT para contar valores únicos
Una aplicación muy habitual de DISTINCT es combinarlo con la función COUNT para contar cuántos valores diferentes existen:
SELECT COUNT(DISTINCT ciudad) AS ciudades_diferentes
FROM clientes;| ciudades_diferentes |
|---|
| 16 |
Tenemos clientes en 16 ciudades diferentes, aunque haya 20 clientes en total. Sin DISTINCT, COUNT(ciudad) devolvería 20.
Otro ejemplo: ¿cuántos clientes diferentes han hecho al menos un pedido?
SELECT COUNT(DISTINCT cliente_id) AS clientes_con_pedidos
FROM pedidos;| clientes_con_pedidos |
|---|
| 19 |
De los 20 clientes, 19 han realizado al menos un pedido.
DISTINCT y NULL
DISTINCT trata todos los valores NULL como iguales entre sí. Si una columna tiene varios NULL, DISTINCT los reduce a uno solo:
SELECT DISTINCT telefono
FROM clientes
WHERE telefono IS NULL OR telefono LIKE '6%'
ORDER BY telefono;| telefono |
|---|
| NULL |
| 601234567 |
| 601234568 |
| 612345670 |
| 612345678 |
| ... |
Aunque hay 3 clientes sin teléfono (Paula, Alejandro y Marta), DISTINCT muestra un solo NULL.
DISTINCT con ORDER BY
Puedes combinar DISTINCT con ORDER BY para obtener valores únicos en un orden específico:
SELECT DISTINCT categoria_id
FROM productos
ORDER BY categoria_id;| categoria_id |
|---|
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
| 11 |
| 12 |
| 13 |
| 14 |
| 15 |
| 16 |
Esto muestra las 11 subcategorías que tienen al menos un producto, ordenadas por su ID. Las categorías padre (1 a 5) no aparecen porque ningún producto está asignado directamente a ellas.
DISTINCT con todas las columnas
Si aplicas DISTINCT con SELECT *, MySQL compara todas las columnas de cada fila. Solo elimina filas que sean completamente idénticas en todas sus columnas:
SELECT DISTINCT *
FROM etiquetas_producto;En este caso, como la tabla tiene una clave primaria (id) que es única por definición, DISTINCT * no eliminará ninguna fila. Cada registro es ya único gracias al id. En la práctica, DISTINCT * es útil en consultas con joins donde pueden aparecer filas duplicadas.
DISTINCT vs GROUP BY
Tanto DISTINCT como GROUP BY pueden eliminar duplicados. Estas dos consultas producen el mismo resultado:
SELECT DISTINCT ciudad
FROM clientes
ORDER BY ciudad;SELECT ciudad
FROM clientes
GROUP BY ciudad
ORDER BY ciudad;Ambas devuelven las 16 ciudades únicas. La diferencia conceptual es que GROUP BY está diseñado para agrupar filas y calcular agregaciones (COUNT, SUM, AVG...), mientras que DISTINCT es simplemente para eliminar duplicados del resultado. Cuando solo necesitas valores únicos sin agregaciones, DISTINCT expresa mejor la intención y es más legible.
Cuándo usar DISTINCT
DISTINCT es la herramienta adecuada cuando quieres conocer los valores únicos de una o varias columnas. Sin embargo, si encuentras que necesitas DISTINCT con frecuencia en tus consultas habituales, puede ser señal de que tu esquema de datos tiene redundancias o de que tus joins están generando duplicados inesperados. En esos casos, revisa la estructura de las tablas y las condiciones de los joins antes de recurrir a DISTINCT como parche.
Practica con DISTINCT
Usa el editor para explorar valores únicos en distintas columnas. Prueba DISTINCT con una o varias columnas:
En el siguiente artículo veremos cómo usar alias para dar nombres más descriptivos a las columnas y tablas en tus consultas.
Escrito por Eduardo Lázaro
