MÓDULO 3 · CLASE 1
Claves y JOINs: cómo se relacionan las tablas
Clase de lectura. Claves primarias y foráneas, tipos de relación y los distintos JOIN para combinar tablas en una sola consulta.
Idea clave
En una base relacional los datos están repartidos en varias tablas. Un JOIN las vuelve a juntar en una consulta usando las columnas que las relacionan: la clave primaria de una tabla y la clave foránea de la otra.Base de práctica: tablas_libro
Todos los ejemplos usan la base tablas_libro (30 tablas: alumnos, cursos, profesores, empleados, mascotas, artículos, quinielas…). Si todavía no la cargaste: descargátablasLibro.sql, creá la base con CREATE DATABASE tablas_libro;, seleccionala con USE tablas_libro; y ejecutá el script en Workbench (File > Open SQL Script).1. Clave primaria y clave foránea
- Tabla padre: tiene la clave primaria (
profesores.ID_PROFE). - Tabla hija: tiene la clave foránea que apunta al padre (
cursos.ID_PROFE).
-- Así están definidas en tablasLibro.sql
CREATE TABLE cursos (
ID_CURSO INT NOT NULL,
TITULO VARCHAR(50) NOT NULL,
ID_PROFE INT DEFAULT NULL,
PRIMARY KEY (ID_CURSO)
);
ALTER TABLE cursos
ADD CONSTRAINT cursos_id_profe_fk
FOREIGN KEY (ID_PROFE) REFERENCES profesores (ID_PROFE);La clave foránea garantiza la integridad referencial: no se puede asignar a un curso un profesor que no existe. Las acciones ON DELETE / ON UPDATE definen qué pasa con las filas hijas cuando cambia el padre:
| Acción | Qué hace al borrar/actualizar el padre |
|---|---|
RESTRICT / NO ACTION | Lo impide si hay filas hijas (es lo predeterminado). Por eso no podés borrar a Rosa mientras dicte cursos. |
CASCADE | Borra o actualiza también las filas hijas |
SET NULL | Deja la clave foránea en NULL (la columna no puede ser NOT NULL) |
DELETE FROM profesores WHERE ID_PROFE = 3;
-- Error 1451: Cannot delete or update a parent row: a foreign key constraint fails
-- (Rosa dicta «Programación PHP» y «Modelos abstracto de datos»)Requisitos en MySQL
Las dos tablas deben usar el motor InnoDB (el predeterminado), las columnas deben tener tipos compatibles y la columna referenciada debe estar indexada (la clave primaria ya lo está).2. Tipos de relación
| Relación | Ejemplo en tablas_libro | Cómo se implementa |
|---|---|---|
| Uno a muchos (1:N) | Un profesor dicta varios cursos | Clave foránea en la tabla del lado «muchos» (cursos.ID_PROFE) |
| Muchos a muchos (N:M) | Alumnos y cursos | Tabla intermedia (alumnos_cursos) con dos claves foráneas |
| Uno a uno (1:1) | Un profesor y su legajo (no existe en la base) | Clave foránea única; poco frecuente |
3. Los tipos de JOIN
| JOIN | Devuelve |
|---|---|
INNER JOIN | Solo las filas que coinciden en ambas tablas |
LEFT JOIN | Todas las filas de la izquierda; si no hay coincidencia, las columnas de la derecha salen en NULL |
RIGHT JOIN | Lo mismo, pero conservando la tabla de la derecha (se recomienda reescribirlo como LEFT JOIN) |
CROSS JOIN | Todas las combinaciones posibles (producto cartesiano) |
-- Cursos con el nombre de su profesor (solo coincidencias) → 4 filas
SELECT c.TITULO, p.NOMBRE, p.APELLIDOS
FROM cursos AS c
INNER JOIN profesores AS p ON c.ID_PROFE = p.ID_PROFE;
-- Todos los cursos, tengan profesor o no → 5 filas («SQL avanzado» con NULL)
SELECT c.TITULO, p.NOMBRE
FROM cursos AS c
LEFT JOIN profesores AS p ON c.ID_PROFE = p.ID_PROFE;
-- Profesores SIN cursos (anti-join) → Carlos
SELECT p.NOMBRE, p.APELLIDOS
FROM profesores AS p
LEFT JOIN cursos AS c ON c.ID_PROFE = p.ID_PROFE
WHERE c.ID_CURSO IS NULL;4. Detalles que conviene saber
- Alias de tabla (
cursos AS c): acortan la consulta y evitan ambigüedades cuando dos tablas tienen columnas con el mismo nombre (las dos tienenID_PROFE). - ON vs. USING:
ON c.ID_PROFE = p.ID_PROFEadmite cualquier condición;USING (ID_PROFE)sirve cuando la columna se llama igual en ambas tablas. - FULL OUTER JOIN no existe en MySQL: se simula uniendo un
LEFT JOINy unRIGHT JOINconUNION. - En MySQL,
JOIN,INNER JOINyCROSS JOINson equivalentes en sintaxis; por claridad usáINNER JOIN ... ON.
Error frecuente
Olvidar la condiciónON genera un producto cartesiano: los 30 partidos de eventos con los 6 equipos dan 180 filas sin sentido. En tablas reales (miles × millones) puede trabar el servidor. Si el resultado tiene muchas más filas de las esperadas, revisá la condición de unión.Bibliografía
- MySQL 8.0 Reference Manual. FOREIGN KEY Constraints.
- MySQL 8.0 Reference Manual. JOIN Clause.
- MySQL 8.0 Reference Manual. Using Foreign Keys.
- MySQL 8.0 Reference Manual. UNION Clause.
- W3Schools. MySQL Joins (con editor para practicar en línea).
El manual oficial de MySQL está en inglés; podés usar el traductor del navegador.
Siguiente clase: Relaciones entre tablas.
