CodeGym /Cursos /SQL SELF /`RIGHT JOIN` e como usar

`RIGHT JOIN` e como usar

SQL SELF
Nível 11, Lição 3
Disponível

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:

  1. tabela da esquerda vem antes do RIGHT JOIN;
  2. 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.

  1. 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.
  2. Escolha da tabela principal Normalmente você escolhe LEFT ou RIGHT dependendo de qual tabela (esquerda ou direita) é mais importante pra você e da ordem que fica melhor no seu SQL.

  3. Equivalência Qualquer RIGHT JOIN pode ser reescrito como LEFT JOIN trocando 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 JOIN como 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:

  1. 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.
  2. Confundir RIGHT JOIN com LEFT JOIN. Se você inverter a ordem das tabelas, o resultado vai sair errado.
  3. Não tratar os valores NULL. Nos resultados do RIGHT JOIN sempre aparece NULL, então tem que saber interpretar ou usar COALESCE() 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!

2
Tarefa
SQL SELF, nível 11, lição 3
Bloqueado
Uso simples de `RIGHT JOIN`
Uso simples de `RIGHT JOIN`
2
Tarefa
SQL SELF, nível 11, lição 3
Bloqueado
Uso de `RIGHT JOIN` com filtragem
Uso de `RIGHT JOIN` com filtragem
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION