Entendendo os Tipos de JOIN no Oracle SQL
Neste artigo, falaremos sobre os joins, que são utilizados no SQL para combinar registros de duas ou mais tabelas em um banco de dados com base em campos relacionados entre elas. Discutiremos os tipos de joins disponíveis no Oracle SQL e forneceremos exemplos práticos para facilitar o entendimento.
INNER JOIN (ou simplesmente JOIN)
O INNER JOIN
retorna registros quando há pelo menos uma correspondência em ambas as tabelas.
Exemplo:
Considere as tabelas ALUNOS
e NOTAS
:
CREATE TABLE ALUNOS
(
ID NUMBER PRIMARY KEY,
NOME VARCHAR2(50)
);
CREATE TABLE NOTAS
(
ID_ALUNO NUMBER REFERENCES ALUNOS(ID),
NOTA NUMBER
);
INSERT INTO ALUNOS VALUES (1, 'Ana');
INSERT INTO ALUNOS VALUES (2, 'Pedro');
INSERT INTO NOTAS VALUES (1, 8);
INSERT INTO NOTAS VALUES (2, 10);
Agora, queremos combinar essas tabelas para obter o nome do aluno e sua nota:
SELECT A.NOME, N.NOTA
FROM ALUNOS A
INNER JOIN NOTAS N ON A.ID = N.ID_ALUNO;
LEFT (OUTER) JOIN
O LEFT JOIN
retorna todos os registros da tabela à esquerda (tabela A), e os registros correspondentes da tabela à direita (tabela B). Se não houver correspondência, o resultado é NULL para a tabela à direita.
Exemplo:
Supondo que apenas o aluno ‘Ana’ tenha uma nota:
DELETE FROM NOTAS WHERE ID_ALUNO = 2;
Se usarmos um LEFT JOIN
:
SELECT A.NOME, N.NOTA
FROM ALUNOS A
LEFT JOIN NOTAS N ON A.ID = N.ID_ALUNO;
O resultado incluirá todos os alunos, mas a nota de ‘Pedro’ será NULL.
RIGHT (OUTER) JOIN
O RIGHT JOIN
retorna todos os registros da tabela à direita (tabela B), e os registros correspondentes da tabela à esquerda (tabela A). Se não houver correspondência, o resultado é NULL para a tabela à esquerda.
Usando os dados anteriores, se executarmos:
SELECT A.NOME, N.NOTA
FROM ALUNOS A
RIGHT JOIN NOTAS N ON A.ID = N.ID_ALUNO;
Obteremos apenas a entrada para ‘Ana’ porque ‘Pedro’ não tem uma nota correspondente.
FULL (OUTER) JOIN
O FULL JOIN
retorna registros quando há uma correspondência em uma das tabelas. Portanto, ele retornará todos os registros da tabela A e da tabela B, com NULL em ambos os lados se não houver correspondência.
Exemplo:
Se quisermos todos os registros de ambas as tabelas, independentemente de terem uma correspondência:
SELECT A.NOME, N.NOTA
FROM ALUNOS A
FULL JOIN NOTAS N ON A.ID = N.ID_ALUNO;
CROSS JOIN
O CROSS JOIN
combina cada linha da primeira tabela com cada linha da segunda tabela.
Exemplo:
SELECT A.NOME, N.NOTA
FROM ALUNOS A
CROSS JOIN NOTAS N;
Se tivermos 2 alunos e 2 notas, teremos 4 combinações.
SELF JOIN
Um SELF JOIN
é um join em que uma tabela é unida a si mesma.
Exemplo:
Se tivermos uma tabela de EMPREGADOS com uma coluna “SUPERVISOR_ID” que referencia o próprio ID da tabela EMPREGADOS, poderíamos usar um SELF JOIN para encontrar a relação entre empregado e supervisor.
SELECT E1.NOME AS EMPREGADO, E2.NOME AS SUPERVISOR
FROM EMPREGADOS E1, EMPREGADOS E2
WHERE E1.SUPERVISOR_ID = E2.ID;
Então é isso !
Abs
Referências
- Oracle® Database SQL Language Reference. Available at: Oracle’s Official Documentation
- Feuerstein, S., & Pribyl, B. (2014). Oracle PL/SQL Programming. O’Reilly Media, Inc.