🗄️ SQL — BASES DE DATOS

// DDL · DML · DCL · SELECT · JOINs · Funciones · Trucos de examen

BASES DE DATOS // 2026-03-09 — Iván Brihuega

Resumen de los comandos SQL más importantes para las prácticas y exámenes de ASIR. Organizado por bloques: definición de estructuras (DDL), manipulación de datos (DML), control de acceso (DCL), consultas SELECT, JOINs y funciones.

⬡ DDL — DATA DEFINITION LANGUAGE

Crear, modificar y eliminar estructuras de la base de datos.

// Base de datos
DROP DATABASE IF EXISTS mi_bd; CREATE DATABASE mi_bd CHARACTER SET utf8mb4; USE mi_bd;
// Crear tabla con clave foránea
CREATE TABLE empleado ( id INT PRIMARY KEY AUTO_INCREMENT, nombre VARCHAR(50) NOT NULL, salario DECIMAL(8,2), id_dep INT, FOREIGN KEY (id_dep) REFERENCES departamento(id) );
// Modificar tabla
ALTER TABLE t ADD col TIPO; ALTER TABLE t MODIFY col NUEVO_TIPO; ALTER TABLE t DROP COLUMN col; DROP TABLE t; TRUNCATE TABLE t; -- vacía sin borrar la estructura
⬡ DML — DATA MANIPULATION LANGUAGE

Insertar, actualizar y eliminar datos.

// INSERT
INSERT INTO empleado VALUES (1, 'Ana', 2800, 2); -- Varios a la vez: INSERT INTO empleado (nombre, salario) VALUES ('Luis', 3200), ('Marta', 2900);
// UPDATE — siempre con WHERE
UPDATE empleado SET salario = 3000 WHERE id = 1;
// DELETE — siempre con WHERE
DELETE FROM empleado WHERE id = 1;
⚠ Sin WHERE en UPDATE o DELETE → afecta TODAS las filas
⬡ DCL — DATA CONTROL LANGUAGE

Gestión de usuarios y permisos.

// Usuarios
CREATE USER 'user'@'localhost' IDENTIFIED BY 'pass'; DROP USER 'user'@'localhost';
// Permisos
GRANT SELECT, INSERT ON bd.* TO 'user'@'localhost'; REVOKE INSERT ON bd.* FROM 'user'@'localhost'; FLUSH PRIVILEGES;
⬡ SELECT — CONSULTAS

Orden obligatorio de las cláusulas:

SELECT → FROM → [JOIN] → [WHERE] → [GROUP BY] → [HAVING] → [ORDER BY] → [LIMIT]
// Básico y ordenar
SELECT nombre, salario FROM empleado ORDER BY salario DESC LIMIT 5;
// WHERE — condiciones
WHERE salario BETWEEN 1000 AND 3000 WHERE nombre IN ('Ana','Luis') WHERE nombre LIKE 'A%' ↑ empieza por A WHERE nombre LIKE '%a' ↑ termina en a WHERE campo IS NULL
// GROUP BY y HAVING
SELECT id_dep, COUNT(*) AS total, AVG(salario) AS media FROM empleado GROUP BY id_dep HAVING AVG(salario) > 3000;
// Subconsulta
SELECT nombre, salario FROM empleado WHERE salario > ( SELECT AVG(salario) FROM empleado );
⬡ JOINs — COMBINAR TABLAS
// INNER JOIN — solo filas con pareja
SELECT e.nombre, d.nombre AS depto FROM empleado e INNER JOIN departamento d ON e.id_dep = d.id;
// LEFT JOIN — todos los de la izquierda
SELECT d.nombre, COUNT(e.id) AS total FROM departamento d LEFT JOIN empleado e ON d.id = e.id_dep GROUP BY d.id;
✓ LEFT JOIN para incluir departamentos que no tienen empleados
// JOIN múltiple (3 tablas)
SELECT e.nombre, d.nombre, p.nombre FROM empleado e JOIN departamento d ON e.id_dep = d.id JOIN proyecto p ON e.id_proy = p.id;
JOINCuándo usarlo
INNER JOINSolo filas con pareja en ambas tablas
LEFT JOINTodos los de la tabla izquierda, aunque no tengan pareja
RIGHT JOINTodos los de la tabla derecha, aunque no tengan pareja
⬡ WHERE vs HAVING
WHEREHAVING
CuándoAntes de agruparDespués de GROUP BY
FiltraFilas individualesGrupos / agregados
FuncionesNo acepta COUNT, AVG…Sí acepta COUNT, AVG…
✓ COUNT(*) > 1 → HAVING  |  ✓ salario < 3000 → WHERE
✗ WHERE AVG(sal) > 3000 → ERROR  |  ✓ HAVING AVG(sal) > 3000 → OK
⬡ FUNCIONES
// Funciones de grupo
FunciónQué hace
COUNT(*)Cuenta filas
SUM(col)Suma
AVG(col)Media aritmética
MAX(col)Máximo
MIN(col)Mínimo
ROUND(n,2)Redondea 2 decimales
// Funciones de texto
FunciónEjemplo
UPPER(c)'hola' → 'HOLA'
LOWER(c)'HOLA' → 'hola'
LENGTH(c)'Hola' → 4
CONCAT(a,b)'Ho'+'la' → 'Hola'
TRIM(c)' Hola ' → 'Hola'
SUBSTR(c,2,3)'Hola' → 'ola'
// Funciones de fecha
FunciónResultado
CURDATE()Fecha de hoy
NOW()Fecha y hora actuales
YEAR(fecha)YEAR('2025-06-10') → 2025
MONTH(fecha)MONTH('2025-06-10') → 6
DATEDIFF(f1,f2)Días entre dos fechas
// Ejemplo con fechas
SELECT nombre, DATEDIFF(CURDATE(), fecha_ingreso) AS dias FROM empleado; -- Contratados en 2025: SELECT * FROM empleado WHERE YEAR(fecha_ingreso) = 2025;
⬡ TRUCOS CLAVE DE EXAMEN
SituaciónSolución
Incluir filas sin parejaLEFT JOIN
Filtrar resultado agrupadoHAVING
Comparar con NULLIS NULL
Sin duplicadosSELECT DISTINCT
Primeros N resultadosORDER BY x DESC LIMIT N
Comparar con mediaWHERE x > (SELECT AVG(x) FROM …)
Varios valores posiblesIN ('A', 'B')
Rango de valoresBETWEEN min AND max
⬡ RESUMEN: TIPOS DE SENTENCIAS
SentenciasTipo
CREATE / ALTER / DROP / TRUNCATEDDL
SELECT / INSERT / UPDATE / DELETEDML
GRANT / REVOKE / CREATE USERDCL
⬅ Volver a Artículos