Voltar para a lista de artigos Artigos
11 minutos de leitura

Dicas de SQL JOIN Tips for Beginners

Se você é um iniciante e quer saber como começar a usar Cláusulas JOIN em SQL em suas consultas, você veio ao lugar certo.

O uso da cláusula SQL JOIN é necessário se você quiser consultar várias tabelas. Mais cedo ou mais tarde, você terá que usar mais de uma tabela em uma consulta. É a natureza dos bancos de dados relacionais em geral - eles consistem em dados que normalmente são salvos em múltiplas tabelas; por sua vez, estes formam um banco de dados. Uma vez que você se familiarize com as consultas SQL básicas, é sábio começar a aprender a cláusula JOIN. Além das dicas deste artigo, nosso curso Cláusulas JOIN em SQL pode lhe ajudar com isto.

Neste artigo, eu o acompanharei em quatro dicas para o uso da cláusula JOIN. Mas primeiro, deixe-me mostrar as tabelas com as quais vamos trabalhar.

Conheça as Tabelas

Ao ajudá-lo com JOINs, vou utilizar três tabelas:

  • manufacturer
  • product_type
  • product

A mesa manufacturer contém os seguintes atributos:

O fabricante da tabela contém os seguintes atributos:

  • id - O número de identificação do fabricante no banco de dados.
  • nome_do_fabricante - O nome do fabricante.

A segunda tabela é do tipo product_type, que tem estes atributos:

  • id - O ID do tipo do produto.
  • type_name - O nome do tipo de produto.

A última tabela é a tabela do produto, que tem quatro atributos:

  • id - O ID do produto.
  • nome_do_produto - O nome do produto.
  • type - O tipo do produto; referências da tabela.
  • manufactured_by - O nome do fabricante do produto; referências à tabela

Chegou a hora da primeira dica!

Dica #1: Use a sintaxe explícita da junta

Você provavelmente está se perguntando o que isso significa! Não se preocupe; dentro de alguns instantes estará claro.

Como você sabe, a cláusula JOIN é usada para combinar ou unir dados de duas ou mais tabelas. Entretanto, esta não é a única maneira de unir tabelas. Há também uma antiga sintaxe - de antes do SQL-92 - na qual as tabelas são unidas listando-as na cláusula FROM. Esta sintaxe é usada por muitos iniciantes, o que é bom e fará exatamente o mesmo trabalho que uma sintaxe explícita de JOIN. Mas o aprendizado da sintaxe explícita JOIN compensa a longo prazo. Tem vários benefícios sobre as tabelas de listagem na cláusula FROM, das quais falarei mais adiante neste artigo.

Mostrarei a você como funcionam as tabelas não explícitas de junção. Digamos que você queira obter uma lista de produtos junto com os nomes de seus fabricantes. Veja como fazer isso listando duas tabelas na cláusula FROM:

SELECT	product.id,
		product.product_name,
		manufacturer.manufacturer_name
FROM product, manufacturer
WHERE product.manufactured_by = manufacturer.id;

Primeiro listei as colunas que quero no resultado. Elas são id e product_name da tabela product e manufacturer_name da tabela manufacturer. Em seguida, listei os dois product e o manufacturer tabela na cláusula FROM. Finalmente, afirmei que a coluna manufactured_by da tabela product deve ser igual à coluna id da tabela manufacturer.

O resultado?

idproduct_namemanufacturer_name
1SuperFXQuazySoftware
2UnterBDieBeste
3HyperXYZFabricaInfinita
4TurboRayQuazySoftware
5VeryTradeDieBeste
6BlueSkyFabricaInfinita
7DirtyGrittyQuazySoftware
8SmoothUndertakerDieBeste
9HelioTrollFabricaInfinita

Você pode obter o mesmo resultado usando a declaração JOIN:

SELECT	product.id,
		product.product_name,
		manufacturer.manufacturer_name
FROM product JOIN manufacturer 
ON product.manufactured_by = manufacturer.id;

A parte SELECT é a mesma em ambas as consultas. Mas ao invés de simplesmente listar duas tabelas na cláusula FROM, eu me juntei a elas escrevendo explicitamente a cláusula JOIN. Se você escrever esta cláusula, é necessário especificar quais colunas serão usadas ao conectar as duas tabelas. Você faz isso usando a cláusula ON e conectando a coluna manufactured_by a partir da tabela product com a coluna id da tabela manufacturer. Se você olhar mais de perto, você notará que a cláusula ON funciona como a cláusula WHERE na consulta anterior.

Por que eu recomendo o uso de uma declaração explícita JOIN? Primeiro, desta forma é possível ver facilmente que tipo de junção é usado para combinar as tabelas. Existem quatro tipos de uniões (união interna, união esquerda, união direita e união completa), que discutirei mais adiante. Quando o tipo de join é declarado explicitamente na consulta, é mais fácil entender o que a consulta faz.

A outra razão para usar a sintaxe explícita JOIN é ver a diferença entre as condições de adesão e as condições de filtragem. Como a cláusula WHERE é usada para filtrar dados, pode ser confuso usá-la para juntar tabelas.

Há mais vantagens de usar JOINs explícitos que não tenho espaço para cobrir; veja este artigo, que fala sobre as vantagens do Cláusulas JOIN em SQL, para mais detalhes.

Se você precisar recapitular seus conhecimentos básicos de SQL antes de seguir adiante, nosso curso SQL para Iniciantes pode ser ideal para isso. Você também pode usar sua seção JOIN para começar a aprender como se juntar às mesas.

Dica #2: Use aliases de tabelas

Para mostrar o que quero dizer com os pseudônimos e porque eles são úteis, deixe-me mostrar-lhe como fica uma consulta sem eles. Se eu quisesse listar todos os produtos e seus nomes de tipo de produto, aqui está uma maneira de fazer isso:

SELECT	product.id,
		product.product_name,
		product_type.type_name
FROM product 
JOIN product_type 
ON product.type = product_type.id;

Primeiro, a explicação da consulta. Como no exemplo anterior, esta consulta seleciona as colunas id e product_name da tabela product. Ele também seleciona a coluna type_name da tabela product_type. As tabelas product e product_type são unidas no tipo de coluna da tabela product e a coluna id da tabela product_type.

Aqui está o resultado:

idproduct_nametype_name
1SuperFXServer
2UnterBServer
3HyperXYZServer
4TurboRayLaptop
5VeryTradeLaptop
6BlueSkyLaptop
7DirtyGrittySoftware
8SmoothUndertakerSoftware
9HelioTrollSoftware

Mesmo que esta consulta não seja complicada, escrevê-la é incômoda. Toda vez que quero fazer referência à tabela, tenho que escrever seu nome completo. Se isso não for suficiente, há também uma tabela cujo nome consiste em duas palavras e um sublinhado. Imagine se houvesse mais tabelas e com nomes mais longos! No entanto, há uma maneira de facilitar sua vida. Em vez de escrever os nomes completos das mesas, você pode atribuir um pseudônimo a cada uma delas:

SELECT	p.id,
		p.product_name,
		pt.type_name
FROM product p 
JOIN product_type pt 
ON p.type = pt.id;

Esta é exatamente a mesma consulta que a anterior, mas usa pseudônimos de tabela em vez de nomes completos. Dê uma olhada! Atribuí os pseudônimos nas cláusulas FROM e JOIN. Você vai notar a diferença; a tabela product é agora chamada pe a mesa product_type é agora chamada pt. Naturalmente, com os nomes das tabelas alterados, esses novos nomes devem ser usados ao selecionar as colunas id, product_name, e type_name.

Acho que a consulta agora parece muito melhor. E com certeza foi mais confortável escrevê-la! Mais um conselho; use pseudônimos significativos! A prática usual é usar a primeira ou duas letras do nome da mesa ou a primeira letra de cada palavra no nome da mesa. A questão é que seu pseudônimo deve ser o mais curto possível, mas também deve parecer uma escolha "natural" para um pseudônimo; você deve ser capaz de saber imediatamente qual pseudônimo se refere a qual tabela.

Dica #3: Conheça a diferença entre os diferentes tipos de alias

Já mencionei antes que existem quatro tipos básicos JOIN:

  • INNER JOIN
  • LEFT JOIN
  • RIGHT JOIN
  • FULL OUTER JOIN

A cláusula INNER JOIN retornará apenas os registros correspondentes que são os mesmos em ambas as tabelas. Note-se que INNER JOIN é o mesmo que JOIN.

O LEFT JOIN retorna todos os registros da tabela da esquerda (a primeira tabela, colocada após FROM) e somente os registros correspondentes da tabela da direita (a segunda tabela, colocada após JOIN).

Por outro lado, o RIGHT JOIN retorna todos os registros da tabela da direita e somente os registros correspondentes da tabela da esquerda.

Finalmente, o FULL OUTER JOIN retorna todos os registros de ambas as tabelas. Quaisquer registros não coincidentes são preenchidos com valores NULL. Esta junção potencial retorna uma enorme quantidade de dados. Note que FULL OUTER JOIN é o mesmo que FULL JOIN.

Uma explicação mais detalhada, mas mais amigável para iniciantes, pode ser encontrada neste artigo sobre os tipos de SQL JOIN.

Eu sei que pode ser difícil lembrar de tudo, especialmente se você é um iniciante ou não usa joins com muita freqüência. Mas não há necessidade de lembrar de tudo porque há a folha de consultas SQL JOIN. Você pode salvá-la ou imprimi-la e usá-la sempre que usar a cláusula JOIN ou quiser aprender algo novo num piscar de olhos.

Na prática, você usará com mais freqüência INNER JOIN e LEFT JOIN, então vamos nos concentrar nesses dois. Você já viu como usar INNER JOIN nos exemplos anteriores. Deixe-me agora mostrar-lhe como funciona LEFT JOIN.

Neste exemplo, vamos listar todos os tipos de produtos e produtos pertencentes a cada categoria. Você poderia fazer desta forma:

SELECT	pt.id,
		pt.type_name,
		p.product_name
FROM product_type pt 
LEFT JOIN product p 
ON pt.id = p.type;

Esta consulta primeiro seleciona as colunas desejadas; nada de novo aqui. Em seguida, junta as duas tabelas e lhes atribui pseudônimos. Eu juntei a tabela usando algo novo; a declaração LEFT JOIN. Só para lembrar, esta junção seleciona todas as linhas da tabela da esquerda (product_type) e as fileiras correspondentes da tabela da direita (product). Isto é exatamente o que eu precisava; dê uma olhada:

idtype_nameproduct_name
1SoftwareDirtyGritty
1SoftwareSmoothUndertaker
1SoftwareHelioTroll
2LaptopTurboRay
2LaptopVeryTrade
2LaptopBlueSky
3ServerSuperFX
3ServerUnterB
3ServerHyperXYZ
4ScooterNULL
5PrinterNULL

Note que não há produtos para as categorias "Scooter" e "Printer". Nos casos em que não houver linhas correspondentes na tabela correta, o resultado será NULL.

Dica #4: Mapeamento de Múltiplas Junções

Você não está limitado a juntar apenas duas mesas; você pode juntar três ou mais mesas. Deixe-me primeiro mostrar-lhe como fazê-lo, e depois lhe darei algumas dicas úteis.

Sua tarefa é listar todos os produtos junto com seu tipo de produto e nome do fabricante. Este código fará isso:

SELECT	p.id,
		p.product_name,
		pt.type_name,
		m.manufacturer_name
FROM product p 
JOIN product_type pt
	ON p.type = pt.id 
JOIN manufacturer m 
	ON p.manufactured_by = m.id;

Como nos exemplos anteriores, este código seleciona primeiro as colunas que serão mostradas no resultado. A tabela product é unido à mesa product_type; você já praticou isso. OK, mas agora você precisa dos dados da tabela manufacturerComo você se junta a ela? Você simplesmente escreve outra cláusula JOIN e especifica a tabela desejada.

Entretanto, mesmo que a adesão venha depois da tabela product_typenão significa que a mesa manufacturer é unido a esta tabela, pelo menos neste caso. Não, ela está unida à mesa product. Isto é óbvio a partir das colunas que especifiquei; as tabelas estão conectadas através das colunas manufactured_by da tabela product e id de manufacturer.

Aqui está o resultado:

idproduct_nametype_namemanufacturer_name
1SuperFXServerQuazySoftware
2UnterBServerDieBeste
3HyperXYZServerFabricaInfinita
4TurboRayLaptopQuazySoftware
5VeryTradeLaptopDieBeste
6BlueSkyLaptopFabricaInfinita
7DirtyGrittySoftwareQuazySoftware
8SmoothUndertakerSoftwareDieBeste
9HelioTrollSoftwareFabricaInfinita

Quando você une várias tabelas, é uma boa idéia mapear as tabelas às quais você quer se juntar. Faça um pequeno desenho; é mais fácil visualizar as uniões dessa maneira. Isto é especialmente útil se você estiver fazendo uma junção à esquerda ou à direita. Você não terá que imaginar; a mesa que você desenha do lado esquerdo é sua mesa esquerda e LEFT JOIN lhe dará todos os dados da mesma. A mesa que você desenha do lado direito é a mesa da direita. Parece óbvio, mas é mais difícil imaginá-la sem desenhar, particularmente se você for um principiante. O desenho pode ser algo tão simples quanto isto:

Desenho

Outra dica é listar as colunas na declaração SELECT na mesma ordem em que você se junta às tabelas. Se você olhar para a consulta acima, as colunas são das tabelas product, product_typee manufacturerrespectivamente. As tabelas são unidas exatamente na mesma ordem. Isto tornará seu código mais legível e mais fácil de ser modificado.

Por último, mas não menos importante, sempre junte as mesas em uma espécie de corrente. Em outras palavras, cada mesa que você une deve ser unida à(s) mesa(s) que já estão unidas em sua consulta. Se você se juntar a duas mesas e depois decidir se juntar a outra, a terceira mesa não pode ser deixada "pendurada solta", desvinculada das mesas anteriores. Certifique-se de que as condições ON liguem a nova mesa às mesas previamente unidas. Veja como NÃO o fazer:

Desenho

Você aprendeu muito. Isto não é tudo o que você precisa saber sobre como juntar três mesas, é claro. Há detalhes que eu não mencionei que são bem explicados neste artigo sobre uniões de várias mesas. E agora que você já sabe sobre a JUNTA ESQUERDA e a união de várias mesas, por que não aprender a JUNTA ESQUERDA várias mesas?

Será que aprender isso era possível?

Com estas dicas sobre o uso de uniões em SQL, eu tentei tornar seus primeiros passos o mais fácil possível. Você aprendeu como unir duas tabelas usando tanto a sintaxe explícita JOIN quanto as tabelas de listagem na cláusula FROM. Junto com isso, você aprendeu a usar pseudônimos e o que diferentes uniões fazem. Finalmente, eu lhe mostrei como unir três tabelas. Acho que este é um grande passo para você em muito pouco tempo. Parabéns!

Então, como você pode colocar todas estas dicas em prática? Este artigo sobre a prática Cláusulas JOIN em SQL irá ajudá-lo a encontrar a abordagem mais adequada para você. Ou você pode praticar usando nosso SQL para Iniciantes ou Cláusulas JOIN em SQL curso. Depende de quão detalhado você quer que seus conhecimentos sejam.

Gostaria de compartilhar sua experiência em unir-se às mesas? A seção de comentários espera por você!