Ao contrário do LEFT JOIN, a cláusula RIGHT JOIN ou RIGHT OUTER JOIN retorna todos os dados encontrados na tabela à direita de JOIN. Caso não existam dados associados entre as tabelas à esquerda e à direita de JOIN, serão retornados valores nulos.
Visão geral
RIGHT JOIN retorna todos os registros da tabela à direita (Tabela 2) e os registros correspondentes da tabela à esquerda (Tabela 1). O resultado é NULL do lado esquerdo, quando não há correspondência, como mostra a Figura 1.
Considere o seguinte cenário: temos duas tabelas - professor (Tabela 1) e turma (Tabela 2), e precisamos fazer uma consulta de todos as turmas com seus respectivos professores. Se usássemos o INNER JOIN somente as turmas com professor vinculado viriam no resultado. Para trazer o resultado completo, mesmo com turmas sem professor, podemos utilizar o RIGHT, tendo em vista que a tabela professor vem a direita na query.
id | nome | idturma |
1 | Cintia Pereira | 1 |
2 | Lucas Gabriel | 2 |
3 | Felipe Bruno | 1 |
4 | Thiago Barcelos | 2 |
5 | Bruno Reis | 3 |
6 | Osvaldo Sobrinho | |
7 | Fabiano Francisco |
id | nome | idturma |
1 | Lucas Gabriel | 1 |
2 | Fernando Souza | 2 |
3 | Gabriela Romero | 1 |
4 | Thiago Enrique | 2 |
5 | Gabriel Dias | 3 |
6 | Ricardo Pereira | 4 |
id | nome |
1 | Turma A |
2 | Turma B |
3 | Turma C |
4 | Turma D |
5 | Turma E |
SELECT
turma.nome as Turma,
professor.nome as Professor
FROM
professor
RIGHT JOIN
turma ON turma.id = professor.idturma
O resultado é apresentado na Tabela 4, com informações de todas as tabelas vinculadas, e quando não houve correspondência, o valor null veio na relação.
Turma | Professor |
TURMA A | Cintia Pereira |
TURMA B | Lucas Gabriel |
TURMA A | Felipe Bruno |
TURMA B | Thiago Barcelos |
TURMA C | Bruno Reis |
TURMA D | NULL |
TURMA E | NULL |
Sintaxe
SELECT
[ tabela1.coluna1, tabela1.coluna2, ... | N.coluna1, N.coluna2, … ]
FROM
[ tabela1 | tabela1 F ]
RIGHT JOIN
[ tabelaX | tabelaX N]
ON
[ tabelaX.coluna1 = tabela1.coluna1 | N.coluna1 = F.coluna1 ]
Na prática
Exemplo 1
Novamente, podemos adicionar mais uma tabela a essa consulta, contendo informações relacionadas aos professores de cada turma, sendo que pode haver alguma turma sem professor:
SELECT
aluno.nome as Aluno,
turma.nome as Turma,
professor.nome as Professor
FROM
aluno
INNER JOIN
turma ON turma.id = aluno.idturma
RIGHT JOIN
professor ON turma.id = professor.idturma
Teremos novamente como resultado a junção das três tabelas, aluno, professor e turma, conforme ilustra Tabela 5, vindo todos os alunos com turma e todas as turmas vinculadas, com ou sem professor.
Aluno | Turma | Professor |
Lucas Gabriel | Turma A | Cintia Pereira |
Lucas Gabriel | Turma A | Felipe Bruno |
Fernando Souza | Turma B | Lucas Gabriel |
Fernando Souza | Turma B | Thiago Barcelos |
Gabriela Romero | Turma A | Cintia Pereira |
Gabriela Romero | Turma A | Felipe Bruno |
Thiago Enrique | Turma B | Lucas Gabriel |
Thiago Enrique | Turma B | Thiago Barcelos |
Gabriel Dias | Turma C | Bruno Reis |
NULL | NULL | Osvaldo Sobrinho |
NULL | NULL | Fabiano Francisco |