¿Qué es una clave única en una base de datos?

DISTINCT en SQL: Adiós a los Duplicados

Valoración: 4.08 (2592 votos)

En el vasto universo de la gestión de datos, la precisión y la unicidad de la información son fundamentales. A menudo, las tablas en una base de datos contienen registros que, si bien son necesarios para el almacenamiento completo, pueden presentar valores repetidos en ciertas columnas o combinaciones de columnas cuando realizamos consultas. Aquí es donde entra en juego una herramienta esencial en SQL: la palabra clave DISTINCT.

¿Qué es distinct en base de datos?
La cláusula Distinct se incluye para devolver una lista de nombres de cliente únicos y fechas de pedido.6 abr 2023

Imagina que tienes una lista de todos los clientes que han realizado una compra, y quieres saber de qué ciudades provienen esos clientes. Si un cliente ha comprado varias veces y siempre ha vivido en la misma ciudad, su ciudad aparecerá repetida en la lista cruda de ciudades de compra. Si simplemente quieres una lista de *todas* las ciudades únicas de tus clientes, sin importar cuántos clientes sean de cada ciudad o cuántas veces aparezcan, necesitas una forma de filtrar esos duplicados. DISTINCT te proporciona esa capacidad.

Índice de Contenido

¿Qué es SQL DISTINCT?

En esencia, la palabra clave SQL DISTINCT se utiliza en una declaración SELECT para devolver solo valores únicos. Su propósito principal es eliminar filas duplicadas del conjunto de resultados de una consulta. Cuando aplicas DISTINCT a una o más columnas, el sistema de base de datos evalúa la combinación de valores en esas columnas para cada fila y solo incluye en el resultado aquellas filas cuya combinación de valores no ha sido vista antes en el conjunto de resultados.

Es crucial entender que DISTINCT opera sobre el *conjunto* de columnas especificado. Si seleccionas DISTINCT en una sola columna, se eliminan los valores duplicados de esa columna. Si lo aplicas a múltiples columnas, se eliminan las filas donde la *combinación* de valores en todas las columnas seleccionadas es idéntica a otra fila en el resultado.

Sintaxis de DISTINCT

La sintaxis básica para usar DISTINCT es muy sencilla y se coloca inmediatamente después de la palabra clave SELECT, antes de las columnas que deseas seleccionar:

SELECT DISTINCT columna1, columna2, ...
FROM nombre_tabla
WHERE condicion;

  • columna1, columna2, ...: Son las columnas de las que deseas recuperar valores únicos.
  • nombre_tabla: Es la tabla de la que estás consultando los datos.
  • WHERE condicion (Opcional): Es una condición que puedes aplicar para filtrar las filas antes de que se aplique DISTINCT.

Es importante notar que DISTINCT se aplica a *todas* las columnas listadas después de él. No puedes aplicar DISTINCT a una columna y no a otra en la misma cláusula SELECT. Si necesitas unicidad basada en diferentes criterios para distintas partes de tu consulta, podrías necesitar enfoques más complejos como subconsultas o agrupaciones.

¿Cómo funciona la función distinct?
La función Distinct evalúa una fórmula en cada registro de una tabla y devuelve una tabla de una columna con los resultados, con los valores duplicados eliminados.

¿Cuándo usar DISTINCT?

La palabra clave DISTINCT es especialmente útil en una variedad de escenarios comunes en la gestión de bases de datos:

  • Obtener listas únicas: Si necesitas una lista de valores sin repeticiones de una columna, como la lista de todos los países de donde provienen tus usuarios, la lista de todos los productos vendidos, o la lista de todos los departamentos en una empresa.
  • Identificar combinaciones únicas: Cuando necesitas ver combinaciones únicas de valores entre varias columnas, por ejemplo, pares únicos de 'Ciudad' y 'Código Postal', o combinaciones únicas de 'Categoría de Producto' y 'Subcategoría'.
  • Limpieza y exploración de datos: DISTINCT puede ayudarte a entender la variedad de valores existentes en una columna y a identificar posibles inconsistencias o errores de entrada de datos (por ejemplo, diferentes formas de escribir el mismo nombre de ciudad).
  • Generación de informes resumidos: Aunque GROUP BY es a menudo más adecuado para resúmenes con agregaciones (como contar ocurrencias), DISTINCT es perfecto cuando solo necesitas la lista de elementos únicos en sí misma.

Cómo funciona DISTINCT: Ejemplos Prácticos

Veamos cómo funciona DISTINCT con un ejemplo simple. Supongamos que tenemos una tabla llamada Pedidos con la siguiente estructura y datos:


+---------+------------+--------------+-----------+
| ID_Pedido | ID_Cliente | Nombre_Producto | Ciudad_Envio |
+---------+------------+--------------+-----------+
| 1 | 101 | Laptop | Madrid |
| 2 | 102 | Teclado | Barcelona |
| 3 | 101 | Ratón | Madrid |
| 4 | 103 | Monitor | Valencia |
| 5 | 102 | Laptop | Barcelona |
| 6 | 101 | Teclado | Madrid |
+---------+------------+--------------+-----------+

Si queremos obtener una lista de todas las ciudades a las que hemos enviado pedidos, una consulta simple sería:

SELECT Ciudad_Envio FROM Pedidos;

El resultado sería:


+--------------+
| Ciudad_Envio |
+--------------+
| Madrid |
| Barcelona |
| Madrid |
| Valencia |
| Barcelona |
| Madrid |
+--------------+

Como puedes ver, hay ciudades duplicadas (Madrid y Barcelona aparecen varias veces). Para obtener una lista de ciudades *únicas*, usamos DISTINCT:

SELECT DISTINCT Ciudad_Envio FROM Pedidos;

Ahora, el resultado es:


+--------------+
| Ciudad_Envio |
+--------------+
| Madrid |
| Barcelona |
| Valencia |
+--------------+

Aquí, DISTINCT eliminó las entradas duplicadas de 'Madrid' y 'Barcelona', dejándonos con una lista de cada ciudad representada en la tabla al menos una vez.

DISTINCT con Múltiples Columnas

Ahora, ¿qué pasa si queremos ver las combinaciones únicas de 'ID_Cliente' y 'Ciudad_Envio'? Quizás queremos saber qué clientes han recibido envíos en qué ciudades, listando cada combinación única una sola vez.

SELECT DISTINCT ID_Cliente, Ciudad_Envio FROM Pedidos;

Aplicando esta consulta a nuestra tabla Pedidos:


+------------+--------------+
| ID_Cliente | Ciudad_Envio |
+------------+--------------+
| 101 | Madrid |
| 102 | Barcelona |
| 103 | Valencia |
+------------+--------------+

En este caso, aunque el cliente 101 tiene tres pedidos y el cliente 102 tiene dos, ambos siempre han recibido sus pedidos en la misma ciudad (Madrid y Barcelona, respectivamente). La combinación (101, Madrid) aparece en los pedidos 1, 3 y 6. La combinación (102, Barcelona) aparece en los pedidos 2 y 5. La combinación (103, Valencia) aparece solo en el pedido 4.

DISTINCT considera la fila entera (en las columnas especificadas) como un único elemento. Elimina una fila solo si hay otra fila con *exactamente los mismos valores* en *todas* las columnas listadas después de DISTINCT. Por lo tanto, el resultado muestra cada combinación única de cliente y ciudad de envío.

Si, por ejemplo, el cliente 101 hubiera tenido un pedido enviado a Sevilla (además de los de Madrid), la combinación (101, Sevilla) también aparecería en el resultado DISTINCT, ya que sería una combinación nueva y única.

¿Qué pasa cuando usas distinct?
El resultado de una consulta en la que se usa DISTINCT no se puede actualizar y no refleja los cambios posteriores efectuados por otros usuarios.

Consideraciones al Usar DISTINCT

  • Rendimiento: Aplicar DISTINCT requiere que el motor de base de datos compare todas las filas y elimine duplicados. Esto puede implicar ordenar los datos o usar otras técnicas que consumen recursos (CPU y memoria), especialmente en tablas muy grandes. En algunos casos, si la tabla es enorme, una solución alternativa como agrupar por las columnas y seleccionar la primera fila de cada grupo (aunque sintácticamente diferente y a veces más compleja) podría tener un rendimiento distinto, pero DISTINCT es generalmente optimizado por los sistemas de base de datos modernos.
  • Columnas seleccionadas: Recuerda que DISTINCT se aplica a la combinación de *todas* las columnas en la cláusula SELECT. Si solo necesitas unicidad basada en una subselección de columnas, asegúrate de no incluir columnas adicionales que puedan hacer que las filas parezcan únicas cuando no lo son desde la perspectiva que te interesa.
  • NULLs: En SQL, NULL se trata a menudo de manera especial. Para la mayoría de los sistemas de bases de datos, DISTINCT considera que todos los valores NULL en una columna son iguales entre sí. Por lo tanto, si una columna contiene múltiples valores NULL, DISTINCT solo mantendrá uno de ellos en el resultado.
  • Compatibilidad: La palabra clave DISTINCT es una característica estándar de SQL y está disponible en prácticamente todos los Sistemas de Gestión de Bases de Datos Relacionales (RDBMS) populares, incluyendo MySQL, PostgreSQL, Oracle, SQL Server, SQLite, etc.

DISTINCT vs. GROUP BY

A menudo surge la pregunta sobre la diferencia entre DISTINCT y GROUP BY. Aunque a veces pueden producir resultados similares (una lista de valores únicos), su propósito fundamental y funcionamiento son diferentes.

  • DISTINCT: Su objetivo es simplemente eliminar filas duplicadas basándose en los valores de las columnas seleccionadas. No realiza agregaciones.
  • GROUP BY: Se utiliza para agrupar filas que tienen los mismos valores en una o más columnas especificadas. Se usa típicamente junto con funciones de agregación (como COUNT, SUM, AVG, MIN, MAX) para realizar cálculos en cada grupo. Si usas GROUP BY sin funciones de agregación, el resultado a menudo será una lista de valores únicos (una fila por grupo), similar a DISTINCT, pero el propósito subyacente es la agrupación para posibles agregaciones futuras.

En muchos casos donde solo necesitas la lista de valores únicos, DISTINCT es la opción más directa y legible. Si necesitas realizar cálculos sobre esos grupos únicos, GROUP BY es la herramienta adecuada.

Preguntas Frecuentes sobre DISTINCT

¿DISTINCT afecta el orden de los resultados?

No, DISTINCT por sí solo no garantiza un orden específico en los resultados. Si necesitas que los resultados únicos estén ordenados, debes añadir una cláusula ORDER BY después de la cláusula FROM (y WHERE, si la hay).

SELECT DISTINCT Ciudad_Envio FROM Pedidos ORDER BY Ciudad_Envio;

Esto devolvería las ciudades únicas ordenadas alfabéticamente.

¿Puedo usar DISTINCT en una sola columna o en varias?

Sí, puedes usar DISTINCT tanto en una sola columna como en una lista de múltiples columnas. Cuando se usa con múltiples columnas, la unicidad se determina por la combinación completa de valores en todas las columnas listadas.

¿Qué es distinct() en SQL?
¿Qué es SQL DISTINCT? La palabra clave SQL DISTINCT se utiliza para recuperar valores únicos de una columna o conjunto de columnas específico en una tabla de base de datos . Elimina registros duplicados, garantizando que solo se devuelvan valores distintos y no repetidos.

¿DISTINCT cuenta los valores NULL como iguales?

Sí, en la mayoría de los sistemas de bases de datos, DISTINCT trata múltiples valores NULL en una columna como si fueran iguales, y solo mantendrá una fila con NULL para esa columna (o combinación de columnas si hay más en el SELECT).

¿Puedo usar DISTINCT con funciones de agregación?

Sí, es muy común usar DISTINCT *dentro* de una función de agregación, especialmente con COUNT. Por ejemplo, COUNT(DISTINCT columna) cuenta el número de valores únicos en una columna, ignorando los duplicados. Esto es diferente de usar DISTINCT al principio del SELECT, que elimina filas duplicadas completas.

SELECT COUNT(DISTINCT Ciudad_Envio) FROM Pedidos;

Esta consulta contaría cuántas ciudades únicas hay en la tabla Pedidos (en nuestro ejemplo, el resultado sería 3).

Conclusión

La palabra clave DISTINCT es una herramienta poderosa y fácil de usar en SQL para eliminar filas duplicadas de los resultados de tus consultas. Te permite obtener listas claras y únicas de valores o combinaciones de valores, lo cual es esencial para informes precisos, análisis de datos y tareas de limpieza. Entender cómo funciona DISTINCT, especialmente cuando se aplica a múltiples columnas, es clave para escribir consultas SQL efectivas y obtener exactamente la información que necesitas de tus bases de datos.

Si quieres conocer otros artículos parecidos a DISTINCT en SQL: Adiós a los Duplicados puedes visitar la categoría Bases de datos.

Ivan

Soy un entusiasta de la tecnología con especialización en bases de datos, particularmente en MySQL. A través de mis tutoriales detallados, busco desmitificar los conceptos complejos y proporcionar soluciones prácticas a los desafíos cotidianos relacionados con la gestión de datos

Aprende mas sobre MySQL

Subir