Imagina que cada tabla en tu base es una pieza de un gran puzzle. La tabla de estudiantes sabe quién estudia, la tabla de cursos — qué se enseña, y la tabla de inscripciones — quién está inscrito en qué. Pero por separado, estas piezas no cuentan nada. ¿Quieres ver la imagen completa? Hay que unirlas — y aquí es donde entra en juego el JOIN múltiple.
En la vida real, los datos suelen estar organizados en tablas relacionadas para mantener la estructura y evitar redundancias. Por ejemplo, en nuestra base de universidades tenemos estas tablas:
students— datos sobre los estudiantes.enrollments— info sobre inscripciones de estudiantes a cursos.courses— info sobre los cursos.
Si queremos sacar una lista completa de estudiantes, sus cursos y profesores, hay que unir las tres tablas usando JOIN.
Orden de ejecución de JOIN
Cuando usas varios JOIN, PostgreSQL los procesa de izquierda a derecha. O sea, primero se unen las dos primeras tablas, luego el resultado se une con la tercera, y así sucesivamente.
Ejemplo:
SELECT *
FROM students
INNER JOIN enrollments ON students.id = enrollments.student_id
INNER JOIN courses ON enrollments.course_id = courses.id;
- Primero se unen las tablas
studentsyenrollmentspor la columnastudents.id = enrollments.student_id. - El resultado de la primera unión se usa para unir con la tabla
coursespor la columnaenrollments.course_id = courses.id.
El orden de ejecución es especialmente importante cuando tienes tablas grandes en la consulta. Una estructura de JOIN mal hecha puede bajar mucho el rendimiento.
Ejemplo: Lista de estudiantes, sus cursos y profesores
Supón que tenemos estas tablas con datos:
Tabla students:
| id | name |
|---|---|
| 1 | Otto Song |
| 2 | Maria Chi |
| 3 | Alex Lin |
Tabla courses:
| id | name | teacher |
|---|---|---|
| 101 | Mathematics | Ellen Moore |
| 102 | Physics | James Okoro |
| 103 | Computer Science | Nina Delgado |
Tabla enrollments:
| student_id | course_id |
|---|---|
| 1 | 101 |
| 1 | 103 |
| 2 | 102 |
| 3 | 101 |
Consulta:
SELECT
students.name AS student_name,
courses.name AS course_name,
courses.teacher AS teacher_name
FROM students
INNER JOIN enrollments ON students.id = enrollments.student_id
INNER JOIN courses ON enrollments.course_id = courses.id;
Resultado:
| student_name | course_name | teacher_name |
|---|---|---|
| Otto Song | Mathematics | Ellen Moore |
| Otto Song | Computer Science | Nina Delgado |
| Maria Chi | Physics | James Okoro |
| Alex Lin | Mathematics | Ellen Moore |
Filtrado en consultas con múltiples JOIN
Puedes aplicar condiciones de filtrado en consultas con JOIN para limitar la cantidad de datos devueltos y acelerar la consulta. Por ejemplo, si solo quieres mostrar los estudiantes que están en el curso "Mathematics":
SELECT
students.name AS student_name,
courses.name AS course_name
FROM students
INNER JOIN enrollments ON students.id = enrollments.student_id
INNER JOIN courses ON enrollments.course_id = courses.id
WHERE courses.name = 'Mathematics';
Resultado:
| student_name | course_name |
|---|---|
| Otto Song | Mathematics |
| Alex Lin | Mathematics |
Optimización de consultas con múltiples JOIN
Cuando trabajas con tablas grandes, optimizar las consultas es super importante. Aquí van unos consejos:
- Usa índices
Los índices permiten que PostgreSQL trabaje más rápido, sobre todo al unir por campos clave. Asegúrate de que las columnas student_id y course_id en la tabla enrollments tengan índices.
Ejemplo de cómo crear un índice:
CREATE INDEX idx_enrollments_student_id ON enrollments(student_id);
CREATE INDEX idx_enrollments_course_id ON enrollments(course_id);
Ya aprenderás más sobre índices en los siguientes niveles, pero quería mencionarlos aquí. Muy a menudo están relacionados con JOIN.
- Filtra datos lo antes posible
Usa condiciones WHERE para reducir la cantidad de filas antes de hacer el JOIN. Por ejemplo:
SELECT
students.name AS student_name,
courses.name AS course_name
FROM students
INNER JOIN enrollments ON students.id = enrollments.student_id
INNER JOIN courses ON enrollments.course_id = courses.id
WHERE
courses.teacher = 'Ivan Petrov';
- Minimiza la cantidad de filas a unir
En vez de unir todos los registros de dos tablas, intenta filtrarlos primero con subconsultas:
SELECT
students.name AS student_name,
courses.name AS course_name
FROM
(SELECT * FROM students WHERE id IN (1, 2)) sub_students
INNER JOIN enrollments ON sub_students.id = enrollments.student_id
INNER JOIN courses ON enrollments.course_id = courses.id;
Más sobre SELECT anidados lo verás justo en el siguiente nivel :P
Ejemplo de unión compleja: estudiantes, cursos y facultades
Supón que añadimos otra tabla faculties:
Tabla faculties:
| id | name |
|---|---|
| 10 | Engineering |
| 20 | Natural Sciences |
Tabla courses actualizada:
| id | name | teacher | faculty_id |
|---|---|---|---|
| 101 | Mathematics | Ellen Moore | 10 |
| 102 | Physics | James Okoro | 20 |
| 103 | Computer Science | Nina Delgado | 10 |
Para sacar la lista de estudiantes, cursos y facultades, añadimos otro JOIN:
SELECT
students.name AS student_name,
courses.name AS course_name,
faculties.name AS faculty_name
FROM students
INNER JOIN enrollments ON students.id = enrollments.student_id
INNER JOIN courses ON enrollments.course_id = courses.id
INNER JOIN faculties ON courses.faculty_id = faculties.id;
Resultado:
| student_name | course_name | faculty_name |
|---|---|---|
| Otto Song | Mathematics | Engineering |
| Otto Song | Computer Science | Engineering |
| Maria Chi | Physics | Natural Sciences |
| Alex Lin | Mathematics | Engineering |
Las consultas SQL con múltiples JOIN pueden ser complicadas, pero te permiten crear informes potentes y sacar info valiosa. Si las optimizas y estructuras bien, serán tu herramienta para trabajar con bases de datos grandes.
GO TO FULL VERSION