🔹 Introducción
Hasta ahora trabajamos siempre con una sola tabla (alumnos).
Pero en bases de datos reales casi siempre hay múltiples tablas relacionadas:
- Una tabla de alumnos.
- Una tabla de cursos.
- Una tabla de inscripciones que relaciona alumnos con cursos.
👉 Para consultar información de varias tablas al mismo tiempo, usamos los JOINs.
Los principales son:
- INNER JOIN → devuelve solo las filas que coinciden en ambas tablas.
- LEFT JOIN → devuelve todas las filas de la tabla izquierda y las coincidentes de la derecha (o NULL si no hay coincidencia).
- RIGHT JOIN → igual que LEFT JOIN, pero al revés.
🔹 1. Tablas de ejemplo
Creamos una segunda tabla llamada cursos:
CREATE TABLE cursos (
id INT,
curso VARCHAR(50)
);
INSERT INTO cursos (id, curso) VALUES
(1, 'Matemáticas'),
(2, 'Historia'),
(3, 'Inglés');
Y una tabla inscripciones que conecta alumnos con cursos:
CREATE TABLE inscripciones (
alumno_id INT,
curso_id INT
);
INSERT INTO inscripciones (alumno_id, curso_id) VALUES
(1, 1), -- Ana en Matemáticas
(1, 3), -- Ana en Inglés
(2, 2), -- Juan en Historia
(3, 1), -- Laura en Matemáticas
(4, 3); -- Pedro en Inglés
👉 Ahora tenemos:
alumnos: info de cada estudiante.cursos: info de cada curso.inscripciones: relación alumno ↔ curso.
🔹 2. INNER JOIN (solo coincidencias)
Queremos saber qué alumnos están en qué curso:
SELECT a.nombre, c.curso
FROM inscripciones i
INNER JOIN alumnos a ON i.alumno_id = a.id
INNER JOIN cursos c ON i.curso_id = c.id;
📊 Resultado esperado:
| nombre | curso |
|---|---|
| Ana | Inglés |
| Ana | Matemáticas |
| Juan | Historia |
| Laura | Matemáticas |
| Pedro | Inglés |
👉 INNER JOIN devuelve solo registros donde existe coincidencia en ambas tablas.
🔹 3. LEFT JOIN (todos de la izquierda)
Queremos listar todos los alumnos, aunque no estén inscriptos en cursos:
SELECT a.nombre, c.curso
FROM alumnos a
LEFT JOIN inscripciones i ON a.id = i.alumno_id
LEFT JOIN cursos c ON i.curso_id = c.id;
📊 Resultado esperado:
| nombre | curso |
|---|---|
| Ana | Inglés |
| Ana | Matemáticas |
| Juan | Historia |
| Laura | Matemáticas |
| Pedro | Inglés |
(Si hubiera un alumno sin cursos, aparecería con NULL en curso).
🔹 4. RIGHT JOIN (todos de la derecha)
Queremos listar todos los cursos, incluso los que todavía no tienen alumnos:
SELECT c.curso, a.nombre
FROM cursos c
RIGHT JOIN inscripciones i ON c.id = i.curso_id
RIGHT JOIN alumnos a ON i.alumno_id = a.id;
👉 Si existiera un curso sin alumnos, aparecería con NULL en la columna de nombre.
🔹 5. Ejemplo combinado
Supongamos que queremos saber el número de alumnos por curso:
SELECT c.curso, COUNT(a.id) AS cantidad_alumnos
FROM cursos c
LEFT JOIN inscripciones i ON c.id = i.curso_id
LEFT JOIN alumnos a ON i.alumno_id = a.id
GROUP BY c.curso;
📊 Resultado esperado:
| curso | cantidad_alumnos |
|---|---|
| Matemáticas | 2 |
| Historia | 1 |
| Inglés | 2 |
🔹 6. Ejercicio práctico
- Muestra los nombres de los alumnos junto con los cursos en los que están inscriptos (INNER JOIN).
- Muestra todos los alumnos y los cursos, incluso si un alumno no está inscripto (LEFT JOIN).
- Muestra todos los cursos y la cantidad de alumnos en cada uno (GROUP BY con JOIN).
🔹 Soluciones
SELECT a.nombre, c.curso
FROM inscripciones i
INNER JOIN alumnos a ON i.alumno_id = a.id
INNER JOIN cursos c ON i.curso_id = c.id;
SELECT a.nombre, c.curso
FROM alumnos a
LEFT JOIN inscripciones i ON a.id = i.alumno_id
LEFT JOIN cursos c ON i.curso_id = c.id;
SELECT c.curso, COUNT(a.id) AS cantidad_alumnos
FROM cursos c
LEFT JOIN inscripciones i ON c.id = i.curso_id
LEFT JOIN alumnos a ON i.alumno_id = a.id
GROUP BY c.curso;
📝 Mini Quiz
Resultados
#1. ¿Qué hace un INNER JOIN?
#2. ¿Qué hace un LEFT JOIN?
#3. Si quiero obtener todos los cursos aunque no tengan alumnos, ¿qué tipo de JOIN debo usar?
🔹 Resumen de la lección
- Los JOINs permiten combinar datos de varias tablas.
INNER JOIN: solo coincidencias entre tablas.LEFT JOIN: todos los registros de la tabla izquierda + coincidencias.RIGHT JOIN: todos los registros de la tabla derecha + coincidencias.- Se pueden combinar JOINs con funciones de agregación (
COUNT,AVG, etc.) para obtener estadísticas.
👉 En la próxima lección aprenderás sobre subconsultas (subqueries): consultas dentro de otras consultas, muy útiles para resolver problemas más complejos.
📝 Revisa el temario completo del curso SQL y selecciona la próxima lección que te interese.