1. Modificación de datos y relaciones: Introducción
Hemos visto como consultar datos. Ahora es momento de aprender a modificarlos: agregar, actualizar y eliminar registros. También exploraremos cómo las tablas se relacionan entre sí, un concepto fundamental en bases de datos relacionales.
Importante: Antes de modificar datos, siempre haz una copia de seguridad o trabaja en un entorno de pruebas.
2. INSERT - Agregar nuevos datos
INSERT
es como añadir una nueva fila a una hoja de cálculo: creas un registro completamente nuevo con datos específicos en cada columna.
¿Cuándo lo usas?
- Registrar un nuevo cliente
- Agregar una película al catálogo
- Crear un nuevo usuario en el sistema
Concepto clave: INSERT siempre crea registros nuevos, nunca modifica los existentes.
Sintaxis básica
INSERT INTO tabla (columna1, columna2, columna3)
VALUES (valor1, valor2, valor3);
Ejemplos prácticos
Agregar un nuevo actor:
INSERT INTO actor (first_name, last_name)
VALUES ('Ana', 'Rodríguez');
Agregar múltiples registros:
INSERT INTO actor (first_name, last_name)
VALUES
('Carlos', 'López'),
('María', 'García'),
('Pedro', 'Martín');
Insertar con todas las columnas:
INSERT INTO category (name)
VALUES ('Ciencia Ficción');
Buenas prácticas
- Especifica siempre las columnas explícitamente
- Las claves primarias auto-incrementales no necesitan valor
- Usa comillas simples para texto
- Respeta los tipos de datos de cada columna
3. UPDATE - Modificar datos existentes
UPDATE
modifica datos que ya existen en la tabla. Cambias información específica sin crear algo nuevo.
¿Cuándo lo usas?
- Cambiar el email de un cliente
- Actualizar el precio de una película
- Corregir un error en los datos
Diferencia clave con INSERT: UPDATE modifica registros existentes, INSERT crea nuevos.
¿Por qué WHERE es crítico?
Sin WHERE
, UPDATE afecta TODA la tabla. Es como decir "cambia todos los nombres a 'Juan'" en lugar de "cambia el nombre del cliente #5 a 'Juan'".
Sintaxis básica
UPDATE tabla
SET columna1 = nuevo_valor1, columna2 = nuevo_valor2
WHERE condicion;
Regla de oro: NUNCA sin WHERE
PELIGROSO (actualiza TODA la tabla):
UPDATE film SET rental_duration = 7;
CORRECTO (actualiza solo registros específicos):
UPDATE film
SET rental_duration = 7
WHERE title = 'ACADEMY DINOSAUR';
Ejemplos prácticos
Actualizar un campo:
UPDATE customer
SET email = 'nuevo@email.com'
WHERE customer_id = 1;
Actualizar múltiples campos:
UPDATE film
SET rental_rate = 3.99, rental_duration = 5
WHERE rating = 'G';
Actualizar con cálculos:
UPDATE film
SET rental_rate = rental_rate * 1.10
WHERE rental_rate < 2.00;
4. DELETE - Eliminar datos
DELETE
elimina registros completos de una tabla. No borra columnas específicas, sino filas enteras. Es como arrancar una página completa de un cuaderno.
¿Cuándo lo usas?
- Eliminar un cliente que canceló su cuenta
- Quitar una película descontinuada
- Limpiar datos de prueba
Concepto importante: DELETE quita el registro completo, no solo algunos campos.
¿Por qué es tan peligroso?
Sin WHERE
, DELETE elimina TODOS los registros de la tabla. Imagina que quieres borrar un archivo específico pero accidentalmente borras toda la carpeta.
La regla de oro: Siempre prueba primero con SELECT para ver qué registros vas a afectar.
Sintaxis básica
DELETE FROM tabla
WHERE condicion;
Extrema precaución
CATASTRÓFICO (borra TODA la tabla):
DELETE FROM actor;
SEGURO (borra solo registros específicos):
DELETE FROM actor
WHERE first_name = 'Ana' AND last_name = 'Rodríguez';
Ejemplos prácticos
Eliminar un registro específico:
DELETE FROM customer
WHERE customer_id = 999;
Eliminar con múltiples condiciones:
DELETE FROM film
WHERE rental_rate = 0 AND replacement_cost = 0;
Consejos de seguridad
- Siempre usa
WHERE
con condiciones específicas - Prueba primero con
SELECT
para ver qué registros afectarás - Haz backups antes de operaciones masivas
- Considera usar
UPDATE
para marcar como "eliminado" en lugar de borrar
5. Conceptos de relaciones entre tablas
¿Por qué no una sola tabla gigante?
Imagina que almacenas toda la información del videoclub en una sola tabla:
cliente_nombre | cliente_email | pelicula_titulo | pelicula_año | actor_nombre | actor_apellido |
---|---|---|---|---|---|
Juan Pérez | juan@email.com | Titanic | 1997 | Leonardo | DiCaprio |
Juan Pérez | juan@email.com | Titanic | 1997 | Kate | Winslet |
Problemas de este enfoque:
- Redundancia: El email de Juan se repite miles de veces
- Inconsistencias: Si Juan cambia su email, hay que actualizarlo en miles de lugares
- Desperdicio de espacio: Información duplicada consume memoria innecesariamente
La solución: Bases de datos relacionales
En lugar de una tabla gigante, dividimos la información en tablas especializadas que se relacionan entre sí:
- Tabla
customer
: Solo información de clientes - Tabla
film
: Solo información de películas - Tabla
actor
: Solo información de actores - Tabla
film_actor
: Conecta películas con actores
Ventaja: Cada dato se almacena una sola vez y se relaciona donde sea necesario.
Claves primarias (Primary Key)
¿Qué es una clave primaria?
Una clave primaria es como el número de DNI: identifica de forma única cada registro en una tabla.
Analogía: En una clase de estudiantes, puede haber dos "Juan García", pero cada uno tiene un número de matrícula único.
Características obligatorias:
- Única: No puede repetirse
- No NULL: Siempre debe tener un valor
- Inmutable: No debe cambiar una vez asignada
Ejemplo práctico:
-- En la tabla film, film_id es la clave primaria
SELECT film_id, title FROM film LIMIT 3;
-- Resultado:
-- 1 | ACADEMY DINOSAUR
-- 2 | ACE GOLDFINGER
-- 3 | ADAPTATION HOLES
Cada película tiene un film_id
único, aunque pudiera haber dos películas con el mismo título.
Claves foráneas (Foreign Key)
Una clave foránea es como una referencia bibliográfica: apunta a un registro específico en otra tabla.
Propósito: Establecer relaciones entre tablas sin duplicar información.
Ejemplo práctico en Sakila:
-- La tabla film_actor conecta películas con actores
SELECT film_id, actor_id FROM film_actor LIMIT 3;
-- 1 | 1 (Película 1 tiene al Actor 1)
-- 1 | 10 (Película 1 tiene al Actor 10)
-- 1 | 20 (Película 1 tiene al Actor 20)
Aquí:
film_id
es clave foránea que apunta afilm.film_id
actor_id
es clave foránea que apunta aactor.actor_id
Tipos de relaciones
1. Uno a Muchos (1:N) - La más común
Concepto: Un registro de la tabla A puede relacionarse con muchos registros de la tabla B, pero cada registro de B solo se relaciona con uno de A.
Analogía: Una madre puede tener varios hijos, pero cada hijo tiene solo una madre.
Ejemplo en Sakila:
- Un cliente puede tener muchos alquileres
- Cada alquiler pertenece a un solo cliente
-- Un cliente (ID=1) con múltiples alquileres
SELECT c.first_name, COUNT(r.rental_id) AS alquileres
FROM customer c
LEFT JOIN rental r ON c.customer_id = r.customer_id
WHERE c.customer_id = 1;
2. Muchos a Muchos (N:M) - Necesita tabla intermedia
Concepto: Un registro de la tabla A puede relacionarse con muchos de la tabla B, Y viceversa.
Analogía: Un actor puede aparecer en muchas películas, y una película puede tener muchos actores.
¿Por qué necesita tabla intermedia? No puedes poner una lista de actores en la tabla film
, ni una lista de películas en la tabla actor
. La solución es crear una tabla que conecte ambas:
film ←→ film_actor ←→ actor
Ejemplo en Sakila:
-- La película "ACADEMY DINOSAUR" tiene varios actores
SELECT f.title, a.first_name, a.last_name
FROM film f
JOIN film_actor fa ON f.film_id = fa.film_id
JOIN actor a ON fa.actor_id = a.actor_id
WHERE f.title = 'ACADEMY DINOSAUR';
6. JOIN básico - Unir tablas
Un JOIN combina información de diferentes tablas que están relacionadas.
¿Por qué necesitamos JOIN? Las tablas están separadas para evitar redundancia, pero cuando queremos ver información completa, necesitamos "unirlas" temporalmente.
¿Cómo funciona INNER JOIN?
INNER JOIN muestra solo registros que tienen correspondencia en ambas tablas.
Analogía: Es como una lista de invitados a una fiesta - solo aparecen las personas que están tanto en tu lista de amigos como en tu lista de direcciones.
Entendiendo la sintaxis
SELECT columnas_que_quiero
FROM tabla_principal alias1
JOIN tabla_secundaria alias2 ON alias1.clave_foranea = alias2.clave_primaria;
Desglose paso a paso:
FROM tabla_principal
: Empezamos desde una tabla baseJOIN tabla_secundaria
: Nos conectamos a otra tablaON condición
: Especificamos cómo se conectan (qué campos coinciden)SELECT
: Elegimos qué columnas queremos de ambas tablas
Sintaxis básica
SELECT t1.columna1, t2.columna2
FROM tabla1 t1
JOIN tabla2 t2 ON t1.clave_foranea = t2.clave_primaria;
Ejemplos prácticos
Unir clientes con sus alquileres:
SELECT c.first_name, c.last_name, r.rental_date
FROM customer c
JOIN rental r ON c.customer_id = r.customer_id
LIMIT 10;
Películas con su categoría:
SELECT f.title, c.name AS categoria
FROM film f
JOIN film_category fc ON f.film_id = fc.film_id
JOIN category c ON fc.category_id = c.category_id
LIMIT 10;
¿Por qué usar alias de tablas?
Los alias (c
, r
, f
, etc.) son abreviaciones que hacen el código más legible y son necesarios cuando hay columnas con el mismo nombre en diferentes tablas.
Sin alias (confuso y largo):
SELECT customer.first_name, rental.rental_date
FROM customer
JOIN rental ON customer.customer_id = rental.customer_id;
Con alias (claro y conciso):
SELECT c.first_name, r.rental_date
FROM customer c
JOIN rental r ON c.customer_id = r.customer_id;
¿Cuándo son obligatorios? Cuando las dos tablas tienen columnas con el mismo nombre:
-- Error: MySQL no sabe de qué tabla es customer_id
SELECT customer_id, rental_date FROM customer c JOIN rental r...
-- Correcto: Especificamos la tabla
SELECT c.customer_id, r.rental_date FROM customer c JOIN rental r...
Consultas de verificación
- Antes de cada UPDATE/DELETE, escribe primero un SELECT para verificar qué registros vas a afectar.
8. Buenas prácticas resumidas
Para modificación de datos:
- Siempre usa WHERE en UPDATE y DELETE
- Prueba con SELECT antes de modificar
- Haz backups regulares
- Usa transacciones para operaciones críticas
Para consultas:
- Usa alias para mayor claridad
- Especifica las columnas necesarias (evita SELECT *)
- Entiende las relaciones antes de hacer JOIN
Resumen
En esta lección has aprendido:
- A modificar datos con INSERT, UPDATE y DELETE de forma segura
- Los conceptos de claves primarias y foráneas
- Cómo las tablas se relacionan entre sí
- A unir datos de múltiples tablas con JOIN básico
- Buenas prácticas para evitar errores costosos
En la próxima lección exploraremos consultas más avanzadas: JOIN múltiples, funciones agregadas y subconsultas para análisis complejo de datos.