====== 03 - SQL: DML y consultas ======
El **DML** (*Data Manipulation Language*) opera sobre los datos: insertar, consultar, modificar y eliminar filas.
===== 1. INSERT =====
INSERT INTO publisher (name) VALUES ('Anaya');
INSERT INTO book (title, price, publisher_id)
VALUES ('Código limpio', 29.95, 1);
-- varias filas de una vez
INSERT INTO book (title, price, publisher_id)
VALUES ('Clean Code', 34.50, 1), ('Refactoring', 31.00, 1);
Las columnas autogeneradas (''id'') y las que tienen ''DEFAULT'' pueden omitirse.
===== 2. SELECT =====
SELECT id, title, price FROM book;
SELECT * FROM book WHERE price > 30;
SELECT title, price
FROM book
WHERE publisher_id = 1 AND price <= 35
ORDER BY price DESC
LIMIT 10;
^ Cláusula ^ Función ^
| ''WHERE'' | Filtra filas |
| ''ORDER BY'' | Ordena el resultado (''ASC''/''DESC'') |
| ''LIMIT'' | Limita el número de filas |
| ''DISTINCT'' | Elimina duplicados |
Operadores de comparación: ''='', ''<>'', ''<'', ''>='', ''BETWEEN'', ''IN'', ''LIKE'' (con ''%'' como comodín), ''IS NULL'' para comparar con ''NULL''.
===== 3. Agregación =====
SELECT COUNT(*) FROM book WHERE publisher_id = 1;
SELECT publisher_id, COUNT(*) AS total, AVG(price) AS average_price
FROM book
GROUP BY publisher_id
HAVING COUNT(*) > 5;
^ Función ^ Devuelve ^
| ''COUNT'' | Número de filas |
| ''SUM'' / ''AVG'' | Suma y media |
| ''MIN'' / ''MAX'' | Mínimo y máximo |
''WHERE'' filtra filas **antes** de agrupar; ''HAVING'' filtra los **grupos** ya agregados.
===== 4. JOIN =====
Un ''JOIN'' combina filas de dos tablas por sus claves:
SELECT book.title, publisher.name AS publisher
FROM book
INNER JOIN publisher ON book.publisher_id = publisher.id;
-- libros y su autor, atravesando la tabla de unión
SELECT book.title, author.name AS author
FROM book
INNER JOIN book_author ON book_author.book_id = book.id
INNER JOIN author ON author.id = book_author.author_id;
^ Join ^ Devuelve ^
| ''INNER JOIN'' | Solo las filas con correspondencia en ambas tablas |
| ''LEFT JOIN'' | Todas las de la izquierda; ''NULL'' si no hay correspondencia |
-- editoriales sin libros (LEFT JOIN + IS NULL)
SELECT publisher.name
FROM publisher
LEFT JOIN book ON book.publisher_id = publisher.id
WHERE book.id IS NULL;
===== 5. UPDATE y DELETE =====
UPDATE book SET price = 24.95 WHERE id = 42;
DELETE FROM book WHERE id = 42;
''UPDATE'' y ''DELETE'' sin ''WHERE'' afectan a todas las filas. Ejecuta primero el ''SELECT'' con el mismo ''WHERE'' para comprobar qué filas van a cambiar.