Saltar al contenido

Tus archivos no se suben

Ejercicios de SQL

32 ejercicios sobre una ferretería inventada. Se corrigen solos.

Ejercicio

Cargando…

Cómo se corrige

Tu consulta se ejecuta sobre una copia limpia de la base y su resultado se compara con el de la solución. No importa cómo la escribiste: si llega a las mismas filas, está bien. El orden solo se revisa cuando el ejercicio lo pide.

Tu avance queda guardado en este navegador. No hay cuenta ni ranking.

La base

TablaQué guarda
productosid, codigo, nombre, categoria_id, proveedor_id, precio, stock
categoriasid, nombre
proveedoresid, nombre, comuna
sucursalesid, nombre, comuna, region
pedidosid, fecha, sucursal_id, estado
detalle_pedidospedido_id, producto_id, cantidad, precio_unitario

Los datos son inventados. Las empresas y sucursales no existen.

Todos los ejercicios

Consultas simples

  1. 1
    Todos los productos. Muestra todas las columnas de la tabla productos.
    Ver una solución
    SELECT * FROM productos;
  2. 2
    Solo dos columnas. Muestra el nombre y el precio de cada producto.
    Ver una solución
    SELECT nombre, precio FROM productos;
  3. 3
    Más caros que 20.000. Muestra nombre y precio de los productos que cuestan más de 20000.
    Ver una solución
    SELECT nombre, precio FROM productos WHERE precio > 20000;
  4. 4
    Sin stock. Muestra el código y el nombre de los productos con stock cero.
    Ver una solución
    SELECT codigo, nombre FROM productos WHERE stock = 0;
  5. 5
    Del más caro al más barato. Muestra nombre y precio de todos los productos, partiendo por el más caro.
    Ver una solución
    SELECT nombre, precio FROM productos ORDER BY precio DESC, nombre;
  6. 6
    Los cinco más baratos. Muestra nombre y precio de los cinco productos más baratos.
    Ver una solución
    SELECT nombre, precio FROM productos ORDER BY precio LIMIT 5;
  7. 7
    Buscar por palabra. Muestra el nombre de los productos que contienen la palabra «llave».
    Ver una solución
    SELECT nombre FROM productos WHERE nombre LIKE '%llave%';
  8. 8
    Sucursales de una región. Muestra nombre y comuna de las sucursales de la región Metropolitana.
    Ver una solución
    SELECT nombre, comuna FROM sucursales WHERE region = 'Metropolitana';

Contar y agrupar

  1. 9
    Contar productos. ¿Cuántos productos hay en total?
    Ver una solución
    SELECT COUNT(*) FROM productos;
  2. 10
    Precio promedio. Calcula el precio promedio de los productos, redondeado a entero.
    Ver una solución
    SELECT ROUND(AVG(precio)) FROM productos;
  3. 11
    Productos por categoría. Muestra cada categoria_id y cuántos productos tiene.
    Ver una solución
    SELECT categoria_id, COUNT(*) FROM productos GROUP BY categoria_id;
  4. 12
    Valor del inventario. Calcula cuánto vale todo el inventario: precio por stock, sumado.
    Ver una solución
    SELECT SUM(precio * stock) FROM productos;
  5. 13
    Categorías grandes. Muestra los categoria_id que tienen más de 4 productos, junto a su cantidad.
    Ver una solución
    SELECT categoria_id, COUNT(*) FROM productos GROUP BY categoria_id HAVING COUNT(*) > 4;
  6. 14
    Pedidos por estado. Cuenta cuántos pedidos hay en cada estado.
    Ver una solución
    SELECT estado, COUNT(*) FROM pedidos GROUP BY estado;

Unir tablas

  1. 15
    Producto y categoría. Muestra el nombre de cada producto junto al nombre de su categoría.
    Ver una solución
    SELECT p.nombre, c.nombre FROM productos p JOIN categorias c ON c.id = p.categoria_id;
  2. 16
    Una categoría por nombre. Muestra el nombre de los productos de la categoría «Gasfitería».
    Ver una solución
    SELECT p.nombre FROM productos p JOIN categorias c ON c.id = p.categoria_id WHERE c.nombre = 'Gasfitería';
  3. 17
    Contar con nombres. Muestra el nombre de cada categoría y cuántos productos tiene.
    Ver una solución
    SELECT c.nombre, COUNT(*) FROM productos p JOIN categorias c ON c.id = p.categoria_id GROUP BY c.nombre;
  4. 18
    Pedidos con sucursal. Muestra el id de cada pedido, su fecha y el nombre de su sucursal.
    Ver una solución
    SELECT pe.id, pe.fecha, s.nombre FROM pedidos pe JOIN sucursales s ON s.id = pe.sucursal_id;
  5. 19
    Unidades vendidas. Muestra el nombre de cada producto vendido y sus unidades totales, de mayor a menor.
    Ver una solución
    SELECT p.nombre, SUM(d.cantidad) AS unidades FROM detalle_pedidos d JOIN productos p ON p.id = d.producto_id GROUP BY p.nombre ORDER BY unidades DESC, p.nombre;
  6. 20
    Total de cada pedido. Muestra el pedido_id y el total en pesos de cada pedido.
    Ver una solución
    SELECT pedido_id, SUM(cantidad * precio_unitario) FROM detalle_pedidos GROUP BY pedido_id;
  7. 21
    Nunca pedidos. Muestra el nombre de los productos que no aparecen en ningún pedido.
    Ver una solución
    SELECT p.nombre FROM productos p LEFT JOIN detalle_pedidos d ON d.producto_id = p.id WHERE d.producto_id IS NULL;
  8. 22
    La sucursal con más pedidos. Muestra el nombre de la sucursal con más pedidos y cuántos tiene.
    Ver una solución
    SELECT s.nombre, COUNT(*) AS pedidos FROM pedidos pe JOIN sucursales s ON s.id = pe.sucursal_id GROUP BY s.nombre ORDER BY pedidos DESC LIMIT 1;

Subconsultas

  1. 23
    Sobre el promedio. Muestra nombre y precio de los productos más caros que el precio promedio.
    Ver una solución
    SELECT nombre, precio FROM productos WHERE precio > (SELECT AVG(precio) FROM productos);
  2. 24
    El más caro de cada categoría. Muestra categoria_id, nombre y precio del producto más caro de cada categoría.
    Ver una solución
    SELECT categoria_id, nombre, precio FROM productos p WHERE precio = (SELECT MAX(precio) FROM productos x WHERE x.categoria_id = p.categoria_id);
  3. 25
    Proveedores sin faltantes. Muestra el nombre de los proveedores que no tienen ningún producto con stock cero.
    Ver una solución
    SELECT nombre FROM proveedores v WHERE NOT EXISTS (SELECT 1 FROM productos p WHERE p.proveedor_id = v.id AND p.stock = 0);
  4. 26
    Pedidos grandes. Muestra el id de los pedidos cuyo total supera los 100000 pesos.
    Ver una solución
    SELECT pedido_id FROM detalle_pedidos GROUP BY pedido_id HAVING SUM(cantidad * precio_unitario) > 100000;
  5. 27
    Pedidos por mes. Muestra cada mes de 2026 en formato AAAA-MM y cuántos pedidos tuvo, en orden.
    Ver una solución
    SELECT strftime('%Y-%m', fecha) AS mes, COUNT(*) FROM pedidos GROUP BY mes ORDER BY mes;
  6. 28
    Clasificar por precio. Muestra cada nombre de producto y una columna con «barato» si cuesta menos de 5000, «medio» si cuesta menos de 20000 y «caro» en otro caso.
    Ver una solución
    SELECT nombre, CASE WHEN precio < 5000 THEN 'barato' WHEN precio < 20000 THEN 'medio' ELSE 'caro' END FROM productos;

Cambiar datos

  1. 29
    Agregar una categoría. Agrega la categoría «Ferretería general» con el id 9.
    Ver una solución
    INSERT INTO categorias VALUES (9, 'Ferretería general');
  2. 30
    Subir precios. Sube en 10 % el precio de los productos de la categoría 1.
    Ver una solución
    UPDATE productos SET precio = precio * 1.1 WHERE categoria_id = 1;
  3. 31
    Borrar lo cancelado. Borra de detalle_pedidos las filas de los pedidos con estado «cancelado».
    Ver una solución
    DELETE FROM detalle_pedidos WHERE pedido_id IN (SELECT id FROM pedidos WHERE estado = 'cancelado');
  4. 32
    Crear una tabla. Crea una tabla llamada marcas con las columnas id (entero, clave primaria) y nombre (texto).
    Ver una solución
    CREATE TABLE marcas (id INTEGER PRIMARY KEY, nombre TEXT);

Preguntas frecuentes

¿Sirven para preparar una prueba o entrevista?

Cubren lo que suele pedirse: filtros, agrupación, JOIN, subconsultas y cambios de datos.

¿Puedo escribirlo distinto a la solución?

Sí. Se compara el resultado, no el texto de la consulta.