Módulo 3 · 01 | Claves y JOINs: cómo se relacionan las tablas

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

Descargar tablasLibro.sql (Drive)

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ónQué hace al borrar/actualizar el padre
RESTRICT / NO ACTIONLo impide si hay filas hijas (es lo predeterminado). Por eso no podés borrar a Rosa mientras dicte cursos.
CASCADEBorra o actualiza también las filas hijas
SET NULLDeja 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ónEjemplo en tablas_libroCómo se implementa
Uno a muchos (1:N)Un profesor dicta varios cursosClave foránea en la tabla del lado «muchos» (cursos.ID_PROFE)
Muchos a muchos (N:M)Alumnos y cursosTabla 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

JOINDevuelve
INNER JOINSolo las filas que coinciden en ambas tablas
LEFT JOINTodas las filas de la izquierda; si no hay coincidencia, las columnas de la derecha salen en NULL
RIGHT JOINLo mismo, pero conservando la tabla de la derecha (se recomienda reescribirlo como LEFT JOIN)
CROSS JOINTodas 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 tienen ID_PROFE).
  • ON vs. USING: ON c.ID_PROFE = p.ID_PROFE admite 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 JOIN y un RIGHT JOIN con UNION.
  • En MySQL, JOIN, INNER JOIN y CROSS JOIN son equivalentes en sintaxis; por claridad usá INNER JOIN ... ON.

Error frecuente

Olvidar la condición ON 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

El manual oficial de MySQL está en inglés; podés usar el traductor del navegador.

Siguiente clase: Relaciones entre tablas.

Scroll al inicio
¿Consultas? Escribinos