Bora começar pela definição. RIGHT JOIN é um tipo de join que retorna todas as linhas da tabela da direita (por isso o nome "right"), e só as linhas que batem da tabela da esquerda. Se não tiver dados na tabela da esquerda que batam com a linha da direita, vai aparecer NULL nos campos da tabela da esquerda.
Você já viu o LEFT JOIN, né? É quase igual, só que espelhado. A diferença principal é qual tabela é considerada a principal: a da esquerda ou a da direita.
Sintaxe do RIGHT JOIN
A sintaxe do RIGHT JOIN é praticamente igual ao LEFT JOIN. Olha só como fica:
SELECT
colunas
FROM
tabela_esquerda RIGHT JOIN tabela_direita
ON
condicao_de_join;
Repara na ordem das tabelas:
- tabela da esquerda vem antes do
RIGHT JOIN; - tabela da direita vem depois do
RIGHT JOIN.
Imagina que a gente tem duas tabelas:
students — lista de estudantes:
| student_id | name |
|---|---|
| 1 | Otto |
| 2 | Maria |
| 3 | Alex |
enrollments — registros de matrícula dos estudantes nos cursos:
| enrollment_id | course_name | student_id |
|---|---|---|
| 101 | Matemática | 1 |
| 102 | Informática | 2 |
| 103 | Biologia | NULL |
Agora a gente quer pegar a lista de todos os registros de matrícula, junto com a info dos estudantes, se existir. Se não achar o estudante, vai aparecer NULL no lugar da info do estudante.
O SQL usando RIGHT JOIN fica assim:
SELECT
enrollments.enrollment_id,
enrollments.course_name,
students.name AS student_name
FROM
students RIGHT JOIN enrollments
ON
students.student_id = enrollments.student_id;
Resultado:
| enrollment_id | course_name | student_name |
|---|---|---|
| 101 | Matemática | Otto |
| 102 | Informática | Maria |
| 103 | Biologia | NULL |
Aqui dá pra ver que todos os registros da tabela enrollments (a da direita) aparecem no resultado, mesmo se não tiver correspondência na tabela students (a da esquerda).
Comparando RIGHT JOIN e LEFT JOIN
Se você já entendeu como funciona o LEFT JOIN, pode pensar: "Pra que serve o RIGHT JOIN? Não dava pra usar só o LEFT JOIN?" Boa pergunta! Bora ver as diferenças e quando faz sentido usar o RIGHT JOIN.
Direção dos dados
LEFT JOIN: retorna todas as linhas da tabela da esquerda, mesmo se não tiver correspondência na da direita.RIGHT JOIN: retorna todas as linhas da tabela da direita, mesmo se não tiver correspondência na da esquerda.
Escolha da tabela principal Normalmente você escolhe
LEFTouRIGHTdependendo de qual tabela (esquerda ou direita) é mais importante pra você e da ordem que fica melhor no seu SQL.Equivalência Qualquer
RIGHT JOINpode ser reescrito comoLEFT JOINtrocando a ordem das tabelas. Tipo assim:-- RIGHT JOIN SELECT * FROM students RIGHT JOIN enrollments ON students.student_id = enrollments.student_id; -- LEFT JOIN equivalente SELECT * FROM enrollments LEFT JOIN students ON students.student_id = enrollments.student_id;
Então, se você não curte o RIGHT JOIN, pode sempre evitar ele!
Quando usar RIGHT JOIN?
No dia a dia, o RIGHT JOIN é menos usado que o LEFT JOIN. Mas tem situações que ele é útil:
- Se a tabela da direita é mais importante (tipo, ela é a principal do seu relatório);
- Quando você quer organizar o SQL numa ordem que faz mais sentido pra você, com a tabela da direita depois da esquerda;
- Se você tá mexendo num código que já usa
RIGHT JOINcomo padrão.
Visualizando o RIGHT JOIN
Pra entender melhor o RIGHT JOIN, olha esse esquema:
Tabela da esquerda Tabela da direita
[ A ] --------> [ 1 ]
[ B ] --------> [ 2 ]
[ C ] --------> [ 3 ]
[ D ] [ 4 ]
Usando RIGHT JOIN, você pega todos os valores da tabela da direita junto com os dados que batem da esquerda. O que não tiver na esquerda, fica NULL.
Exercício prático
Bora testar o que você aprendeu. Olha o desafio:
Você tem as tabelas departments com os departamentos e employees com os funcionários: departments:
| department_id | department_name |
|---|---|
| 1 | IT |
| 2 | Vendas |
| 3 | Contabilidade |
employees:
| employee_id | name | department_id |
|---|---|---|
| 101 | Peter | 1 |
| 102 | Eva | 2 |
| 103 | Ron | NULL |
Escreve um SQL usando RIGHT JOIN que retorna a lista de todos os departamentos, incluindo os funcionários se tiver, ou NULL se não tiver ninguém no departamento.
Tenta resolver sozinho antes de olhar a resposta.
Resposta do exercício
O SQL fica assim:
SELECT
departments.department_name,
employees.name AS employee_name
FROM employees RIGHT JOIN departments
ON employees.department_id = departments.department_id;
O resultado vai ser:
| department_name | employee_name |
|---|---|
| IT | Peter |
| Vendas | Eva |
| Contabilidade | NULL |
Erros comuns usando RIGHT JOIN
Quando a galera tá começando com RIGHT JOIN, rolam uns vacilos clássicos:
- Esquecer a condição do
ON. Se não colocar a condição, você vai fazer um produto cartesiano das tabelas, e aí vira bagunça. - Confundir
RIGHT JOINcomLEFT JOIN. Se você inverter a ordem das tabelas, o resultado vai sair errado. - Não tratar os valores
NULL. Nos resultados doRIGHT JOINsempre apareceNULL, então tem que saber interpretar ou usarCOALESCE()pra trocar por outro valor.
É isso! Agora você já sabe usar o RIGHT JOIN, entende a diferença entre RIGHT JOIN e LEFT JOIN, e consegue escolher o tipo de join certo pro seu caso. Na próxima aula a gente fala mais sobre o FULL OUTER JOIN, onde junta tudo-tudo das duas tabelas. Boa sorte nos seus SQLs!
GO TO FULL VERSION