Apuntes mysql

“SET PASSWORD has no significance for user 'root'@'localhost'”

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

  1. Siempre usa WHERE con condiciones específicas
  2. Prueba primero con SELECT para ver qué registros afectarás
  3. Haz backups antes de operaciones masivas
  4. 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 a film.film_id
  • actor_id es clave foránea que apunta a actor.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:

  1. FROM tabla_principal: Empezamos desde una tabla base
  2. JOIN tabla_secundaria: Nos conectamos a otra tabla
  3. ON condición: Especificamos cómo se conectan (qué campos coinciden)
  4. 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

  1. 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.

TOP