Voltar para a lista de artigos Artigos
8 minutos de leitura

SQL JOINs para iniciantes

Você provavelmente já está familiarizado com consultas SQL simples, tais como SELECT * FROM table. Agora você está se perguntando o que fazer quando tem várias tabelas, e você quer se juntar a elas. Exatamente! JOIN é a chave. Neste tutorial Cláusulas JOIN em SQL para iniciantes, você aprenderá como conectar dados de múltiplas tabelas.

O que são Cláusulas JOIN em SQL?

Os bancos de dados geralmente têm mais de uma tabela. JOINs são uma construção SQL usada para unir dados de duas ou mais tabelas. Quando você quer usar colunas de duas tabelas em uma tabela de resultados, a maneira mais fácil de fazê-lo é escrever uma consulta JOIN.

A sintaxe de uma SQL JOIN é:

SELECT * 
FROM table1
JOIN table2
  ON table1.id1=table2.id2

Como este é um tutorial de SQL JOINs para iniciantes, vamos começar com o básico. Vamos revisar os elementos individualmente.

Após a palavra-chave FROM, você escreve o nome da primeira tabela da qual deseja tirar colunas. Em seguida, use a palavra-chave JOIN, seguida do nome da segunda tabela que você deseja usar.

Em seguida, a declaração ON informa a consulta sobre quais dados de colunas devem ser unidos. (Normalmente, esta é uma ID). Na sintaxe acima, juntamos as tabelas usando id1 de table1 e id2 de table2. Isto está escrito como table1.id1 e table2.id2 - após o nome da tabela, há um ponto e depois o nome da coluna.

Vale esclarecer que as colunas nas quais juntamos os dados nem sempre têm a forma de um ID. Elas também não precisam ter o mesmo nome. Por exemplo, é possível unir duas tabelas com base em chaves chamadas orders.post_code e cities.zip_code. Como você pode ver, isto não é um ID e os nomes das colunas para os códigos postais também são diferentes. Entretanto, ambas as colunas contêm códigos postais; dois campos correspondentes são necessários para fazer um SQL JOIN.

JUNÇÃO DE USUÁRIOS

Vamos continuar com nosso guia para iniciantes Cláusulas JOIN em SQL. Vamos ver como Cláusulas JOIN em SQL trabalhar em um exemplo simples. Suponha que queiramos descobrir qual artista gravou uma determinada canção. Neste modelo de dados básicos, existem apenas duas tabelas: song e artist. A tabela song contém as colunas song_id, song_title e artist_id. A tabela artist é composta de artist_id e artist_name. Como podemos ver, artist_id está em ambas as tabelas; podemos usá-la para juntá-las.

tab-1

O mais simples JOIN (também chamado INNER JOIN) pega a tabela da esquerda e combina as informações para cada linha da tabela da direita usando artist_id. Assim, a primeira canção, "Dancing Queen", tem um artist_id igual a "04"; na tabela artist, "04" é atribuído a "ABBA".

Como você pode ver na tabela artist, não há um artist_id igual a "06", que é atribuído à canção "Rolling in the Deep". Na tabela de resultados, são mostradas apenas as canções que combinam com um artist_name. Também não há nenhuma canção de Michael Jackson na tabela de resultados, pois não há tal canção na tabela song.

Lembre-se que INNER JOIN seleciona todas as linhas de ambas as tabelas , desde que haja uma correspondência entre as colunas em ambas as tabelas.

Aqui está o código:

SELECT *
FROM song
JOIN artist
  ON song.artist_id=artist.artist_id
tab-2

JOGO ESQUERDO

O segundo tipo de adesão que vamos mencionar neste Cláusulas JOIN em SQL tutorial para iniciantes é o LEFT JOIN. Ele sempre leva a primeira tabela (ou seja, a tabela logo após a palavra-chave FROM ) como um todo (todos os registros na primeira tabela). São necessários apenas os registros correspondentes da segunda tabela. Se não houver informação correspondente, um valor NULL é retornado. Isto significa que não há informações disponíveis para esse ID em particular.

Dê outra olhada na tabela artist. Não há artist_name com um artist_id igual a "06". É por isso que a canção "Rolling in the deep" não ocorreu no resultado da consulta INNER JOIN. Enquanto ela está listada no exemplo LEFT JOIN abaixo, ela tem valores NULL para artist_id e artist_name.

Aqui está a declaração SQL LEFT JOIN:

SELECT *
FROM song
LEFT JOIN artist
  ON song.artist_id=artist.artist_id
tab-3

JUNTO À DIREITA

O próximo tipo de adesão em nosso Cláusulas JOIN em SQL tutorial para iniciantes é o RIGHT JOIN. Ao contrário do LEFT JOIN, ele leva todos os registros da segunda tabela (a imediatamente após a palavra-chave JOIN ) e somente os registros da primeira tabela que têm correspondência artist_ids. Neste caso, não há músicas de Michael Jackson no banco de dados, portanto, há NULLs colocados para aqueles song_ids, song_titles e artist_ids. E agora "Rolling in the Deep" desapareceu, pois na tabela da direita (artist) não há artist_id igual a "06".

Aqui está o código:

SELECT *
FROM song
RIGHT JOIN artist
  ON song.artist_id=artist.artist_id
tab-4

JOGAR TOTALMENTE

O último tipo de JOIN que vamos discutir em nosso guia Cláusulas JOIN em SQL para iniciantes é o FULL JOIN. É uma combinação de LEFT JOIN e RIGHT JOIN, pois leva todos os registros de ambas as tabelas e coloca valores NULL onde faltam as informações da tabela correspondente. No exemplo abaixo, você pode ver NULLs para artist_id igual a "06 " (sim, deve ser Adele!) e NULLs para canções de Michael Jackson com artist_id igual a "05". (Sim, "Billie Jean" existe, mas SQL não o sabe!)

SELECT *
FROM song
FULL JOIN artist
  ON song.artist_id=artist.artist_id
tab-5

Exemplo da vida real: Lojas e Produtos

Agora vamos mostrar-lhe como usar Cláusulas JOIN em SQL em um verdadeiro exemplo comercial. Desta vez, nosso Cláusulas JOIN em SQL tutorial para iniciantes usará um exemplo da indústria varejista. Imagine que você administra uma loja e quer ver quais produtos estão fora de estoque. Você também quer verificar se seu gerente de banco de dados mantém as coisas em ordem. Vamos supor que o banco de dados tenha apenas duas tabelas: product e stock.

tab-6

Como você pode ver, a primeira tabela (product) tem duas colunas: product_id e product_name. Se tudo estiver em ordem, deve haver uma identificação e um nome para todos os produtos que já vendemos. A segunda tabela (stock) representa o estoque atual que temos na loja - por exemplo, há sete itens para o valor de "100" do product_id.

Por favor, dê uma olhada mais detalhada na coluna product_id em ambas as tabelas. Alguns identificadores estão presentes em ambas as tabelas(102, 105, 107); alguns estão apenas na esquerda(101, 103, 106); e alguns estão apenas na direita(100, 104). Esta informação será usada nos exemplos abaixo.

Desconsiderando informações ausentes

Quando queremos ver apenas os produtos atualmente em estoque e já sabemos todos os seus nomes, podemos usar uma declaração INNER JOIN. Ela seleciona apenas estes registros com uma identificação presente em ambas as tabelas às quais desejamos aderir. Como resultado, obtemos uma lista de três nomes de produtos e suas quantidades. Como você pode ver, você pode usar tanto JOIN como INNER JOIN declaração para fazer a mesma coisa. JOIN é uma abreviação para INNER JOIN. Os outros JOINs têm de ser especificados explicitamente.

UMA UNIÃO DE INNER

SELECT
  product_name,
  stock.product_id,
  quantity
FROM products
INNER JOIN stock
  ON product.product_id = stock.product_id
tab-7

Que produtos devem ser encomendados?

Suponhamos que queremos verificar quais produtos estão fora de estoque e precisam ser reordenados. Para fazer isso, usaremos um LEFT JOIN para fazer a correspondência dos registros da tabela product com a tabela stock. Podemos visualizar isso como colocando a tabela product à esquerda e a tabela stock à direita. Em seguida, procuramos por registros em ambas as tabelas que coincidam por product_id. Os registros sem coincidir com os campos product_id recebem um NULL. (Veja a tabela de resultados abaixo).

UMA JUNÇÃO À ESQUERDA

SELECT
  product_name,
  stock.product_id,
  quantity
FROM products
LEFT JOIN stock
  ON product.product_id = stock.product_id
tab-8

Portanto, na tabela stock não há valores product_id iguais a "101", "103" ou "106". É por isso que a tabela mostra NULLs para suco de laranja, café e cereais. Estes são os produtos que precisamos encomendar.

Sabemos o que vendemos?

O papel do gerente do banco de dados é manter tudo em ordem em nossos bancos de dados. Digamos que queremos verificar se ele ou ela está fazendo um bom trabalho. Vamos verificar se a tabela product está sendo atualizada com novos produtos. Para isso, usaremos um RIGHT JOIN.

RIGHT JOIN pega todos os registros da tabela stock e a coloca à direita (assim como o RIGHT JOIN sugere). Em seguida, ele exibe apenas os registros da tabela product que têm um product_id correspondente.

UMA JUNÇÃO À DIREITA

SELECT
  product_name,
  stock.product_id,
  quantity
FROM products
RIGHT JOIN stock
  ON product.product_id = stock.product_id
tab-9

Mostrar tudo o que está disponível

Para ter uma visão completa da situação, podemos querer ver todos os nomes de produtos e todas as suas quantidades em ambas as tabelas. Então, podemos ver quais produtos precisam ser reordenados e quais product_ids estão faltando um product_name. Para isso, FULL JOIN vem a calhar! Ele pega todos os registros da tabela da esquerda (product) e todos os registros da tabela da direita (stock) e corresponde apenas aos registros que têm a mesma identificação (product_id); ele insere um NULL à direita se faltar um product_name ou à esquerda se não houver itens em estoque.

JUNÇÃO COMPLETA

SELECT
  product_name,
  stock.product_id,
  quantity
FROM products
FULL JOIN stock
  ON product.product_id = stock.product_id
tab-10

Deseja saber mais sobre Cláusulas JOIN em SQL?

Você pode encontrar mais exemplos de utilização do Cláusulas JOIN em SQL em nosso canal no YouTube - We Learn SQL. Confira e lembre-se de se inscrever.

Espero que isto seja rápido. Cláusulas JOIN em SQL tutorial para iniciantes ajudou você a entender como unir dados de duas tabelas. Se você quiser mais informações, recomendo a inscrição na Academia Vertabelo, onde você pode aprender como usar SQL (e mais!) para lidar com bancos de dados. Os tópicos são apresentados de uma maneira simples e muito compreensível. Experimente hoje mesmo os cursos SQL da Academia Vertabelo gratuitamente!