Aprende SQL · lección gratuita
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.
+ - * /), funciones (ROUND, strftime) y concatenación (||) dentro del SELECT.AS: renombra una columna o expresión en el resultado (precio - costo AS margen). AS es opcional pero recomendable.DISTINCT: tras SELECT, descarta filas duplicadas considerando todas las columnas proyectadas.DISTINCT sobre varias columnas: produce las combinaciones únicas, no el distinct de cada columna por separado.||: operador de concatenación de cadenas en SQLite (estándar SQL).ROUND(x, n): redondea a n decimales, útil para importes calculados.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
-- 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 delSELECTno existe en elWHERE.SELECT precio - costo AS margen FROM productos WHERE margen > 1000falla, porque elWHEREse evalúa antes que la proyección. Repite la expresión (WHERE precio - costo > 1000) o envuelve la consulta en una subconsulta. EnORDER BY, en cambio, el alias sí funciona.
| Recurso | Qué hace | ||
|---|---|---|---|
expr AS alias | Renombra una columna o cálculo en el resultado | ||
precio - costo | Columna calculada (aritmética por fila) | ||
| `a \ | \ | b` | Concatena cadenas |
ROUND(x, n) | Redondea a n decimales | ||
x * 1.0 / y | Fuerza división real (evita truncado entero) | ||
SELECT DISTINCT ... | Elimina filas duplicadas del resultado | ||
DISTINCT a, b | Combinaciones únicas de (a, b) |
---
← Ordenar y limitar: ORDER BY y LIMITOperadores lógicos: AND, OR, NOT →