🗄️ SQL — BASES DE DATOS
// DDL · DML · DCL · SELECT · JOINs · Funciones · Trucos de examen
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 datosDROP 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.
// INSERTINSERT 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
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;
| JOIN | Cuándo usarlo |
|---|---|
| INNER JOIN | Solo filas con pareja en ambas tablas |
| LEFT JOIN | Todos los de la tabla izquierda, aunque no tengan pareja |
| RIGHT JOIN | Todos los de la tabla derecha, aunque no tengan pareja |
⬡ WHERE vs HAVING
| WHERE | HAVING | |
|---|---|---|
| Cuándo | Antes de agrupar | Después de GROUP BY |
| Filtra | Filas individuales | Grupos / agregados |
| Funciones | No 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ón | Qué 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ón | Ejemplo |
|---|---|
| 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' |
| Función | Resultado |
|---|---|
| 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 |
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ón | Solución |
|---|---|
| Incluir filas sin pareja | LEFT JOIN |
| Filtrar resultado agrupado | HAVING |
| Comparar con NULL | IS NULL |
| Sin duplicados | SELECT DISTINCT |
| Primeros N resultados | ORDER BY x DESC LIMIT N |
| Comparar con media | WHERE x > (SELECT AVG(x) FROM …) |
| Varios valores posibles | IN ('A', 'B') |
| Rango de valores | BETWEEN min AND max |
⬡ RESUMEN: TIPOS DE SENTENCIAS
| Sentencias | Tipo |
|---|---|
| CREATE / ALTER / DROP / TRUNCATE | DDL |
| SELECT / INSERT / UPDATE / DELETE | DML |
| GRANT / REVOKE / CREATE USER | DCL |