CodeGym /Cursos /SQL SELF /Fundamentos do INNER JOIN

Fundamentos do INNER JOIN

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

Na última aula a gente falou sobre os tipos de JOIN que existem no SQL. Hoje vamos focar mais no INNER JOIN.

INNER JOIN é um tipo de junção de dados em bancos relacionais que permite pegar linhas de duas tabelas e retornar só aquelas linhas que "batem" de acordo com a condição que você definir. Ou seja, INNER JOIN retorna só as partes que se cruzam das duas tabelas, ignorando o resto.

Imagina que você tem duas caixas. Em uma tem cartões com estudantes, na outra cartões com cursos nos quais os estudantes estão inscritos. Você quer saber quais estudantes estão em quais cursos. Se não tiver correspondência (tipo, estudante não está em nenhum curso), esses dados não interessam agora. Esse cenário é perfeito pro INNER JOIN.

Sintaxe do INNER JOIN

A sintaxe é bem direta — você coloca as duas tabelas que quer juntar e define a condição de junção usando a palavra-chave ON.

SELECT colunas
FROM tabela1 INNER JOIN tabela2
ON tabela1.campo = tabela2.campo;
  • tabela1 e tabela2 — são as tabelas que você quer juntar.
  • campo — são as colunas pelas quais vai rolar a correspondência.
  • A condição depois do ON define as regras pra bater as linhas das duas tabelas.

Exemplos de uso do INNER JOIN

Nos próximos exemplos vamos trabalhar com duas tabelas:

Tabela students — dados dos estudantes

student_id name age
1 Otto 20
2 Anna 22
3 Peter 19
4 Dia 21

Tabela enrollments — dados das inscrições nos cursos

enrollment_id student_id course_id
101 1 501
102 2 502
103 2 503
104 3 504

Repara que a estudante Dia (com student_id = 4) não está inscrita em nenhum curso.

Exemplo 1: Pegando estudantes e seus cursos

A gente quer saber quais estudantes estão inscritos em cursos. Esse é o uso clássico do INNER JOIN. Só importa onde tem correspondência entre as tabelas students e enrollments baseado no student_id.

SELECT students.name, enrollments.course_id
FROM students INNER JOIN enrollments
ON students.student_id = enrollments.student_id;

Resultado:

name course_id
Otto 501
Anna 502
Anna 503
Peter 504

O que vemos? INNER JOIN trouxe só os estudantes que estão inscritos em cursos. A Dia, que não está em nenhum, ficou de fora.

Exemplo 2: Pegando pedidos e clientes

Agora vamos ver outro exemplo. Suponha que temos as tabelas orders (pedidos) e customers (clientes). Queremos pegar a lista de todos os pedidos com os nomes dos clientes.

Tabela orders

order_id customer_id amount
1 101 500
2 102 300
3 103 700

Tabela customers

customer_id name
101 Otto
102 Anna
104 Peter

Missão: precisamos juntar orders e customers pelo customer_id pra retornar só os pedidos que têm cliente correspondente.

SELECT orders.order_id, customers.name, orders.amount
FROM orders INNER JOIN customers
ON orders.customer_id = customers.customer_id;

Resultado:

order_id name amount
1 Otto 500
2 Anna 300

Repara que o pedido com order_id = 3 não apareceu no resultado, porque o cliente com customer_id = 103 não existe na tabela customers.

Como o INNER JOIN ajuda a juntar tabelas (e o que pode dar ruim)

INNER JOIN é a ferramenta principal que você vai usar em praticamente qualquer projeto que envolva banco de dados relacional. É tipo uma chave inglesa no kit de ferramentas: até dá pra tentar sem ela, mas vai ser bem mais difícil conseguir o resultado. Por exemplo:

  • Quando você faz relatórios que precisam juntar dados de várias tabelas.
  • Pra montar análises, quando precisa juntar fatos com dimensões (tipo vendas e clientes).
  • Pra integrar dados de sistemas de fora.

O erro mais comum de quem tá começando é esquecer o ON ou colocar a condição de junção errada. Se você não definir a condição certa, em vez do resultado esperado, vai sair o produto cartesiano das duas tabelas — pode ser milhares ou milhões de linhas sem sentido nenhum.

Exemplo de erro:

Nesse exemplo não tem condição de junção, então a query vai criar toda combinação possível de linhas das duas tabelas (e provavelmente não é isso que você quer):

SELECT students.name, enrollments.course_id
FROM students, enrollments;  -- ERRO: sem condição de junção!

O resultado vai ser um caos: cada linha de students vai se juntar com cada linha de enrollments.

2
Tarefa
SQL SELF, nível 11, lição 1
Bloqueado
União simples de estudantes e cursos
União simples de estudantes e cursos
2
Tarefa
SQL SELF, nível 11, lição 1
Bloqueado
Lista de clientes e seus pedidos
Lista de clientes e seus pedidos
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION