Contenido de esta guía
Qué hace DISTINCT
DISTINCT conserva una sola copia de cada fila repetida en el resultado. Es útil cuando necesitas responder preguntas como «¿en qué ciudades hay clientes?» o «¿qué estados de pedido existen?», sin repetir el mismo valor muchas veces.
La tabla no cambia. La eliminación de duplicados ocurre únicamente en el conjunto de filas que devuelve el SELECT.
Cómo decide qué filas son iguales
DISTINCT se aplica a todas las expresiones seleccionadas. Con una columna compara esa columna; con varias, compara la combinación completa.
SELECT DISTINCT columna_1, columna_2
FROM tabla;Dos filas se consideran repetidas cuando no se distinguen por las expresiones seleccionadas. Por eso SELECT DISTINCT ciudad, activo puede devolver dos filas para Madrid: una para clientes activos y otra para inactivos.
NULL tiene una regla especial en la eliminación de duplicados: los motores habituales tratan dos NULL de la misma posición como no distintos para este propósito; SQLite lo documenta expresamente. Eso no significa que una comparación ordinaria NULL = NULL sea verdadera en un WHERE.
No uses DISTINCT como parche automático. Si una combinación con JOIN produce más filas de las esperadas, primero revisa la relación y la condición de unión. Eliminar duplicados puede esconder un error sin resolverlo.
Ejemplo guiado
Queremos saber qué ciudades aparecen en la tabla clientes:
SELECT DISTINCT ciudad
FROM clientes
ORDER BY ciudad;| ciudad |
|---|
| A Coruña |
| Bilbao |
| Madrid |
| Sevilla |
| Valencia |
| Zaragoza |
Madrid aparece en varias filas de la tabla, pero solo una vez en el resultado. ORDER BY no elimina duplicados: únicamente presenta los valores únicos en un orden predecible.
Error frecuente
Esperar que DISTINCT actúe sobre una sola columna
En SELECT DISTINCT ciudad, nombre, cada combinación de ciudad y nombre suele ser distinta. Si necesitas únicamente las ciudades, selecciona solo ciudad. Decide primero qué representa una fila del resultado.
Comprueba lo aprendido
Enumera los estados de pedido
Escribe una consulta que devuelva cada valor de estado una sola vez desde pedidos. Ordena el resultado alfabéticamente.
estado.DISTINCT después de SELECT.ORDER BY estado para obtener un orden estable.Solución razonada
SELECT DISTINCT estado
FROM pedidos
ORDER BY estado;| estado |
|---|
| cancelado |
| enviado |
| pendiente |
El resultado contiene tres filas porque esos son los tres estados distintos almacenados.
Compatibilidad entre motores
La forma SELECT DISTINCT es común en los motores SQL principales. Algunas bases ofrecen extensiones para elegir una fila concreta dentro de cada grupo de duplicados; esas variantes no son portables. Para empezar, utiliza la forma estándar y controla el orden de manera explícita.
Qué debes recordar
DISTINCTafecta al resultado, no a los datos guardados.- Compara la combinación de todas las columnas seleccionadas.
- No sustituye una condición de unión correcta.
- Añade
ORDER BYcuando el orden importe.