CodeGym /Cursos /SQL SELF /Vários JOIN em uma query só

Vários JOIN em uma query só

SQL SELF
Nível 12, Lição 1
Disponível

Imagina que cada tabela no teu banco é tipo uma peça de um quebra-cabeça gigante. A tabela de estudantes sabe quem tá estudando, a tabela de cursos — o que tão ensinando, e a tabela de matrículas — quem tá matriculado em quê. Mas, separadas, essas peças não contam a história toda. Quer ver o quadro completo? Tem que juntar tudo — e aí entra o JOIN múltiplo.

No mundo real, os dados geralmente ficam organizados em tabelas relacionadas pra deixar tudo mais estruturado e evitar bagunça. Por exemplo, no nosso banco da faculdade, temos essas tabelas:

  • students — dados dos estudantes.
  • enrollments — info das matrículas dos estudantes nos cursos.
  • courses — info dos cursos.

Se a gente quiser pegar a lista completa de estudantes, os cursos deles e os professores, tem que juntar as três tabelas usando JOIN.

Ordem de execução do JOIN

Quando tu usa vários JOIN, o PostgreSQL processa eles da esquerda pra direita. Ou seja, primeiro junta as duas primeiras tabelas, depois o resultado junta com a terceira, e assim vai.

Exemplo:

SELECT *
FROM students
    INNER JOIN enrollments ON students.id = enrollments.student_id
    INNER JOIN courses ON enrollments.course_id = courses.id;
  1. Primeiro junta as tabelas students e enrollments pela coluna students.id = enrollments.student_id.
  2. O resultado dessa junção é usado pra juntar com a tabela courses pela coluna enrollments.course_id = courses.id.

A ordem de execução é super importante quando tem tabelas grandes na jogada. Se montar o JOIN errado, pode deixar tudo bem mais lento.

Exemplo: Lista de estudantes, cursos e professores

Vamos supor que temos essas tabelas com dados:

Tabela students:

id name
1 Otto Song
2 Maria Chi
3 Alex Lin

Tabela courses:

id name teacher
101 Mathematics Ellen Moore
102 Physics James Okoro
103 Computer Science Nina Delgado

Tabela enrollments:

student_id course_id
1 101
1 103
2 102
3 101

Query:

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

Filtrando queries com vários JOIN

Tu pode usar condições de filtro nas queries com JOIN pra limitar o que volta e deixar tudo mais rápido. Por exemplo, se quiser mostrar só os estudantes que tão no 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

Otimização de queries com vários JOIN

Quando tu trabalha com tabelas grandes, otimizar as queries é essencial. Olha umas dicas:

  1. Usa índices

Índices ajudam o PostgreSQL a ser mais rápido, principalmente quando junta por campos chave. Confere se tem índice nas colunas student_id e course_id da tabela enrollments.

Exemplo de criação de índice:

CREATE INDEX idx_enrollments_student_id ON enrollments(student_id);
CREATE INDEX idx_enrollments_course_id ON enrollments(course_id);

Tu vai aprender mais sobre índices nos próximos níveis, mas já quis comentar aqui. Eles aparecem direto junto com JOIN.

  1. Filtra os dados logo no começo

Usa WHERE pra reduzir o número de linhas antes de fazer o JOIN. Tipo assim:

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 a quantidade de linhas pra juntar

Ao invés de juntar tudo de todas as tabelas, tenta filtrar antes com subqueries:

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;

Mais sobre SELECTs aninhados tu vai ver já já no próximo nível :P

Exemplo de JOIN mais complexo: estudantes, cursos e faculdades

Agora imagina que entrou mais uma tabela faculties:

Tabela faculties:

id name
10 Engineering
20 Natural Sciences

Tabela courses atualizada:

id name teacher faculty_id
101 Mathematics Ellen Moore 10
102 Physics James Okoro 20
103 Computer Science Nina Delgado 10

Pra pegar a lista de estudantes, cursos e faculdades, a gente coloca mais um 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

Queries SQL com vários JOIN podem ser complicadas, mas deixam tu criar relatórios poderosos e tirar informações valiosas. Se tu otimizar e estruturar direitinho, elas viram tua ferramenta pra lidar com bancos de dados grandes.

2
Tarefa
SQL SELF, nível 12, lição 1
Bloqueado
Consulta básica com múltiplos JOIN
Consulta básica com múltiplos JOIN
2
Tarefa
SQL SELF, nível 12, lição 1
Bloqueado
Filtragem de dados usando WHERE e múltiplos JOIN
Filtragem de dados usando WHERE e múltiplos JOIN
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION