Saltar al contenido
sql.test.sql · devschool

Retos de SQL

80 preguntas ordenadas como el curso de SQL. Hazlas en orden o salta al tema que quieras repasar.

devschool $ 0 aciertos de 0 respondidas

¿Qué es SQL?

¿Te atascas? Repasa la lección ¿Qué es SQL?.

[SQL] ¿A qué sublenguaje de SQL pertenecen GRANT y REVOKE?

[SQL] En la tabla pedidos, ¿qué papel tiene la columna cliente_id?
CREATE TABLE pedidos (
  id INT PRIMARY KEY,
  cliente_id INT,
  fecha DATE,
  importe DECIMAL(10, 2),
  FOREIGN KEY (cliente_id) REFERENCES clientes(id)
);

SELECT

¿Te atascas? Repasa la lección SELECT.

[SQL] ¿Qué hace esta consulta?
SELECT * FROM clientes;

[SQL] Con la tabla clientes del curso, ¿cuántas filas devuelve esta consulta?
SELECT DISTINCT ciudad, edad >= 18 AS adulto
FROM clientes;

[SQL] En MySQL, ¿por qué esta consulta da error?
SELECT importe * 1.21 AS con_iva
FROM pedidos
WHERE con_iva > 50;

WHERE

¿Te atascas? Repasa la lección WHERE.

[SQL] ¿Qué palabra filtra las filas de una consulta?

[SQL] ¿Qué clientes devuelve la consulta?
SELECT nombre FROM clientes
WHERE ciudad = 'Santander' AND edad >= 18;

[SQL] ¿Qué comprueba mejor si un campo está vacío (sin valor)?

[SQL] Con la tabla clientes del curso, ¿qué nombres devuelve esta consulta?
SELECT nombre FROM clientes
WHERE ciudad = 'Bilbao' OR ciudad = 'Madrid' AND edad >= 25;

[SQL] ¿Qué patrón encuentra el código 'VERANO_10' pero no 'VERANOX10'?

NULL

¿Te atascas? Repasa la lección NULL.

[SQL] La tabla notas tiene 4 filas: 8, NULL, 4 y NULL en la columna nota. ¿Qué devuelve esta consulta?
SELECT COUNT(*), COUNT(nota), AVG(nota)
FROM notas;

[SQL] ¿Qué devuelve esta consulta?
SELECT nombre FROM alumnos
WHERE email = NULL;

[SQL] ¿Qué devuelve COALESCE(NULL, NULL, 'b', 'c')?

[SQL] La columna nota vale 8, NULL, 4 y NULL en cuatro filas. ¿Cuántas filas devuelve WHERE nota <> 8?
SELECT id FROM notas
WHERE nota <> 8;

ORDER BY y LIMIT

¿Te atascas? Repasa la lección ORDER BY y LIMIT.

[SQL] ¿Cómo se ordenan los productos del más caro al más barato?

[SQL] Una tienda muestra 20 productos por página. ¿Qué consulta devuelve la página 3?

[SQL] Con la tabla clientes del curso, ¿quién sale primero?
SELECT nombre, ciudad, edad
FROM clientes
ORDER BY ciudad DESC, edad;

Funciones

¿Te atascas? Repasa la lección Funciones.

[SQL] ¿Qué devuelve esta consulta?
SELECT SUBSTRING('Santander', 4, 3);

[SQL] En PostgreSQL, la tabla notas tiene las columnas enteras aprobados = 18 y total = 24. ¿Qué devuelve aprobados / total * 100?

[SQL] En MySQL con utf8mb4, ¿qué devuelve esta consulta?
SELECT LENGTH('Díaz'), CHAR_LENGTH('Díaz');

[SQL] La columna fecha de pedidos tiene un índice. ¿Qué filtro de pedidos de septiembre de 2026 puede aprovecharlo?

CASE

¿Te atascas? Repasa la lección CASE.

[SQL] Ana García tiene 34 años. ¿Qué devuelve esta consulta en la columna t?
SELECT nombre,
       CASE
         WHEN edad >= 18 THEN 'Adulto'
         WHEN edad >= 30 THEN 'Treintañero'
         ELSE 'Menor'
       END AS t
FROM clientes
WHERE id = 1;

[SQL] El pedido 3 tiene un importe de 12.99. ¿Qué devuelve la columna tipo?
SELECT id,
       CASE
         WHEN importe > 100 THEN 'Grande'
         WHEN importe > 50 THEN 'Mediano'
       END AS tipo
FROM pedidos
WHERE id = 3;

[SQL] Con la tabla clientes del curso (dos clientes de Madrid), ¿qué devuelven las columnas a y b?
SELECT SUM(CASE WHEN ciudad = 'Madrid' THEN 1 ELSE 0 END) AS a,
       COUNT(CASE WHEN ciudad = 'Madrid' THEN 0 END) AS b
FROM clientes;

[SQL] ¿Qué pasa con la Mochila (categoría 'Montaña') al ejecutar este UPDATE en una tabla donde precio permite NULL?
UPDATE productos
SET precio = CASE categoria
               WHEN 'Escalada' THEN precio * 0.90
               WHEN 'Camping'  THEN precio * 0.85
             END;

COUNT, SUM y AVG

¿Te atascas? Repasa la lección COUNT, SUM y AVG.

[SQL] ¿Qué devuelve esta consulta?
SELECT COUNT(*) FROM pedidos;

[SQL] Con la tabla pedidos del curso (5 pedidos, Ana tiene dos), ¿qué devuelve esta consulta?
SELECT COUNT(cliente_id), COUNT(DISTINCT cliente_id)
FROM pedidos;

[SQL] Ningún pedido supera los 1000 €. ¿Qué devuelve esta consulta?
SELECT COUNT(*), SUM(importe)
FROM pedidos
WHERE importe > 1000;

GROUP BY

¿Te atascas? Repasa la lección GROUP BY.

[SQL] ¿Qué consulta devuelve las ciudades cuya edad media de clientes es mayor que 30?

[SQL] Ana (cliente 1) tiene dos pedidos: 45.00 y 12.99. El resto de clientes tiene uno. ¿Qué devuelve esta consulta?
SELECT cliente_id, SUM(importe)
FROM pedidos
WHERE importe > 20
GROUP BY cliente_id
HAVING COUNT(*) > 1;

JOIN

¿Te atascas? Repasa la lección JOIN.

[SQL] ¿Qué devuelve un INNER JOIN entre clientes y pedidos?

[SQL] Pablo Díaz (cliente 4) no tiene ningún pedido. ¿Qué valor sale en la columna n?
SELECT c.nombre, COUNT(*) AS n
FROM clientes c
LEFT JOIN pedidos p ON p.cliente_id = c.id
WHERE c.id = 4
GROUP BY c.id, c.nombre;

[SQL] Hay 5 clientes y solo 2 pedidos superan los 50 €. ¿Cuántas filas devuelve esta consulta?
SELECT c.nombre, p.importe
FROM clientes c
LEFT JOIN pedidos p ON p.cliente_id = c.id
WHERE p.importe > 50;

Más JOIN

¿Te atascas? Repasa la lección Más JOIN.

[SQL] ¿Cuántas filas devuelve esta consulta si hay 3 tallas y 4 colores?
SELECT t.talla, c.color
FROM tallas t
CROSS JOIN colores c;

[SQL] Con las tablas del curso, ¿qué devuelve esta consulta?
SELECT c.nombre, p.importe
FROM clientes c
LEFT JOIN pedidos p ON p.cliente_id = c.id
WHERE p.importe > 50;

[SQL] MySQL no tiene FULL OUTER JOIN. ¿Cómo se consigue el mismo resultado?

[SQL] ¿Qué es imprescindible para hacer un self join (unir empleados con sus jefes en la misma tabla)?

Subconsultas

¿Te atascas? Repasa la lección Subconsultas.

[SQL] La tabla devoluciones tiene los cliente_id 2 y NULL. ¿Qué devuelve esta consulta?
SELECT nombre
FROM clientes
WHERE id NOT IN (SELECT cliente_id FROM devoluciones);

[SQL] ¿Por qué WHERE importe > AVG(importe) da error?

[SQL] Con las tablas del curso, ¿qué devuelve esta consulta?
SELECT COUNT(*)
FROM (SELECT cliente_id FROM pedidos GROUP BY cliente_id) AS t;

[SQL] ¿Qué caracteriza a una subconsulta correlacionada?

UNION

¿Te atascas? Repasa la lección UNION.

[SQL] Con las tablas del curso, ¿cuántas filas devuelve esta consulta?
SELECT ciudad FROM clientes
UNION ALL
SELECT ciudad FROM clientes WHERE edad > 30;

[SQL] ¿Cómo se llama la columna del resultado?
SELECT nombre AS contacto FROM clientes
UNION
SELECT nombre AS proveedor FROM proveedores;

[SQL] Los clientes son Ana, Luis, Marta, Pablo y Eva. En newsletter están Ana, Pablo e Irene. ¿Qué devuelve esta consulta?
SELECT nombre FROM newsletter
EXCEPT
SELECT nombre FROM clientes;

[SQL] Quieres ordenar por nombre el resultado de un UNION. ¿Dónde va el ORDER BY?

INSERT, UPDATE, DELETE

¿Te atascas? Repasa la lección INSERT, UPDATE, DELETE.

[SQL] ¿Qué pasa si ejecutas esto?
UPDATE productos SET precio = 0;

[SQL] La columna stock está definida como INT NOT NULL DEFAULT 0. ¿Qué ocurre al ejecutar este INSERT?
INSERT INTO productos (id, nombre, precio, stock)
VALUES (5, 'Cuerda', 139.00, NULL);

[SQL] En Madrid están Pablo (sin pedidos) y Eva (con un pedido). pedidos.cliente_id es una clave foránea sin ON DELETE CASCADE. ¿Qué pasa?
DELETE FROM clientes
WHERE ciudad = 'Madrid';

CREATE TABLE

¿Te atascas? Repasa la lección CREATE TABLE.

[SQL] ¿Qué tipo es el más adecuado para el precio de un producto en MySQL?

[SQL] ¿Qué se guarda al insertar el código postal '09001' en una columna INT?
CREATE TABLE direcciones (cp INT);
INSERT INTO direcciones VALUES ('09001');
SELECT cp FROM direcciones;

[SQL] ¿Qué tipo encaja mejor para guardar un DNI español (8 cifras y una letra)?

[SQL] ¿Qué copia CREATE TABLE copia AS SELECT * FROM libros?

Restricciones

¿Te atascas? Repasa la lección Restricciones.

[SQL] El producto 1 tiene stock 0. ¿Qué pasa al ejecutar el UPDATE?
CREATE TABLE productos (
  id INT PRIMARY KEY,
  nombre VARCHAR(100) NOT NULL,
  stock INT NOT NULL DEFAULT 0 CHECK (stock >= 0)
);
INSERT INTO productos (id, nombre) VALUES (1, 'Arnés');
UPDATE productos SET stock = stock - 1 WHERE id = 1;

[SQL] lineas_pedido tiene 3 filas: una del pedido 1 y dos del pedido 3. Su clave foránea es FOREIGN KEY (pedido_id) REFERENCES pedidos(id) ON DELETE CASCADE. ¿Cuántas filas quedan tras el DELETE?
DELETE FROM pedidos WHERE id = 3;
SELECT COUNT(*) FROM lineas_pedido;

[SQL] ¿En qué se diferencia UNIQUE de PRIMARY KEY?

[SQL] Creas tablas con claves foráneas en SQLite y puedes insertar un pedido de un cliente que no existe sin ningún error. ¿Por qué?

ALTER y DROP

¿Te atascas? Repasa la lección ALTER y DROP.

[SQL] En MySQL, la columna titulo es VARCHAR(100) NOT NULL. ¿Qué pasa tras ejecutar esto?
ALTER TABLE libros MODIFY COLUMN titulo VARCHAR(200);

[SQL] Quieres borrar solo los pedidos anteriores a 2026 y dejar el resto. ¿Qué usas?

[SQL] La tabla libros tiene 2 filas. ¿Qué valor de stock tienen después de este ALTER TABLE?
ALTER TABLE libros ADD COLUMN stock INT NOT NULL DEFAULT 1;

[SQL] En MySQL ejecutas BEGIN; DROP TABLE pruebas; ROLLBACK;. ¿Qué pasa con la tabla?

Vistas

¿Te atascas? Repasa la lección Vistas.

[SQL] Con los datos del curso (3 pedidos de más de 40 €), ¿qué devuelve la última consulta?
CREATE VIEW caros AS
SELECT id, importe FROM pedidos WHERE importe > 40;

INSERT INTO pedidos VALUES (6, 2, '2026-09-20', 90.00);

SELECT COUNT(*) FROM caros;

[SQL] ¿Cuál de estas vistas NO se puede actualizar con UPDATE en MySQL?

[SQL] ¿Qué ocurre al ejecutar DROP VIEW pedidos_con_cliente?

[SQL] Tienes una vista con WHERE ciudad = 'Santander' creada con WITH CHECK OPTION. ¿Qué pasa si insertas a través de ella un cliente de Madrid?

Índices

¿Te atascas? Repasa la lección Índices.

[SQL] Existe el índice (fecha, importe) sobre pedidos. ¿Qué consulta NO puede aprovecharlo para filtrar?
CREATE INDEX idx_pedidos_fecha_importe ON pedidos (fecha, importe);

[SQL] ¿Qué inconveniente tiene crear un índice en cada columna de una tabla?

[SQL] Hay un índice sobre clientes(nombre). ¿En qué consulta es MENOS probable que se use?

[SQL] En SQLite, EXPLAIN QUERY PLAN muestra 'SCAN pedidos'. ¿Qué significa?

Transacciones

¿Te atascas? Repasa la lección Transacciones.

[SQL] ¿Qué saldo muestra la última consulta?
-- La cuenta 1 empieza con 100.00
BEGIN;
UPDATE cuentas SET saldo = saldo - 20 WHERE id = 1;
SAVEPOINT s1;
UPDATE cuentas SET saldo = saldo - 50 WHERE id = 1;
ROLLBACK TO SAVEPOINT s1;
COMMIT;

SELECT saldo FROM cuentas WHERE id = 1;

[SQL] La propiedad ACID que garantiza que una transferencia no se quede a medias (dinero restado pero no sumado) es…

[SQL] ¿Cuál es el nivel de aislamiento por defecto de MySQL con InnoDB?

[SQL] En MySQL, dentro de una transacción ejecutas UPDATE, luego DROP TABLE temporal_pruebas y después ROLLBACK. ¿Qué ocurre?

Diseño y normalización

¿Te atascas? Repasa la lección Diseño y normalización.

[SQL] Un alumno cursa muchas asignaturas y cada asignatura tiene muchos alumnos. ¿Cómo se representa en tablas?

[SQL] ¿Qué forma normal incumple esta tabla?
| alumno_id | nombre     | telefonos              |
| 1         | Ana García | 600111222, 600333444   |

[SQL] En la tabla alumnos(id, nombre, grupo, tutor), el tutor depende del grupo y no del alumno. ¿Qué forma normal se incumple?

[SQL] ¿Dónde va la clave foránea en una relación 1:N entre clientes y pedidos?

Usuarios y permisos

¿Te atascas? Repasa la lección Usuarios y permisos.

[SQL] ¿Qué puede hacer Ana después de estas instrucciones?
CREATE USER 'ana'@'localhost' IDENTIFIED BY 'Cl4ve_Segura_2026';
GRANT SELECT, INSERT, UPDATE ON tienda.* TO 'ana'@'localhost';
REVOKE UPDATE ON tienda.* FROM 'ana'@'localhost';

[SQL] En MySQL, ¿qué relación hay entre 'ana'@'localhost' y 'ana'@'%'?

[SQL] ¿Qué permisos debería tener el usuario con el que se conecta una aplicación web de tienda?

[SQL] Asignas un rol a un usuario en MySQL 8 con GRANT 'lectura_tienda' TO 'luis'@'localhost', pero Luis dice que no puede consultar nada. ¿Qué falta lo más probable?