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.

Selecionando todos os dados que são comuns as duas tabelas e todo conteúdo da tabela a direita
Figura 1. Selecionando todos os dados que são comuns as duas tabelas e todo conteúdo da tabela a direita

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
Tabela 1. Tabela professor
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
Tabela 2. Tabela aluno
id nome
1 Turma A
2 Turma B
3 Turma C
4 Turma D
5 Turma E
Tabela 3. Tabela turma
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
Tabela 4. Resultado do RIGHT JOIN com a tabela turma

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
Tabela 5. Resultado do RIGHT JOIN com a tabela turma