Voltar para a lista de artigos Artigos
24 minutos de leitura

Junções de SQL: 12 perguntas práticas com respostas detalhadas

Neste artigo, aprofundamos nosso curso SQL JOINS e apresentamos 12 exercícios de junção para você resolver. Mas não se preocupe - todos os exercícios têm soluções e explicações. Se você ficar preso, a ajuda está à sua disposição! Afinal de contas, este curso foi criado para praticar e aprender.

As uniões de SQL podem ser complicadas. Não se trata apenas da sintaxe, mas também de saber quais uniões usar em quais cenários.

As uniões são usadas ao combinar dados de duas ou mais tabelas no SQL. As tabelas podem ser unidas de várias maneiras e, dependendo das tabelas, cada maneira de uni-las pode resultar em um resultado completamente diferente. Não há outra maneira de aprender isso a não ser praticando. Sim, você pode ler explicações e usos típicos das uniões de SQL. Isso ajuda, com certeza! Mas a prática se baseia nisso por meio da solução de problemas e da repetição, o que faz com que seu conhecimento se fixe. Quanto mais você praticar, maior será a possibilidade de que os problemas de dados da vida real que você terá de resolver sejam semelhantes ou completamente iguais ao que você já fez!

E é a prática que faremos neste artigo! Mostraremos a você exercícios para usos básicos e mais avançados de junções SQL. Se você gostar deles, vai gostar ainda mais do nosso Cláusulas JOIN em SQL pois todos os exercícios foram retirados de lá. No total, o curso oferece 93 exercícios sobre uniões de SQL. Eles abrangem tópicos que vão desde os tipos de junções no SQL até a filtragem de dados, junção de mais de duas tabelas, autojunção de uma tabela e uso de junções não equivalentes.

OK, então vamos apresentar os conjuntos de dados e começar a fazer os exercícios, certo? Sinta-se à vontade para se ajudar com a Folha de consulta SQL JOIN durante o processo.

Lista de exercícios

Aqui está uma lista de todos os exercícios do artigo:

INNER JOIN

INNER JOIN é um tipo de união SQL que retorna somente as linhas correspondentes das tabelas unidas.

Para mostrar como isso funciona, usaremos o Conjunto de dados 1 do curso.

Conjunto de dados 1

O conjunto de dados consiste em quatro tabelas: author, book, adaptation, e book_review.

A primeira tabela mostra os dados do autor nas colunas a seguir:

  • id - O ID exclusivo do autor no banco de dados.
  • name - O nome do autor.
  • birth_year - O ano em que o autor nasceu.
  • death_year - O ano em que o autor morreu (o campo estará vazio se ele ainda estiver vivo).

Aqui estão as primeiras linhas da tabela:

idnamebirth_yeardeath_year
1Marcella Cole1983NULL
2Lisa Mullins18911950
3Dennis Stokes19351994
4Randolph Vasquez19572004
5Daniel Branson19651990

A segunda tabela, bookmostra detalhes sobre os livros. As colunas são:

  • id - O ID de um determinado livro.
  • author_id - O ID do autor que escreveu esse livro.
  • title - O título do livro.
  • publish_year - O ano em que o livro foi publicado.
  • publishing_house - O nome da editora que imprimiu o livro.
  • classificação - A classificação média do livro.

Essas são as cinco primeiras linhas:

idauthor_idtitlepublish_yearpublishing_houserating
1NULLSoulless girl2008Golden Albatros4.3
2NULLWeak Heart1980Diarmud Inc.3.8
34Faith Of Light1995White Cloud Press4.3
4NULLMemory Of Hope2000Rutis Enterprises2.7
56Warrior Of Wind2005Maverick4.6

A tabela adaptation A tabela tem as seguintes colunas:

  • book_id - O ID do livro adaptado.
  • type - O tipo de adaptação (por exemplo, filme, jogo, peça de teatro, musical).
  • title - O nome dessa adaptação.
  • release_year - O ano em que a adaptação foi criada.
  • rating - A classificação média da adaptação.

Aqui está um instantâneo dos dados dessa tabela:

book_idtypetitlerelease_yearrating
1movieGone With The Wolves: The Beginning20083
3movieCompanions Of Tomorrow20014.2
5movieHomeless Warrior20084
2movieBlacksmith With Silver20144.3
4moviePatrons And Bearers20043.2

A tabela final é book_review. Ela consiste nas seguintes colunas:

  • book_id - O ID de um livro resenhado.
  • review - O resumo da resenha.
  • author - O nome do autor da resenha.

Aqui estão os dados:

book_idreviewauthor
1An incredible bookSylvia Jones
1Great, although it has some flawsJessica Parker
2Dennis Stokes takes the reader for a ride full of emotionsThomas Green
3Incredible craftsmanship of the authorMartin Freeman
4Not the best book by this authorJude Falth
5Claudia Johnson at her best!Joe Marqiz
6I cannot recall more captivating plotAlexander Durham

Exercício 1: Listar todos os livros e seus autores

Exercício: Mostre o nome de cada autor junto com o título do livro que ele escreveu e o ano em que o livro foi publicado.

Solução:

SELECT
  name,
  title,
  publish_year
FROM author
JOIN book
  ON author.id = book.author_id;

Explicação da solução: A consulta seleciona o nome do autor, o título do livro e o ano de publicação. Esses são os dados das duas tabelas: author e book. Podemos acessar as duas tabelas usando INNER JOIN. Ele retorna somente as linhas com valores correspondentes (valores que satisfazem a condição de união) de ambas as tabelas.

Primeiro, fazemos referência à tabela author na cláusula FROM. Em seguida, adicionamos a cláusula JOIN (que também pode ser escrita como INNER JOIN em SQL) e referenciamos a tabela book.

As tabelas são unidas na coluna comum. Nesse caso, é id da tabela author e author_id da tabela book. Queremos unir as linhas em que essas colunas compartilham o mesmo valor. Fazemos isso usando a cláusula ON e especificando os nomes das colunas. Também colocamos o nome da tabela antes de cada coluna para que o banco de dados saiba onde procurar. Isso se deve principalmente ao fato de haver uma coluna id em ambas as tabelas, mas queremos a coluna id somente da tabela author tabela. Ao fazer referência ao nome da tabela, o banco de dados saberá de qual tabela precisamos dessa coluna.

Saída da solução:

Aqui está o instantâneo de saída. Obtivemos todos esses dados unindo duas tabelas:

nametitlepublish_year
Marcella ColeGone With The Wolves2005
Lisa MullinsCompanions And Officers1930
Dennis StokesBlacksmith With Silver1984
Randolph VasquezFaith Of Light1995
Michael RostkovskyWarrior Of Wind2005

Exercício 2: Listar autores e livros publicados após 2005

Exercício: Mostre o nome de cada autor junto com o título do livro que ele escreveu e o ano em que o livro foi publicado. Mostre somente os livros publicados depois de 2005.

Solução:

SELECT
  name,
  title,
  publish_year
FROM author
JOIN book
  ON author.id = book.author_id
WHERE publish_year > 2005;

Explicação da solução: Este exercício e sua solução são praticamente os mesmos que o anterior. Isso se reflete no fato de a consulta selecionar as mesmas colunas e unir as tabelas da mesma forma que anteriormente.

A diferença é que agora o exercício pede que mostremos somente os livros publicados depois de 2005. Para isso, é necessário filtrar o resultado; fazemos isso usando a cláusula WHERE.

WHERE é uma cláusula que aceita condições usadas para filtrar os dados. Ela é escrita depois de unir as tabelas. Em nosso exemplo, filtramos fazendo referência à coluna publish_year depois de WHERE e usando o operador de comparação 'greater than' (>) para encontrar os anos posteriores a 2005.

Resultado da solução:

O resultado mostra apenas um livro publicado após 2005.

nametitlepublish_year
Darlene LyonsTemptations In Nature2007

Exercício 3: Mostrar livros adaptados dentro de 4 anos e com classificação inferior à da adaptação

Exercício: Para cada livro, mostre seu título, título da adaptação, ano de adaptação e ano de publicação.

Inclua apenas os livros com uma classificação inferior à classificação de sua adaptação correspondente. Além disso, mostre apenas os livros para os quais uma adaptação foi lançada dentro de quatro anos da publicação do livro.

Renomeie a coluna title da tabela book para book_title e a coluna title da tabela adaptation tabela para adaptation_title.

Solução:

SELECT
  book.title AS book_title,
  adaptation.title AS adaptation_title,
  book.publish_year,
  adaptation.release_year
FROM book
JOIN adaptation
  ON book.id = adaptation.book_id
WHERE adaptation.release_year - book.publish_year <= 4
  AND book.rating < adaptation.rating;

Explicação da solução: Vamos começar a explicar a solução a partir das cláusulas FROM e JOIN. As colunas que precisamos mostrar são das tabelas book e adaptation. Fazemos referência à primeira tabela em FROM e à segunda em JOIN.

Na cláusula ON, igualamos as duas colunas de ID do livro e especificamos a tabela de cada coluna. Isso é igual ao anterior, mas com nomes de tabela e coluna diferentes.

Agora, precisamos selecionar as colunas necessárias. O problema aqui é que há uma coluna title em ambas as tabelas. Para evitar ambiguidade, uma prática recomendada é fazer referência ao nome da tabela antes de cada coluna no site SELECT.

Observação: o procedimento acima é obrigatório apenas para colunas ambíguas. No entanto, é uma boa ideia fazer isso com todas as colunas; isso melhora a legibilidade do código e a abordagem permanece consistente.

Depois de selecionar as colunas, precisamos renomear algumas delas. Fazemos isso usando a palavra-chave AS e escrevendo um novo nome de coluna em seguida. Dessa forma, uma coluna title se torna book_title, a outra se torna adaptation_title. A atribuição de aliases aos nomes das colunas também ajuda a eliminar a ambiguidade.

Agora precisamos filtrar o resultado. A primeira condição é que a adaptação tenha sido lançada quatro anos ou menos após o livro. Novamente usamos o site WHERE e simplesmente deduzimos o ano de publicação do livro do ano de lançamento da adaptação. Em seguida, dizemos que a diferença deve ser menor ou igual a (<=) 4.

Também precisamos acrescentar a segunda condição, em que o livro tem uma classificação mais baixa do que a adaptação. É simples! A pergunta implica que tanto a primeira quanto a segunda condição devem ser satisfeitas. A pista está em AND, um operador lógico que usamos para adicionar a segunda condição. Aqui, ele usa o operador 'less than' (<) para comparar as duas classificações.

Saída da solução:

O resultado mostra três pares livro-adaptação que satisfazem as condições.

book_titleadaptation_titlepublish_yearrelease_year
Memory Of HopePatrons And Bearers20002004
Music At The LakeMusic At The Lake20042007
Companion Of TomorrowLighting Faith19491952

JUNÇÃO À ESQUERDA

Agora que você entendeu a essência de INNER JOIN, vamos passar para LEFT JOIN. É um tipo de junção externa que retorna todas as colunas da tabela da esquerda (a primeira) e somente as linhas correspondentes da tabela da direita (a segunda). Se houver dados não correspondentes, eles serão mostrados como NULL.

Você pode saber mais em nosso artigo sobre LEFT JOIN.

Exercício 4: Mostrar todos os livros e suas adaptações (se houver)

Exercício: Mostre o título de cada livro junto com o título de sua adaptação e a data de lançamento. Mostre todos os livros, independentemente de terem ou não adaptações.

Solução:

SELECT
  book.title,
  adaptation.title,
  adaptation.release_year
FROM book
LEFT JOIN adaptation
  ON book.id = adaptation.book_id;

Explicação da solução: Primeiro, selecionamos as colunas necessárias das duas tabelas. Em seguida, juntamos book (a tabela da esquerda) com adaptation (a tabela da direita) usando LEFT JOIN. Você vê que a sintaxe de junção do SQL é a mesma para INNER JOIN. A única coisa que muda é a palavra-chave join.

Observação: o SQL aceita tanto LEFT JOIN quanto LEFT OUTER JOIN. Eles são o mesmo comando.

Saída da solução:

O instantâneo de saída mostra os dados necessários, com alguns dos dados mostrados como NULL. Esses são os livros sem a adaptação.

titletitle-2release_year
Soulless girlGone With The Wolves: The Beginning2008
Faith Of LightCompanions Of Tomorrow2001
Warrior Of WindHomeless Warrior2008
Guarding The EmperorNULLNULL
Blacksmith With SilverNULLNULL

Exercício 5: Mostrar todos os livros e suas adaptações para o cinema

Exercício: Mostre todos os livros com suas adaptações cinematográficas. Selecione o título de cada livro, o nome de sua editora, o título de sua adaptação e o tipo de adaptação. Mantenha os livros sem adaptações no resultado.

Solução:

SELECT
  book.title,
  publishing_house,
  adaptation.title,
  adaptation.type
FROM book
LEFT JOIN adaptation
  ON book.id = adaptation.book_id
WHERE type = 'movie'
  OR type IS NULL;

Explicação da solução:

A pergunta pede para mostrar todas as linhas, mesmo aquelas sem nenhuma adaptação. É possível que haja livros sem adaptações, portanto, usamos LEFT JOIN.

Primeiro, selecionamos o título do livro, sua editora, o título da adaptação e seu tipo.

Em seguida, juntamos book (a tabela da esquerda) com adaptation (a tabela da direita) usando LEFT JOIN. Unimos as tabelas com base no ID do livro. Todos os livros que não satisfizerem as condições terão NULLs como título e tipo de adaptação.

Filtramos os dados usando WHERE. A primeira condição é que o tipo de adaptação deve ser um filme, portanto, igualamos a coluna type com um filme usando o sinal de igual (=). Observação: Ao usar dados de texto na condição WHERE, eles devem ser colocados entre aspas simples ('').

A segunda condição de filtragem é adicionada usando o operador lógico OR. Ela diz que o tipo também pode ser NULL se não for um filme. O exercício nos pede para manter os livros sem adaptações nos resultados.

Saída da solução:

Aqui está o instantâneo de saída. Você pode ver que ele mostra apenas os livros adaptados como filmes ou que não foram adaptados de forma alguma.

titlepublishing_housetitle-2type
Soulless girlGolden AlbatrosGone With The Wolves: The Beginningmovie
Faith Of LightWhite Cloud PressCompanions Of Tomorrowmovie
Warrior Of WindMaverickHomeless Warriormovie
Guarding The EmperorFlying Pen MediaNULLNULL
Blacksmith With SilverDiarmud Inc.NULLNULL

JUNÇÃO À DIREITA

Onde há LEFT JOIN, há também RIGHT JOIN, certo? Apesar de ser a imagem espelhada do LEFT JOIN, ele ainda faz parte da prática de junções do SQL.

É um tipo de união que retorna todas as colunas da tabela da direita (a segunda) e somente as linhas correspondentes da tabela da esquerda (a primeira). Se houver dados não correspondentes, eles serão mostrados como NULL.

Exercício 6: Mostrar todos os livros com suas resenhas (se houver)

Exercício: Unir as tabelas book_review e book usando um RIGHT JOIN. Mostre o título do livro, a resenha correspondente e o nome do autor da resenha. Considere todos os livros, mesmo aqueles que não foram resenhados.

Solução:

SELECT
  book.title,
  book_review.review,
  book_review.author
FROM book_review
RIGHT JOIN book
  ON book.id = book_review.book_id;

Explicação da solução:

Primeiro, selecionamos as colunas necessárias. Em seguida, fazemos o que foi solicitado: unimos as tabelas usando RIGHT JOIN. Juntamos as tabelas com o ID do livro. A tabela book é a tabela correta; queremos todos os dados dela, independentemente das resenhas.

Como você pode ver, a sintaxe permanece a mesma que em INNER JOIN e LEFT JOIN.

Observação: o SQL aceita tanto RIGHT JOIN quanto RIGHT OUTER JOIN.

Resultado da solução:

A consulta retorna todos os títulos de livros, suas resenhas e autores. Quando não há informações sobre a resenha ou o autor, é exibido um NULL.

titlereviewauthor
Soulless girlAn incredible bookSylvia Jones
Soulless girlGreat, although it has some flawsJessica Parker
Guarding The EmperorNULLNULL
Companions And OfficersNULLNULL
Blacksmith With SilverNULLNULL

JUNÇÃO COMPLETA

Aqui está outro tipo de união que é útil em alguns cenários: o FULL JOIN. Trata-se de LEFT JOIN e RIGHT JOIN juntos. Ele mostra as linhas correspondentes de ambas as tabelas, as linhas que não têm correspondência na tabela da esquerda e as linhas que não têm correspondência na tabela da direita. Em resumo, ele mostra todos os dados de ambas as tabelas.

Você pode ler mais sobre como e quando usar o FULL JOIN.

Exercício 7: Listar todos os livros e todos os autores

Exercício: Exiba o título de cada livro junto com o nome do autor. Mostre todos os livros, mesmo aqueles sem autor. Mostre todos os autores, mesmo aqueles que ainda não publicaram um livro. Use o endereço FULL JOIN.

Solução:

SELECT
  title,
  name
FROM book
FULL JOIN author
  ON book.author_id = author.id;

Explicação da solução: A pergunta requer a exibição de todos os livros, mas também de todos os autores - o site FULL JOIN é perfeito para fazer isso de forma elegante.

Selecionamos o título do livro e o nome do autor. Em seguida, FULL JOIN a tabela book com a tabela author. A condição de união é que o ID do autor deve ser o mesmo em ambas as tabelas. Novamente, a sintaxe é a mesma de todos os tipos de união anteriores.

Observação: o SQL aceita tanto FULL JOIN quanto FULL OUTER JOIN.

Resultado da solução:

O resultado mostra todos os livros e todos os autores, quer os autores ou livros existam em ambas as tabelas ou não.

titlename
Gone With The WolvesMarcella Cole
Companions And OfficersLisa Mullins
NULLDaniel Branson
Weep Of The WestNULL

Junção de 3 ou mais tabelas

Sim, as uniões de SQL permitem unir mais de duas tabelas. Veremos como fazer isso nesta parte da prática de uniões de SQL. Você pode encontrar uma explicação mais detalhada sobre junções múltiplas aqui.

Também precisamos de um novo conjunto de dados, portanto, vamos apresentá-lo.

Conjunto de dados 2

A primeira tabela do conjunto de dados é department. Suas colunas são:

  • id - O ID exclusivo do departamento.
  • name - O nome do departamento, ou seja, onde um tipo específico de produto é vendido.

Aqui estão os dados da tabela.

idname
1fruits
2vegetables
3seafood
4deli
5bakery
6meat
7dairy

A segunda tabela é producte consiste nas seguintes colunas:

  • id - O ID de um determinado produto.
  • name - O nome do produto.
  • department_id - O ID do departamento em que o produto está localizado.
  • shelf_id - O ID da prateleira do departamento onde o produto está localizado.
  • producer_id - O ID da empresa que fabrica esse produto.
  • price - O preço do produto.

Aqui está o instantâneo de dados:

idnamedepartment_idshelf_idproducer_idprice
1Apple11NULL0.5
2Avocado1171
3Banana1170.5
4GrapefruitNULL110.5
5Grapes1142

A próxima tabela é nutrition_data. Suas colunas e dados são fornecidos abaixo:

  • product_id - O ID de um produto.
  • calories - O valor calórico desse produto.
  • fat - A quantidade de gordura do produto.
  • carbohydrate - A quantidade de carboidratos do produto.
  • protein - A quantidade de proteína do produto.
product_idcaloriesfatcarbohydrateprotein
1130051
2504.531
31100301
4600151
NULL900230

A quarta tabela é denominada producer. Ela tem as seguintes colunas:

  • id - O ID de um determinado produtor de alimentos.
  • name - O nome do produtor.

Abaixo estão os dados dessa tabela:

idname
1BeHealthy
2HealthyFood Inc.
3SupremeFoods
4Foodie
5Gusto
6Baker n Sons
7GoodFoods
8Tasty n Healthy

A última tabela do conjunto de dados é sales_history. Ela tem as seguintes colunas:

  • date - A data da venda.
  • product_id - O ID do produto vendido.
  • amount - A quantidade desse produto vendida em um determinado dia.

Aqui estão os dados também:

dateproduct_idamount
2015-01-14114
2015-01-14113
2015-01-1522
2015-01-1626
2015-01-1738

Exercício 8: Mostrar produtos com menos de 150 calorias e seu departamento

Exercício: Liste todos os produtos que têm menos de 150 calorias. Para cada produto, mostre seu nome (renomeie a coluna product) e o nome do departamento onde ele pode ser encontrado (nomeie a coluna department).

Solução:

SELECT
  p.name AS product,
  d.name AS department
FROM department d
JOIN product p
  ON d.id = p.department_id
JOIN nutrition_data nd
  ON nd.product_id = p.id
WHERE nd.calories < 150;

Explicação da solução: O princípio geral de como você une a terceira (quarta, quinta...) tabela é simplesmente adicionar outra JOIN. Você pode ver como isso é feito neste artigo que explica as uniões múltiplas. Faremos isso da mesma forma aqui.

Primeiro, juntamos a tabela department com a tabela product na ID do departamento usando JOIN. Mas também precisamos da terceira tabela. Para obter os dados dela, basta adicionar outro JOIN, que unirá a tabela product com a tabela nutrition_data tabela. A sintaxe é a mesma da primeira união. Nesse caso, a consulta une as tabelas com base no ID do produto.

Em seguida, usamos WHERE para encontrar produtos com menos de 150 calorias. Por fim, selecionamos os nomes dos produtos e dos departamentos e renomeamos as colunas de acordo com as instruções do exercício.

Observação: Você provavelmente notou que as duas colunas selecionadas têm o mesmo nome original. E você também notou que resolvemos essa ambiguidade colocando alguns nomes curtos estranhos de tabelas na frente de todas as colunas da consulta. Esses nomes abreviados são aliases de tabela, que você dá simplesmente escrevendo-os após o nome da tabela em FROM ou JOIN. Ao dar aliases às tabelas, você pode abreviar os nomes das tabelas. Portanto, você não precisa escrever seus nomes completos (que às vezes podem ser muito longos!), mas sim os aliases curtos. Isso economiza tempo e espaço.

Saída da solução:

O resultado mostra uma lista dos produtos e o departamento ao qual pertencem. Ela inclui apenas os produtos com menos de 150 calorias.

productdepartment
Applefruits
Avocadofruits
Bananafruits
Kiwifruits
Lemonfruits

Exercício 9: Listar todos os produtos com seus produtores, departamentos e carboidratos

Exercício: Para cada produto, exiba o:

  • Nome da empresa que o produziu (nomeie a coluna producer_name).
  • Nome do departamento em que o produto está localizado (dê o nome department_name).
  • Nome do produto (nomeá-lo product_name).
  • Número total de carboidratos no produto.

Sua consulta ainda deve considerar produtos sem informações sobre producer_id ou department_id.

Solução:


SELECT
  prod.name AS producer_name,
  d.name AS department_name,
  p.name AS product_name,
  nd.carbohydrate
FROM product p
LEFT JOIN producer prod
  ON prod.id = p.producer_id
LEFT JOIN department d
  ON d.id = p.department_id
LEFT JOIN nutrition_data nd
  ON nd.product_id = p.id;

Explicação da solução: A consulta seleciona as colunas necessárias. Em seguida, ela une a tabela product com a tabela producer no ID do produtor usando LEFT JOIN. Escolhemos esse tipo de união porque precisamos incluir produtos sem dados do produtor.

Em seguida, adicionamos outro LEFT JOIN. Esse adiciona a tabela department e a une com a tabela product tabela. Novamente, escolhemos LEFT JOIN porque precisamos mostrar os produtos que não têm um departamento.

Há também uma terceira união! Simplesmente a adicionamos à cadeia das uniões anteriores. É novamente LEFT JOIN, pois adicionamos a tabela nutrition_data e a juntamos com a tabela product tabela.

Esse é um tópico interessante a ser explorado, portanto, aqui está um artigo que explica múltiplos LEFT JOINs para ajudá-lo com isso.

Resultado da solução:

O resultado mostra todos os produtos com seus nomes de produtores e departamentos e quantidades de carboidratos:

producer_namedepartment_nameproduct_namecarbohydrate
BeHealthyfruitsKiwi20
BeHealthyvegetablesBroccoli8
BeHealthymeatChickenNULL
BeHealthyNULLGrapefruit15
HealthyFood Inc.vegetablesCelery4

Se precisar de mais detalhes, leia como fazer LEFT JOIN em várias tabelas no SQL.

Exercício 10: Mostrar todos os produtos, preços, produtores e departamentos

Exercício: Para cada produto, mostre seu nome, preço, nome do produtor e nome do departamento.

Dê o nome alternativo às colunas como product_name, product_price, producer_name e department_name, respectivamente. Inclua todos os produtos, mesmo aqueles sem um produtor ou departamento. Além disso, inclua os produtores e departamentos sem um produto.

Solução:

SELECT
  p.name AS product_name,
  p.price AS product_price,
  prod.name AS producer_name,
  d.name AS department_name
FROM product p
FULL JOIN producer prod
  ON p.producer_id = prod.id
FULL JOIN department d
  ON d.id = p.department_id;

Explicação da solução: Este exercício requer o uso do site FULL JOIN, pois precisamos de todos os dados das tabelas que usaremos: product, producer, e department.

A sintaxe é a mesma dos exemplos anteriores. Apenas unimos as diferentes tabelas (product e producer) no ID do produtor e usamos um tipo diferente de união: FULL JOIN.

O segundo FULL JOIN une a tabela product com a tabela department tabela.

Depois de selecionar as colunas necessárias e renomeá-las, obtemos o seguinte resultado.

Saída da solução:

A solução mostra todos os dados das tabelas e colunas selecionadas:

product_nameproduct_priceproducer_namedepartment_name
Chicken5.5BeHealthymeat
Broccoli2.5BeHealthyvegetables
Kiwi0.3BeHealthyfruits
Grapefruit0.5BeHealthyNULL
Cucumber0.7HealthyFood Inc.vegetables

Self-Join

Uma autojunção não é um tipo distinto de SQL JOIN - qualquer junção pode ser usada para autojunção de uma tabela. É simplesmente uma união usada para unir a tabela a ela mesma. Ao fornecer aliases diferentes para a mesma tabela, ela é tratada como duas tabelas diferentes quando unida a si mesma.

Para obter mais detalhes, confira nosso guia ilustrado sobre a autojunção do SQL.

Conjunto de dados 3

O conjunto de dados deste exemplo consiste em apenas uma tabela: workshop_workers. Ela tem as seguintes colunas.

  • id - ID do trabalhador.
  • name - Nome e sobrenome do trabalhador.
  • specialization - A especialização do trabalhador.
  • master_id - O ID do supervisor do funcionário.
  • experience - Os anos de experiência do trabalhador.
  • project_id - O ID do projeto ao qual o funcionário está atribuído no momento.

Aqui estão os dados:

idnamespecializationmaster_idexperienceproject_id
1Mathew ConnwoodworkingNULL201
2Kate Brownwoodworking141
3John Doeincrusting531
4John Kowalskywatchmaking723
5Suzan GregowitchincrustingNULL154

Exercício 11: Listar todos os trabalhadores e seus supervisores diretos

Exercício: Mostre os nomes de todos os trabalhadores juntamente com os nomes de seus supervisores diretos. Renomeie as colunas para apprentice_name e master_name, respectivamente. Considere apenas os trabalhadores que têm um supervisor (ou seja, um mestre).

Solução:

SELECT
  apprentice.name AS apprentice_name,
  master.name AS master_name
FROM workshop_workers apprentice
JOIN workshop_workers master
  ON apprentice.master_id = master.id;

Explicação da solução: Vamos começar explicando a união automática. O princípio geral é o mesmo das uniões regulares. Fazemos referência à tabela em FROM e lhe damos um alias, apprentice. Em seguida, usamos o site JOIN e fazemos referência à mesma tabela nele. Dessa vez, damos à tabela o alias master. Basicamente, estamos fingindo que uma tabela tem os dados do aprendiz e a outra tem os dados do mestre.

As tabelas são unidas pelo ID mestre da tabela apprentice e o ID da tabela master da tabela.

Este exemplo é um uso típico de um self-join: a tabela tem uma coluna (master_id) que faz referência a outra coluna da mesma tabela (id). Ambas as colunas mostram o ID do trabalhador. Quando há NULL em master_id, isso significa que o trabalhador não tem um mestre. Em outras palavras, ele é o mestre.

Após a união automática, basta selecionar as colunas necessárias e renomeá-las.

Saída da solução:

O resultado mostra todos os aprendizes e seus supervisores diretos.

apprentice_namemaster_name
Kate BrownMathew Conn
John DoeSuzan Gregowitch
John KowalskyJoe Darrington
Peter ParkerJoe Darrington
Mary SmithMathew Conn
Carlos BellSuzan Gregowitch
Dennis WrightJoe Darrington

Uniões não-Equi

O último tópico que abordaremos nesta prática de uniões de SQL são as uniões não equitativas. As uniões que usamos até agora são chamadas de equi-joins porque usam o sinal de igualdade (=) na condição de união. Non-equi são todas as outras uniões que usam outros operadores - operadores de comparação (<, >, <=, >=, !=, <>), o operador BETWEEN ou qualquer outra condição lógica - para unir tabelas.

Conjunto de dados 4

Usaremos o conjunto de dados que consiste em duas tabelas. A primeira tabela é car. Aqui estão suas colunas:

  • id - O ID do carro no banco de dados.
  • model - O modelo do carro.
  • brand - A marca do carro.
  • original_price - O preço original do carro quando novo.
  • mileage - A quilometragem total do carro.
  • prod_year - O ano de produção do carro.

Os dados têm a seguinte aparência:

idmodelbrandoriginal_pricemileageprod_year
1SpeedsterTeiko80,000150,0001999
2RoadmasterTeiko110,00030,0001980
3SundryTeiko40,00025,0001991
4FuruDomus50,00010,0002002
5EmperorDomus65,000140,0002005
6KingDomus200,0006,0001981
7EmpressDomus60,0007,6001997
8FuryTatsu150,00013,0001993

A segunda tabela é charity_auction com estas colunas:

  • car_id - ID do carro.
  • initial_price - O preço inicial do carro (ou seja, inicial).
  • final_price - O preço real quando o carro foi vendido.
  • buyer_id - O ID da pessoa que comprou o carro.

Aqui estão os dados:

car_idinitial_pricefinal_pricebuyer_id
165,000NULLNULL
335,00050,0001
550,000120,0003
6350,000410,0004
765,000NULLNULL

Exercício 12: Mostrar carros com maior quilometragem do que um carro específico

Exercício: Mostre o modelo, a marca e o preço final de cada carro vendido no leilão. Considere apenas os carros vendidos que têm mais quilometragem do que o carro com o endereço id = 4.

Solução:

SELECT
  car.model,
  car.brand,
  car.final_price
FROM car
JOIN charity_auction ca
  ON car.id = ca.car_id
JOIN car car2
  ON car.mileage > car2.mileage
WHERE car2.id = 4
  AND final_price IS NOT NULL;

Explicação da solução: Selecionamos o modelo do carro, a marca e o preço final.

No primeiro JOIN, juntamos a tabela car com a tabela charity_auction tabela. As tabelas são unidas quando os IDs dos carros são os mesmos. Esse é o nosso equi JOIN regular.

Adicionamos o segundo JOIN, que é uma autojunção. Ele adiciona a tabela car novamente, para que possamos filtrar os dados usando a condição de união não equitativa. A condição retornará todos os carros da tabela car e todos os carros da tabela car2 com a menor quilometragem. Essa é uma condição não equivalente, pois usa o operador "maior que" ( > ). A sintaxe é a mesma, mas desta vez há > em vez de =.

Por fim, precisamos filtrar os dados usando WHERE. Não estamos interessados em comparar a quilometragem de todos os carros. Queremos mostrar os carros que têm uma quilometragem maior do que a do carro com id = 4. É isso que a primeira condição de filtragem faz.

Adicionamos outra condição de filtragem que diz que o preço final não deve ser NULL, ou seja, o carro deve ter sido vendido em um leilão.

Saída da solução:

O resultado mostra dois carros:

modelbrandfinal_price
SundryTeiko50,000
EmperorDomus120,000

Cláusulas JOIN em SQL A prática leva à perfeição. Mais prática? Mais perfeito!

Doze exercícios de junção de SQL são uma boa quantidade de prática. Com esses exercícios, você poderá aprender e praticar todos os tópicos de junção mais comuns que incomodam os usuários iniciantes e intermediários.

Agora, você só precisa continuar! Quando você pratica ainda mais, torna-se ainda mais perfeito. Portanto, se você gostou dos nossos exercícios, pode obter mais do mesmo em nosso curso SQL JOINS ou no artigo sobre as perguntas da entrevista sobre SQL JOIN.

Esperamos que você acerte todos os exercícios que o aguardam lá!