Chuleta de Bases de Datos
SQL de referencia: crear tablas, consultar, modificar, programar y normalizar.
Crear tablas (DDL)
CREATE TABLE pedidos ( id INT PRIMARY KEY AUTO_INCREMENT, cliente_id INT NOT NULL, fecha DATE DEFAULT (CURRENT_DATE), estado VARCHAR(20) CHECK (estado IN ('pendiente','enviado')), total DECIMAL(10,2) CHECK (total >= 0), FOREIGN KEY (cliente_id) REFERENCES clientes(id) ON DELETE RESTRICT ON UPDATE CASCADE);ALTER TABLE pedidos ADD COLUMN notas TEXT;CREATE INDEX idx_pedidos_fecha ON pedidos(fecha);CREATE VIEW v_pendientes AS SELECT * FROM pedidos WHERE estado = 'pendiente';Tema: SQL: Definición de Datos (DDL) Orden de una consulta
SELECT c.ciudad, COUNT(*) AS pedidos, SUM(p.total) AS totalFROM pedidos pJOIN clientes c ON c.id = p.cliente_idWHERE p.fecha >= '2025-01-01' -- filtra filasGROUP BY c.ciudadHAVING COUNT(*) > 5 -- filtra gruposORDER BY total DESCLIMIT 10;Se ejecuta en este orden: FROM/JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT.
Tema: Consultas SQL AvanzadasJOIN
| INNER JOIN | Solo las filas que coinciden en las dos tablas |
|---|---|
| LEFT JOIN | Todas las de la izquierda; NULL si no hay pareja |
| RIGHT JOIN | Todas las de la derecha |
| FULL OUTER JOIN | Todas las de ambas (no en MySQL: UNION de LEFT y RIGHT) |
| CROSS JOIN | Producto cartesiano |
| LEFT JOIN … WHERE b.id IS NULL | Filas de A sin pareja en B |
Funciones útiles
| COUNT(*) · COUNT(col) | Filas · valores no nulos |
|---|---|
| SUM, AVG, MIN, MAX | Agregados (ignoran NULL) |
| COALESCE(x, 0) | Primer valor no nulo |
| ROUND(x, 2) | Redondear |
| CONCAT(a, ' ', b) | Unir textos (|| en PostgreSQL y SQLite) |
| UPPER, LOWER, TRIM, SUBSTRING | Texto |
| CASE WHEN … THEN … ELSE … END | Condicional |
| col LIKE 'A%' · BETWEEN · IN (…) | Patrón · rango · lista |
Subconsultas y ventanas
-- Productos más caros que la mediaSELECT nombre FROM productosWHERE precio > (SELECT AVG(precio) FROM productos); -- Clientes con algún pedidoSELECT nombre FROM clientes cWHERE EXISTS (SELECT 1 FROM pedidos p WHERE p.cliente_id = c.id); -- Ranking por categoríaSELECT nombre, categoria, RANK() OVER (PARTITION BY categoria ORDER BY precio DESC) AS puestoFROM productos;Tema: Consultas SQL Avanzadas Modificar datos (DML)
INSERT INTO clientes (nombre, ciudad) VALUES ('Ana', 'Sevilla');UPDATE productos SET precio = precio * 1.10 WHERE categoria = 'Audio';DELETE FROM pedidos WHERE estado = 'cancelado'; START TRANSACTION; UPDATE cuentas SET saldo = saldo - 100 WHERE id = 1; UPDATE cuentas SET saldo = saldo + 100 WHERE id = 2;COMMIT; -- o ROLLBACK;Antes de un UPDATE o DELETE, ejecuta un SELECT con el mismo WHERE.
Tema: Modificación de Datos en SQLProcedimientos y disparadores (MySQL)
DELIMITER //CREATE PROCEDURE subir_precios(IN pct DECIMAL(5,2))BEGIN UPDATE productos SET precio = precio * (1 + pct / 100);END //CREATE TRIGGER no_negativo BEFORE UPDATE ON cuentasFOR EACH ROWBEGIN IF NEW.saldo < 0 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Saldo negativo'; END IF;END //DELIMITER ;CALL subir_precios(5);Tema: Programación en Bases de Datos Diseño y normalización
| 1:N | La clave foránea va en el lado N |
|---|---|
| N:M | Tabla intermedia con las dos claves foráneas |
| 1FN | Valores atómicos, sin grupos repetidos |
| 2FN | 1FN y cada atributo depende de toda la clave |
| 3FN | 2FN y sin dependencias entre atributos no clave |
| Entidad débil | Su clave incluye la de la entidad fuerte |