Apuntes DAM

Chuleta de Bases de Datos

SQL de referencia: crear tablas, consultar, modificar, programar y normalizar.

Ponte a prueba con un simulacro

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 Avanzadas

JOIN

INNER JOINSolo las filas que coinciden en las dos tablas
LEFT JOINTodas las de la izquierda; NULL si no hay pareja
RIGHT JOINTodas las de la derecha
FULL OUTER JOINTodas las de ambas (no en MySQL: UNION de LEFT y RIGHT)
CROSS JOINProducto cartesiano
LEFT JOIN … WHERE b.id IS NULLFilas de A sin pareja en B
Tema: Consultas SQL Avanzadas

Funciones útiles

COUNT(*) · COUNT(col)Filas · valores no nulos
SUM, AVG, MIN, MAXAgregados (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, SUBSTRINGTexto
CASE WHEN … THEN … ELSE … ENDCondicional
col LIKE 'A%' · BETWEEN · IN (…)Patrón · rango · lista
Tema: Consultas SQL Avanzadas

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 SQL

Procedimientos 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:NLa clave foránea va en el lado N
N:MTabla intermedia con las dos claves foráneas
1FNValores atómicos, sin grupos repetidos
2FN1FN y cada atributo depende de toda la clave
3FN2FN y sin dependencias entre atributos no clave
Entidad débilSu clave incluye la de la entidad fuerte
Tema: Modelo Relacional

MongoDB

db.productos.find({ precio: { $gt: 20 }, categoria: "Audio" }, { nombre: 1 })db.productos.updateOne({ _id: id }, { $set: { stock: 5 } })db.pedidos.aggregate([  { $match: { estado: "enviado" } },  { $group: { _id: "$cliente", total: { $sum: "$importe" } } },  { $sort: { total: -1 } }])
Tema: NoSQL

Chuletas de otras asignaturas