JOINS em SQL

JOINS são usados para combinar registros de duas ou mais tabelas com base em uma coluna relacionada entre elas. Dominar os diferentes tipos de JOIN é essencial para trabalhar com bancos de dados relacionais.

INNER JOIN

O INNER JOIN retorna apenas os registros que têm correspondência em ambas as tabelas. É o tipo mais comum de JOIN.

SELECT a.nome, c.nome AS curso
FROM Alunos a
INNER JOIN Cursos c ON a.curso_id = c.id;
Visualização do INNER JOIN: Apenas os registros com correspondência em ambas as tabelas são retornados

Alunos

id
nome
curso_id
1
Ana
1
2
João
2
3
Maria
1
4
Pedro
NULL

Cursos

id
nome
area
1
Engenharia
Exatas
2
Medicina
Saúde
3
Direito
Humanas

LEFT JOIN

O LEFT JOIN retorna todos os registros da tabela à esquerda (primeira tabela) e os registros correspondentes da tabela à direita (segunda tabela). Se não houver correspondência, os resultados da direita serão NULL.

SELECT a.nome, c.nome AS curso
FROM Alunos a
LEFT JOIN Cursos c ON a.curso_id = c.id;
Visualização do LEFT JOIN: Todos os registros da tabela esquerda, com correspondências da direita ou NULL

Alunos

id
nome
curso_id
1
Ana
1
2
João
2
3
Maria
1
4
Pedro
4

Cursos

id
nome
area
1
Engenharia
Exatas
2
Medicina
Saúde
3
Direito
Humanas

RIGHT JOIN

O RIGHT JOIN retorna todos os registros da tabela à direita (segunda tabela) e os registros correspondentes da tabela à esquerda (primeira tabela). Se não houver correspondência, os resultados da esquerda serão NULL.

SELECT a.nome, c.nome AS curso
FROM Alunos a
RIGHT JOIN Cursos c ON a.curso_id = c.id;
Visualização do RIGHT JOIN: Todos os registros da tabela direita, com correspondências da esquerda ou NULL

Alunos

id
nome
curso_id
1
Ana
1
2
João
2
3
Maria
1

Cursos

id
nome
area
1
Engenharia
Exatas
2
Medicina
Saúde
3
Direito
Humanas
4
Administração
Humanas

FULL OUTER JOIN

O FULL OUTER JOIN retorna todos os registros quando há uma correspondência na tabela esquerda ou direita. Se não houver correspondência, as colunas da tabela sem correspondência terão NULL.

Nota: O FULL OUTER JOIN não é suportado por todos os SGBDs (como MySQL). Pode ser simulado com UNION de LEFT e RIGHT JOIN.
-- Simulação de FULL OUTER JOIN no MySQL
SELECT a.nome, c.nome AS curso
FROM Alunos a
LEFT JOIN Cursos c ON a.curso_id = c.id
UNION
SELECT a.nome, c.nome AS curso
FROM Alunos a
RIGHT JOIN Cursos c ON a.curso_id = c.id;
Visualização do FULL OUTER JOIN: Todos os registros de ambas as tabelas, com correspondências ou NULL

CROSS JOIN

O CROSS JOIN retorna o produto cartesiano das duas tabelas - cada linha da primeira tabela é combinada com todas as linhas da segunda tabela.

Cuidado: CROSS JOIN pode gerar resultados muito grandes se as tabelas forem grandes. Por exemplo, duas tabelas com 1000 registros cada produziriam 1.000.000 de registros!
SELECT a.nome, c.nome AS curso
FROM Alunos a
CROSS JOIN Cursos c;
Visualização do CROSS JOIN: Combinação de todas as linhas da primeira tabela com todas as linhas da segunda tabela