1. Qué es
SELECT es la única sentencia que pregunta. Todo lo demás en SQL crea, modifica o borra; SELECT solo lee.
Y tiene una propiedad que conviene entender desde el primer minuto: SELECT no devuelve la tabla, devuelve una tabla nueva. La original no se toca. Puedes equivocarte todas las veces que quieras.
Las dos piezas mínimas:
FROM— de dónde saco las filas.SELECT— qué columnas quiero ver, y en qué forma.
Todo lo demás (filtrar, agrupar, ordenar) se le añade encima.
2. Sintaxis
SELECT columna1, columna2, expresión AS alias
FROM tabla;
Reglas que valen desde ya:
- Las columnas van separadas por coma. La coma sobrante antes del
FROMes el error de sintaxis más frecuente del mundo. - El
;cierra la sentencia. Enpsqles obligatorio; en DBeaver puedes ejecutar sin él, pero acostúmbrate. - Las mayúsculas en las palabras clave son convención, no obligación.
selectfunciona igual. Se escriben en mayúscula para que el ojo separe el esqueleto de la consulta de los nombres de tus tablas.
3. Ejemplos sobre Northwind
La consulta mínima. Dos columnas de una tabla:
SELECT product_name, unit_price
FROM products
LIMIT 5;
product_name | unit_price
------------------------------+------------
Chai | 18.00
Chang | 19.00
Aniseed Syrup | 10.00
Chef Anton's Cajun Seasoning | 22.00
Chef Anton's Gumbo Mix | 21.35
LIMIT 5corta la salida a 5 filas. Se ve en detalle en ordenar-y-limitar; aquí lo uso solo para que los ejemplos quepan en pantalla.
Renombrar con AS. El alias cambia el título de la columna en el resultado, no en la tabla:
SELECT product_name AS producto,
unit_price AS precio_unitario
FROM products
LIMIT 5;
producto | precio_unitario
------------------------------+-----------------
Chai | 18.00
Chang | 19.00
AS es opcional (unit_price precio_unitario funciona), pero escríbelo siempre. Sin él, una coma olvidada convierte dos columnas en una sola con alias, en silencio y sin error.
El SELECT calcula. No estás limitado a las columnas que existen — puedes crear columnas nuevas:
SELECT product_name,
unit_price,
units_in_stock,
unit_price * units_in_stock AS valor_en_stock
FROM products
LIMIT 5;
product_name | unit_price | units_in_stock | valor_en_stock
------------------------------+------------+----------------+----------------
Chai | 18.00 | 39 | 702.00
Chang | 19.00 | 17 | 323.00
Aniseed Syrup | 10.00 | 13 | 130.00
Chef Anton's Cajun Seasoning | 22.00 | 53 | 1166.00
Chef Anton's Gumbo Mix | 21.35 | 0 | 0.00
valor_en_stock no existe en ninguna parte de la base. Se calcula al vuelo, fila por fila. Eso es el 80% del trabajo analítico: columnas que no estaban.
Concatenar texto con ||:
SELECT first_name || ' ' || last_name AS empleado,
title
FROM employees
LIMIT 5;
empleado | title
------------------+-----------------------
Nancy Davolio | Sales Representative
Andrew Fuller | Vice President, Sales
Janet Leverling | Sales Representative
FROM es opcional. Si no lees ninguna tabla, no hace falta:
SELECT 2 + 2 AS resultado, current_date AS hoy;
resultado | hoy
-----------+------------
4 | 2026-08-20
Esto es más útil de lo que parece: es la forma de probar una función sin arrastrar una tabla detrás.
Alias de tabla. Se le pone un nombre corto a la tabla y se prefijan las columnas:
SELECT p.product_name, p.unit_price
FROM products AS p
LIMIT 3;
Con una sola tabla es innecesario. En cuanto haya dos, deja de serlo — ver inner-join.
Sobre SELECT *
SELECT * FROM products devuelve todas las columnas. Es cómodo para asomarse una vez, y mala costumbre en todo lo demás:
- Traes datos que no necesitas — más red, más memoria, más lento.
- Si mañana alguien añade una columna a la tabla, tu consulta cambia de forma sin que tú la toques. Todo lo que dependa de ella se rompe.
- No documenta nada. Quien lea tu consulta dentro de seis meses no sabrá qué esperabas.
Regla: * para explorar, nunca para producir.
4. Errores comunes
-
Coma sobrante antes del
FROM.ERROR: syntax error at or near "FROM"Cuenta las comas: deben ser una menos que las columnas. -
Usar el alias en el
WHERE. Esto falla:sql SELECT product_name, unit_price * 1.18 AS con_igv FROM products WHERE con_igv > 20;ERROR: column "con_igv" does not existNo es un capricho: cuando se evalúa elWHERE, elSELECTtodavía no ha ocurrido. El porqué completo está en orden-logico-de-ejecucion, el tema siguiente. -
Comillas dobles donde no van. En PostgreSQL,
"algo"significa identificador exacto, respeta mayúsculas:sql SELECT "Product_Name" FROM products;ERROR: column "Product_Name" does not existSin comillas, PostgreSQL pasa todo a minúsculas y encuentra la columna. Con comillas, busca literalmenteProduct_Name, que no existe. -
Comillas simples para nombres de columna.
'product_name'no es la columna: es el textoproduct_name, repetido en todas las filas. No da error, que es lo peligroso. Simples = texto. Dobles = identificador. -
SELECT *en un informe que alguien va a mantener. Ver arriba.
5. Diferencias con SQL Server
| PostgreSQL | SQL Server | |
|---|---|---|
| Concatenar | || |
+ (o CONCAT) |
| Identificador con espacios | "Mi columna" |
[Mi columna] |
| Limitar filas | LIMIT 5 |
TOP 5 |
| Fecha de hoy | current_date |
GETDATE() |
La primera duele: en SQL Server 'a' + 'b' concatena; en PostgreSQL, ||. Y + sobre dos textos en PostgreSQL da error de tipo, no un resultado raro — que al menos avisa.
6. Ejercicios
- Lista el nombre y el país de los proveedores, con las columnas tituladas
proveedorypais. - Muestra el nombre de cada producto y su precio con 18% de IGV añadido, en una columna llamada
precio_con_igv. - Devuelve una sola columna llamada
empleadocon el formatoApellido, Nombre. - Averigua cuántas columnas devuelve
SELECT * FROM orders— sin contarlas a ojo. - Devuelve el nombre y la ciudad de los clientes con los títulos exactos
Nombre de la empresayCiudad, con espacios y mayúsculas.
7. Pregunta de negocio
Finanzas quiere saber cuánto dinero hay parado en el almacén: el valor total del inventario producto por producto, del más caro al más barato.
No hace falta ninguna función que no hayas visto. Sí hace falta decidir qué es "valor".