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;
- Primeiro junta as tabelas
studentseenrollmentspela colunastudents.id = enrollments.student_id. - O resultado dessa junção é usado pra juntar com a tabela
coursespela colunaenrollments.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:
- 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.
- 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';
- 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.
GO TO FULL VERSION