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;
estadoempleado_id
entregado4
entregado5
entregado6
enviado4
enviado5
enviado6
procesando4
procesando5
procesando6
pendiente4
pendiente5
pendiente6
cancelado4
cancelado5
cancelado6

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:

Simulador SQL
Ctrl+Enter para ejecutar

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