26th Oct 2023 24 minutos de leitura Junções de SQL: 12 perguntas práticas com respostas detalhadas Tihomir Babic sql join join joins práticas sql Índice Lista de exercícios INNER JOIN Conjunto de dados 1 Exercício 1: Listar todos os livros e seus autores Exercício 2: Listar autores e livros publicados após 2005 Exercício 3: Mostrar livros adaptados dentro de 4 anos e com classificação inferior à da adaptação JUNÇÃO À ESQUERDA Exercício 4: Mostrar todos os livros e suas adaptações (se houver) Exercício 5: Mostrar todos os livros e suas adaptações para o cinema JUNÇÃO À DIREITA Exercício 6: Mostrar todos os livros com suas resenhas (se houver) JUNÇÃO COMPLETA Exercício 7: Listar todos os livros e todos os autores Junção de 3 ou mais tabelas Conjunto de dados 2 Exercício 8: Mostrar produtos com menos de 150 calorias e seu departamento Exercício 9: Listar todos os produtos com seus produtores, departamentos e carboidratos Exercício 10: Mostrar todos os produtos, preços, produtores e departamentos Self-Join Conjunto de dados 3 Exercício 11: Listar todos os trabalhadores e seus supervisores diretos Uniões não-Equi Conjunto de dados 4 Exercício 12: Mostrar carros com maior quilometragem do que um carro específico Cláusulas JOIN em SQL A prática leva à perfeição. Mais prática? Mais perfeito! 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: Exercício 1: Listar todos os livros e seus autores Exercício 2: Listar autores e livros publicados após 2005 Exercício 3: Mostrar livros adaptados em um período de 4 anos e com classificação inferior à da adaptação Exercício 4: Mostrar todos os livros e suas adaptações (se houver) Exercício 5: Mostrar todos os livros e suas adaptações para o cinema Exercício 6: Mostrar todos os livros com suas resenhas (se houver) Exercício 7: Listar todos os livros e todos os autores Exercício 8: Mostrar produtos com menos de 150 calorias e seu departamento Exercício 9: Listar todos os produtos com seus produtores, departamentos e carboidratos Exercício 10: Mostrar todos os produtos, preços, produtores e departamentos Exercício 11: Listar todos os trabalhadores e seus supervisores diretos Exercício 12: Mostrar carros com maior quilometragem do que um carro específico 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á! Tags: sql join join joins práticas sql