📋 SQL — PLANTILLAS

// Consultas habituales listas para copiar y adaptar

BASES DE DATOS // 2026-02-12 — Iván Brihuega

Colección de plantillas SQL para las situaciones más frecuentes en examen y prácticas. Solo hay que sustituir los nombres de tabla y columna por los del enunciado.

⬡ LISTAR Y ORDENAR
// Básico
SELECT nombre FROM tabla; SELECT * FROM tabla;
// Ordenar y limitar
SELECT nombre, precio FROM tabla ORDER BY precio DESC LIMIT 3;
// Sin duplicados
SELECT DISTINCT nombre FROM tabla;
⬡ FILTRAR CON WHERE
// Comparaciones básicas
WHERE campo < 3000 WHERE campo BETWEEN 1000 AND 3000 WHERE campo IN ('Val1','Val2') WHERE campo IS NULL WHERE campo IS NOT NULL
// LIKE — buscar texto
WHERE campo LIKE '%texto%' ↑ contiene WHERE campo LIKE 'A%' ↑ empieza WHERE campo LIKE '%a' ↑ termina
// Combinar condiciones
WHERE cond1 AND cond2 -- las dos se tienen que cumplir WHERE cond1 OR cond2 -- basta con que se cumpla una
⬡ INSERT · UPDATE · DELETE
// INSERT — una fila y varias a la vez
INSERT INTO tabla VALUES (1, 'Valor', 99.99); INSERT INTO tabla (nombre, precio) VALUES ('Producto', 50); -- Varios registros a la vez: INSERT INTO tabla VALUES (1,'A',10), (2,'B',20), (3,'C',30);
// UPDATE con cálculo
UPDATE empleado SET salario = salario * 1.10 WHERE id_departamento = 1;
// DELETE con condición
DELETE FROM empleado WHERE salario < 2000;
⚠ Sin WHERE en UPDATE o DELETE → afecta TODAS las filas
⬡ GROUP BY Y HAVING
// Contar por grupo
SELECT id_departamento, COUNT(*) AS total FROM empleado GROUP BY id_departamento;
// Filtrar grupos con HAVING
SELECT id_departamento, AVG(salario) AS media FROM empleado GROUP BY id_departamento HAVING AVG(salario) > 3000;
// Departamentos con más de 1 empleado
SELECT id_departamento, COUNT(*) AS total FROM empleado GROUP BY id_departamento HAVING COUNT(*) > 1;
✓ WHERE filtra filas antes de agrupar · HAVING filtra grupos después
⬡ JOIN — COMBINAR TABLAS
// INNER JOIN
SELECT e.nombre, d.nombre AS depto FROM empleado e INNER JOIN departamento d ON e.id_departamento = d.id;
// LEFT JOIN — incluye sin pareja
SELECT d.nombre, COUNT(e.id) AS total FROM departamento d LEFT JOIN empleado e ON d.id = e.id_departamento GROUP BY d.id;
// JOIN + WHERE combinados
SELECT e.nombre, e.salario, d.nombre AS departamento FROM empleado e INNER JOIN departamento d ON e.id_departamento = d.id WHERE d.nombre IN ('Informática','Ventas') AND e.salario > 3000;
⬡ SUBCONSULTA
// Empleados con salario mayor que la media de un departamento
SELECT nombre, salario FROM empleado WHERE salario > ( SELECT AVG(e.salario) FROM empleado e JOIN departamento d ON e.id_departamento = d.id WHERE d.nombre = 'Informática' );
⬡ FECHAS
// Filtrar por fecha
-- Antes de una fecha: WHERE fecha_ingreso < '2025-01-01' -- Después de una fecha: WHERE fecha_ingreso > '2025-03-31' -- En un año concreto: WHERE YEAR(fecha_ingreso) = 2025
// Calcular días transcurridos
SELECT nombre, DATEDIFF(CURDATE(), fecha_ingreso) AS dias FROM empleado;
// Fechas + JOIN
SELECT e.nombre, DATEDIFF(CURDATE(), e.fecha_ingreso) AS dias FROM empleado e INNER JOIN departamento d ON e.id_departamento = d.id WHERE d.nombre IN ('Marketing','Recursos Humanos');
⬅ Volver a Artículos