SELECT en SQL: consultas básicas con ejemplos y ejercicios
Actualizado el 29 de septiembre de 2026
SELECT es la instrucción para leer datos de una base de datos, y la que más vas a escribir. Una consulta dice qué columnas quieres y de qué tabla, y la base de datos devuelve el resultado como una tabla nueva, sin modificar los datos guardados.
Todos los ejemplos usan esta tabla de productos de una tienda. Fíjate en que el escritorio no tiene stock registrado (NULL), que no es lo mismo que tener 0.
CREATE TABLE productos (
id INTEGER PRIMARY KEY,
nombre TEXT,
categoria TEXT,
precio INTEGER,
stock INTEGER
);| id | nombre | categoria | precio | stock |
|---|---|---|---|---|
| 1 | Teclado | Computación | 25990 | 12 |
| 2 | Mouse | Computación | 12990 | 30 |
| 3 | Monitor | Computación | 159990 | 4 |
| 4 | Audífonos | Audio | 34990 | 0 |
| 5 | Parlante | Audio | 49990 | 7 |
| 6 | Silla | Muebles | 89990 | 3 |
| 7 | Escritorio | Muebles | 129990 | NULL |
Elegir columnas
SELECT nombre, precio
FROM productos;| nombre | precio |
|---|---|
| Teclado | 25990 |
| Mouse | 12990 |
| Monitor | 159990 |
| Audífonos | 34990 |
| Parlante | 49990 |
| Silla | 89990 |
| Escritorio | 129990 |
Después de SELECT van las columnas separadas por comas, y después de FROM, la tabla. SELECT * trae todas las columnas: es cómodo para explorar, pero en una aplicación conviene nombrar las columnas que se usan, para no traer datos de más y para que la consulta no cambie si alguien agrega una columna.
SQL no distingue mayúsculas en las palabras clave: select y SELECT son lo mismo. Escribirlas en mayúsculas es una convención para diferenciarlas de los nombres de tablas y columnas.
Calcular valores y ponerles nombre con AS
Una columna del resultado no tiene por qué existir en la tabla: puede ser un cálculo. Con AS se le da un nombre (un alias):
SELECT nombre, precio * stock AS valor_inventario
FROM productos;| nombre | valor_inventario |
|---|---|
| Teclado | 311880 |
| Mouse | 389700 |
| Monitor | 639960 |
| Audífonos | 0 |
| Parlante | 349930 |
| Silla | 269970 |
| Escritorio | NULL |
El escritorio da NULL: cualquier cálculo con un valor desconocido da un resultado desconocido. Es una regla general de SQL que conviene tener presente siempre que una columna admita NULL.
Para unir textos se usa || en SQLite y PostgreSQL: SELECT 'Producto: ' || nombre AS etiqueta devuelve "Producto: Teclado", "Producto: Mouse", etc. En MySQL la función equivalente es CONCAT().
Valores sin repetir: DISTINCT
SELECT DISTINCT categoria
FROM productos;| categoria |
|---|
| Computación |
| Audio |
| Muebles |
DISTINCT elimina las filas repetidas del resultado. Si se ponen varias columnas, se eliminan las combinaciones repetidas: SELECT DISTINCT categoria, stock compara ambas columnas juntas.
Errores comunes
Una coma de más antes de FROM
SELECT nombre, precio,
FROM productos;
-- Error: near "FROM": syntax errorDespués de la última columna no va coma. Cuando un error de sintaxis apunta a una palabra ("near FROM"), el problema casi siempre está justo antes de ella.
Comillas dobles para textos
En SQL estándar, los textos van entre comillas simples ('Audio') y las comillas dobles son para nombres de columnas o tablas ("nombre"). SQLite acepta comillas dobles para textos por compatibilidad, pero PostgreSQL no: ahí "Audio" se interpreta como una columna que no existe. Usa siempre comillas simples para los textos.
Esperar decimales redondos
precio * 1.19 para el teclado da 30928.1: al multiplicar por un decimal, el resultado es decimal. ROUND(precio * 1.19) da 30928.0 en SQLite, porque ROUND devuelve un número decimal aunque no tenga parte fraccionaria. Si necesitas un entero, usa CAST(ROUND(precio * 1.19) AS INTEGER).
Ejercicios resueltos
Intenta resolver cada ejercicio antes de abrir la solución: equivocarse y corregir es la parte que más enseña.
1.Nombre y stock
Escribe una consulta que muestre el nombre y el stock de todos los productos.
Ver soluciónOcultar solución
SELECT nombre, stock
FROM productos;| nombre | stock |
|---|---|
| Teclado | 12 |
| Mouse | 30 |
| Monitor | 4 |
| Audífonos | 0 |
| Parlante | 7 |
| Silla | 3 |
| Escritorio | NULL |
Las columnas aparecen en el resultado en el orden en que se escriben en el SELECT, no en el de la tabla. El escritorio aparece con NULL: la fila existe, solo que el dato no.
2.Valor del inventario de los productos con stock
Escribe una consulta que muestre el nombre de cada producto y el valor de su inventario (precio por stock) en una columna llamada valor_inventario, solo para los productos con stock mayor que 0.
Para filtrar filas se usa WHERE, que se explica en la guía siguiente: WHERE stock > 0 va después del FROM.
Ver soluciónOcultar solución
SELECT nombre, precio * stock AS valor_inventario
FROM productos
WHERE stock > 0;| nombre | valor_inventario |
|---|---|
| Teclado | 311880 |
| Mouse | 389700 |
| Monitor | 639960 |
| Parlante | 349930 |
| Silla | 269970 |
El cálculo va en el SELECT y el alias le da nombre a la columna. WHERE stock > 0 deja fuera los audífonos (stock 0) y también el escritorio: NULL > 0 no es verdadero, así que esa fila no pasa el filtro.
3.Categorías disponibles
Escribe una consulta que liste las categorías de productos, cada una una sola vez.
Ver soluciónOcultar solución
SELECT DISTINCT categoria
FROM productos;| categoria |
|---|
| Computación |
| Audio |
| Muebles |
Sin DISTINCT saldrían siete filas, una por producto. Si además quisieras saber cuántos productos hay en cada categoría, la herramienta es GROUP BY, que tiene su propia guía.