SQLShack (Português)

Se você deseja obter algo significativo com os dados , quase sempre você precisará juntar várias tabelas. Neste artigo, mostraremos como fazer isso usando diferentes tipos de junções. Para isso, combinaremos INNER JOINs e LEFT JOINs. Então, vamos começar.

O modelo

Na imagem abaixo você pode ver o modelo existente. É composto por 6 tabelas e já, mais ou menos, o descrevemos em artigos anteriores.

Mesmo assim, mesmo sem descrever, se o banco de dados for modelado e apresentado de maneira adequada (escolhendo nomes com sabedoria, usando convenção de nomenclatura, seguindo as mesmas regras em todo o modelo, linhas / relações no esquema não se sobrepõem mais do que o necessário), você deve ser capaz para concluir onde você pode encontrar os dados de que precisa. Isso é crucial porque antes de unir várias tabelas, você precisa primeiro identificar essas tabelas.

Falaremos sobre a convenção de nomenclatura e o conselho sobre como pensar ao escrever consultas SQL, mais adiante neste Series. Até agora, vamos conviver com o fato de que este modelo é muito simples e podemos fazer isso com bastante facilidade.

O que sabemos até agora?

Nesta série, nós coberto:

  • Noções básicas relacionadas à instrução SQL SELECT e
  • INNER JOIN e LEFT JOIN comparados

Usaremos o conhecimento de ambos esses artigos e combiná-los para escrever instruções SELECT mais complexas que unirão várias tabelas.

Junte várias tabelas usando INNER JOIN

O primeiro exemplo que analisaremos é como recuperar dados de várias tabelas usando apenas INNER JOINs. Para cada exemplo, iremos com a definição do problema que devemos resolver e a consulta que faz o trabalho. Então, vamos começar com o primeiro problema.

# 1 Precisamos listar todas as chamadas com seus horários de início e término. Para cada chamada, queremos exibir qual foi o resultado, bem como o nome e o sobrenome do funcionário que fez a chamada. Classificaremos nossas chamadas por horário de início crescente.

Antes de escrever a consulta, identificaremos as tabelas que precisamos usar. Para fazer isso, precisamos determinar quais tabelas contêm os dados de que precisamos e incluí-los. Além disso, devemos incluir todas as tabelas ao longo do caminho entre essas tabelas – tabelas que não contêm dados necessários, mas servem como uma relação entre tabelas que contêm (esse não é o caso aqui).

A consulta que faz o trabalho é fornecida abaixo:

O resultado da consulta é fornecido abaixo:

Há algumas coisas que eu gostaria de apontar aqui:

  • As tabelas que juntamos estão aqui porque os dados que precisamos está localizado nessas 3 tabelas
  • Cada vez que menciono qualquer atributo de qualquer tabela, estou usando o formato nome_tabela.nome_do_atributo (por exemplo, funcionário.first_name). Embora não seja necessário, é uma boa prática, porque às vezes 2 ou mais tabelas na mesma consulta podem usar os mesmos nomes de atributos e isso levaria a um erro.
  • Usamos INNER JOIN 2 vezes em ordem para juntar 3 mesas. Isso resultará no retorno apenas de linhas com pares em outra tabela
  • Quando você está usando apenas INNER JOINs para juntar várias tabelas, a ordem dessas tabelas nas junções não é importante. A única coisa importante é que você use as condições de junção apropriadas após o “ON” (junção usando chaves estrangeiras)

Visto que todas as chamadas tinham funcionário e resultado da chamada relacionados, obteríamos o mesmo resultado se usamos LEFT JOIN em vez de INNER JOIN.

Junte-se a várias tabelas usando LEFT JOIN

Escrever consultas que usam LEFT JOINs não difere muito quando comparado a escrever consultas usando INNER JOINs. O resultado, é claro, seria diferente (pelo menos nos casos em que alguns registros não têm um par em outras tabelas).

Este é o problema que queremos resolver.

# 2 Liste todos os condados e clientes relacionados a esses países. Para cada país exibir seu nome em inglês, o nome da cidade do cliente está localizado em, bem como o nome desse cliente. Retorne até mesmo países sem cidades relacionadas e clientes.

As tabelas contendo os dados de que precisamos estão na imagem abaixo:

Primeiro, vamos verifique rapidamente qual é o cont ents dessas 3 tabelas.

Podemos notar duas coisas importantes:

  • Embora cada cidade tenha um país relacionado, nem todos os países têm cidades relacionadas (Espanha & Rússia não as tem)
  • O mesmo vale para os clientes.Cada cliente tem o valor city_id definido, mas apenas 3 cidades estão sendo usadas (Berlim, Zagreb & Nova York)

Vamos primeiro anotar o consulta usando INNER JOIN:

O resultado da consulta é mostrado na imagem abaixo:

Nós temos 7 condados e 6 cidades em nosso banco de dados, mas nossa consulta retorna apenas 4 linhas. Isso se deve ao fato de termos apenas 4 clientes em nosso banco de dados. Cada um desses 4 está relacionado à sua cidade e a cidade está relacionada ao país. Assim, INNER JOIN eliminou todos esses países e cidades sem clientes. Mas como incluí-los no resultado também?

Para fazer isso, usaremos LEFT JOIN. Vamos simplesmente substituir todos “INNER” por “LEFT” para que nossa consulta seja a seguinte:

O resultado é mostrado na imagem abaixo:

Você pode notar facilmente que agora temos todos os países, mesmo aqueles sem nenhuma cidade relacionada (Rússia & Espanha), bem como todos cidades, mesmo aquelas sem clientes (Varsóvia, Belgrado & Los Angeles). As 4 linhas restantes são iguais às da consulta usando INNER JOIN.

LEFT JOIN – a ordem das tabelas é importante

Embora a ordem dos JOINs em INNER JOIN não seja importante, o mesmo não significa LEFT JOIN. Quando usamos LEFT JOIN para juntar várias tabelas, é importante lembrar que essa junção incluirá todas as linhas da tabela no lado LEFT de JOIN. Vamos reorganizar a consulta anterior:

No início, você poderia facilmente dizer que esta consulta e a anterior são iguais (isso é verdade quando se usa INNER JOIN). Usamos as mesmas tabelas, LEFT JOINs e as mesmas condições de junção. Vamos dar uma olhada na saída primeiro:

Então, o que aconteceu aqui? Por que temos 4 linhas (as mesmas 4 que tínhamos quando usamos INNER JOIN)?

A resposta é simples e está relacionada a como LEFT JOIN funciona. Ele pega a primeira tabela (cliente) e junta todas as suas linhas (4 delas) à próxima tabela (cidade). O resultado disso são 4 linhas porque o cliente pode pertencer a apenas 1 cidade. Em seguida, juntamos essas 4 linhas à próxima tabela (país) e, novamente, temos 4 linhas porque a cidade poderia pertencer a apenas 1 país.

A razão pela qual não juntamos essas 3 tabelas neste forma é fornecida pelo texto do exemplo # 2. A consulta é escrita de forma a retornar 4 linhas que seriam a resposta para o seguinte: Retorne os nomes de todos os clientes, bem como as cidades e países em que eles estão localizados. Retorne até mesmo clientes sem cidades e países relacionados.

  • Nota: Quando você usa LEFT JOIN, a ordem das tabelas nessa instrução é importante e a consulta retornará um resultado diferente se você alterar essa ordem. A ordem realmente depende do que você deseja retornar como resultado.

Junte várias tabelas usando ambos – INNER JOIN & LEFT JOIN

Isso também é possível. Vamos novamente com um exemplo.

# 3 Retorne a lista de todos os países e cidades que têm par (exclua os países que não são referenciados por nenhuma cidade). Para esses pares, retorne todos os clientes. Retorna pares pares sem um único cliente.

A consulta que faz o trabalho é:

O resultado da consulta é dado na imagem abaixo:

Você pode notar facilmente que não temos países sem nenhuma cidade relacionada (como Espanha & Rússia). O INNER JOIN eliminou essas linhas. Ainda assim, temos cidades sem nenhum cliente (Belgrado, Los Angeles & Varsóvia). Este é o resultado do fato de que usamos LEFT JOIN entre as tabelas cidade e cliente.

Conclusão

Quando você precisa juntar várias tabelas, você tem INNER & LEFT JOIN à sua disposição (RIGHT JOIN raramente é usado e pode ser facilmente substituído por LEFT JOIN). A junção que você usará depende diretamente da tarefa que você precisa resolver e você terá a sensação ao longo do caminho. Nos próximos artigos, discutiremos como pensar e se organizar quando precisar escrever consultas mais complexas.

Índice

Aprenda SQL: CREATE DATABASE & CREATE TABLE Operações

Aprenda SQL: INSERT INTO TABLE

Aprenda SQL: Chave primária

Aprenda SQL: Chave estrangeira

Aprenda SQL: SELECT instrução

Aprenda SQL: INNER JOIN vs LEFT JOIN

Aprenda SQL: Scripts SQL

Aprenda SQL: Tipos de relações

Aprenda SQL: junte várias tabelas

Aprenda SQL: funções agregadas

Aprenda SQL: como escrever um SELECT complexo Consulta

Aprenda SQL: o banco de dados INFORMATION_SCHEMA

Aprenda SQL: Tipos de dados SQL

Aprenda SQL: Teoria dos conjuntos

Aprenda SQL: Funções definidas pelo usuário

Aprenda SQL: Procedimentos armazenados definidos pelo usuário

Aprenda SQL: Exibições SQL

Aprenda SQL: Gatilhos SQL

Aprenda SQL: Pratique consultas SQL

Aprenda SQL: SQL Exemplos de consulta

Aprenda SQL: crie um relatório manualmente usando consultas SQL

Aprenda SQL: Funções de data e hora do SQL Server

Aprenda SQL: crie relatórios do SQL Server usando funções de data e hora

Aprenda SQL: tabelas dinâmicas do SQL Server

Aprenda SQL: exportação do SQL Server para Excel

Aprenda SQL: introdução aos loops do SQL Server

Aprenda SQL: cursores do SQL Server

Aprenda SQL: Práticas recomendadas de SQL para excluir e atualizar dados

Aprenda SQL: Convenções de nomenclatura

Aprenda SQL: Trabalhos relacionados a SQL

Aprenda SQL: associações não-equi no SQL Server

Aprenda SQL: injeção de SQL

  • Autor
  • Postagens recentes
Emil é um profissional de banco de dados com mais de 10 anos de experiência em tudo relacionado a bancos de dados . Durante os anos, ele trabalhou na indústria de TI e finanças e agora trabalha como freelancer.
Seus compromissos passados e presentes variam de design e codificação de banco de dados a ensino, consultoria e redação sobre bancos de dados. Sem esquecer também, BI, criação de algoritmos, xadrez, filatelia, 2 cachorros, 2 gatos, 1 esposa, 1 bebê …
Você pode encontrá-lo no LinkedIn
Ver todas as postagens de Emil Drkusic

Postagens mais recentes de Emil Drkusic (ver todos)
  • Aprenda SQL: SQL Injection – 2 de novembro de 2020
  • Aprenda SQL: Non-Equi Joins no SQL Server – 29 de setembro de 2020
  • Aprenda SQL: Trabalhos relacionados a SQL – 1 de setembro de 2020

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *