Aprende SQL · lección gratuita

Lección 04 · Columnas calculadas, alias y DISTINCT

Resumen

El SELECT no se limita a copiar columnas: puede calcular valores nuevos a partir de ellas (precio menos costo, precio con IVA, concatenación de textos). A esas columnas derivadas conviene darles un nombre legible con un alias (AS). Y cuando solo te interesan los valores únicos de una o varias columnas, DISTINCT elimina las filas duplicadas del resultado.

Sintaxis / Conceptos

Una columna calculada es cualquier expresión en la lista del SELECT. Por ejemplo precio - costo evalúa la resta para cada fila y devuelve una nueva columna. Si no le das alias, el motor le pone un nombre poco amigable (la propia expresión), por eso usamos AS: precio - costo AS margen. El alias define el nombre de la columna en el resultado y puede reutilizarse en ORDER BY (pero no en WHERE, por el orden de ejecución visto en lecciones previas).

DISTINCT se coloca inmediatamente después de SELECT y afecta a toda la fila proyectada: SELECT DISTINCT pais, segmento FROM clientes devuelve cada par (pais, segmento) una sola vez, aunque haya muchos clientes con esa combinación. Es un error común pensar que DISTINCT se aplica a una sola columna cuando hay varias en el SELECT.

DISTINCT vs GROUP BY: ambos pueden eliminar duplicados. SELECT DISTINCT pais FROM clientes y SELECT pais FROM clientes GROUP BY pais devuelven lo mismo. La diferencia es de intención y capacidad: DISTINCT solo deduplica; GROUP BY agrupa para luego calcular agregados (COUNT, SUM, AVG) por grupo. Si solo quieres valores únicos, usa DISTINCT; si quieres un cálculo por grupo, necesitas GROUP BY (lo verás en el módulo de agregación). Usar GROUP BY solo para deduplicar es legítimo pero menos expresivo.

Cuidado con la división entera: en SQLite, precio / costo entre dos enteros da un entero truncado. Si quieres decimales, fuerza un operando a real, p. ej. precio 1.0 / costo o ROUND(precio 1.0 / costo, 2).

SELECT DISTINCT cargo FROM empleados ORDER BY cargo

Ejemplos

-- Columna calculada: margen unitario por producto, con alias
SELECT nombre, precio, costo, precio - costo AS margen
FROM productos
ORDER BY margen DESC;

-- Expresión con redondeo y división forzada a real (margen %)
SELECT nombre,
       ROUND((precio - costo) * 100.0 / precio, 1) AS margen_pct
FROM productos
ORDER BY margen_pct DESC
LIMIT 5;

-- Concatenación de texto con ||
SELECT nombre || ' (' || cargo || ')' AS empleado
FROM empleados
LIMIT 5;

-- DISTINCT sobre una columna: paises donde hay clientes
SELECT DISTINCT pais
FROM clientes;

-- DISTINCT sobre varias columnas: combinaciones únicas pais + segmento
SELECT DISTINCT pais, segmento
FROM clientes
ORDER BY pais, segmento;
💡 El alias del SELECT no existe en el WHERE. SELECT precio - costo AS margen FROM productos WHERE margen > 1000 falla, porque el WHERE se evalúa antes que la proyección. Repite la expresión (WHERE precio - costo > 1000) o envuelve la consulta en una subconsulta. En ORDER BY, en cambio, el alias funciona.

Cheatsheet

RecursoQué hace
expr AS aliasRenombra una columna o cálculo en el resultado
precio - costoColumna calculada (aritmética por fila)
`a \\b`Concatena cadenas
ROUND(x, n)Redondea a n decimales
x * 1.0 / yFuerza división real (evita truncado entero)
SELECT DISTINCT ...Elimina filas duplicadas del resultado
DISTINCT a, bCombinaciones únicas de (a, b)

---

← Ordenar y limitar: ORDER BY y LIMITOperadores lógicos: AND, OR, NOT →

Ver todas las lecciones de Aprende SQL →