CodeGym /Cursos /SQL SELF /Múltiples JOIN en una sola consulta

Múltiples JOIN en una sola consulta

SQL SELF
Nivel 12 , Lección 1
Disponible

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;
  1. Primero se unen las tablas students y enrollments por la columna students.id = enrollments.student_id.
  2. El resultado de la primera unión se usa para unir con la tabla courses por la columna enrollments.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:

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

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

Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION