Capítulo 11: Junções Relacionais: INNER JOIN e LEFT JOIN

🎯 Objetivo da Aula

Nesta aula de alta maturidade em engenharia de dados, você aprenderá a técnica que justifica a existência dos bancos de dados relacionais: a Junção de Tabelas (Table Joins). No laboratório de informática, você aprenderá a reconectar as tabelas que normalizou nos capítulos anteriores sem produzir redundâncias de dados. Você dominará a sintaxe formal do INNER JOIN com a cláusula ON, compreenderá o papel estratégico do LEFT JOIN e aprenderá a regra sintática exclusiva do Microsoft Access para encadear múltiplas junções utilizando parênteses.

Ao final desta aula, você será capaz de gerar relatórios consolidados que unem clientes, veículos, motoristas e fretes em uma visão unificada, além de identificar com precisão caminhões da frota que estão parados no pátio gerando custo fixo sem faturar.


🏢 Cenário Prático (FastLog S.A.)

Empresa: FastLog Transportes & Logística Integrada S.A.
Problema: O diretor de operações convocou uma reunião de emergência para reduzir custos: ele precisava de um relatório que exibisse em uma única tela o Código do Frete, a Razão Social do Cliente, o Modelo e a Placa do Caminhão, e o Nome do Motorista. No modelo antigo em Excel, esses dados ficavam em 4 planilhas separadas e o assistente passava o dia inteiro digitando dezenas de fórmulas PROCV lentas e propensas a erros #N/D. Pior ainda: a diretoria suspeitava que 15 caminhões novos comprados pela transportadora estavam esquecidos no pátio sem nenhuma viagem atribuída, gerando um prejuízo de depreciação de R$ 120.000,00 por mês.
Sua Missão: Como arquiteto de SQL, você criará a consulta oficial de despacho utilizando INNER JOIN para unificar as quatro tabelas em 0,02 segundo, e construirá uma consulta investigativa com LEFT JOIN para diagnosticar quais caminhões da frota estão 100% ociosos.


🧠 Fundamentos: A Teoria Traduzida

1. Diagramas de Venn: INNER JOIN vs. LEFT JOIN

A álgebra relacional baseia-se na teoria dos conjuntos:

flowchart TD
    subgraph INNER["🟩 INNER JOIN (Interseção Exata)"]
        direction LR
        I1["Tabela A (Clientes)"] --- INTER["A ∩ B<br/>Apenas clientes que possuem fretes"] --- I2["Tabela B (Fretes)"]
    end

    subgraph LEFT["🟦 LEFT JOIN (Preservação da Esquerda)"]
        direction LR
        L1["Tabela A (Todos os Veículos)"] === L_ALL["A + (A ∩ B)<br/>Mostra TODOS os veículos, inclusive os SEM frete (NULL)"] --- L2["Tabela B (Fretes)"]
    end

    style INNER fill:#d4edda,stroke:#155724,stroke-width:2px
    style LEFT fill:#d1ecf1,stroke:#0c5460,stroke-width:2px
  • INNER JOIN (Junção Interna): Retorna apenas as linhas que possuem correspondência exata em ambas as tabelas conectadas.
    • Se um cliente acabou de ser cadastrado e ainda não emitiu nenhuma ordem de frete, ele NÃO APARECE no resultado do INNER JOIN.
  • LEFT JOIN (Junção Externa à Esquerda): Retorna TODOS os registros da tabela da esquerda (FROM TabelaA), mesmo que não haja nenhum registro correspondente na tabela da direita (TabelaB).
    • Quando não há correspondência na tabela da direita, o Access preenche as colunas com o valor especial NULL (vazio).
    • Aplicação Estratégica em Negócios: É a ferramenta perfeita para encontrar “o que está faltando” (clientes que não compram, frotas que não rodam, rotas que não têm demanda).

2. A Cláusula de Ligação ON

A cláusula ON estabelece a ponte de igualdade matemática entre a Chave Primária (PK) e a Chave Estrangeira (FK):

1
2
3
FROM tbl_OrdensFrete 
INNER JOIN tbl_Clientes 
ON tbl_OrdensFrete.ID_Cliente = tbl_Clientes.ID_Cliente

3. A Peculiaridade de Sintaxe do Access (Parênteses Encadeados)

Em servidores como SQL Server ou PostgreSQL, podemos encadear múltiplos JOIN um após o outro de forma sequencial. No entanto, o motor relacional do Microsoft Access (Jet/ACE Engine) exige que cada junção adicional seja envolvida por parênteses ( ... ):

1
2
3
FROM (tbl_OrdensFrete
INNER JOIN tbl_Clientes ON tbl_OrdensFrete.ID_Cliente = tbl_Clientes.ID_Cliente)
INNER JOIN tbl_Veiculos ON tbl_OrdensFrete.Placa_Veiculo = tbl_Veiculos.Placa;

📖 Exemplo Guiado: Passo a Passo no Laboratório

Abra o arquivo FastLog_Database.accdb. Vamos construir a consulta unificada no Modo SQL.

Passo 1: Abrindo a Consulta em Modo SQL

  1. Acesse Criar ➔ Design da Consulta.
  2. Feche a janelinha Adicionar Tabelas.
  3. No canto superior esquerdo, clique no botão Modo SQL.
  4. Limpe o editor em branco.

🛠️ Prática Obrigatória 1: Relatório Unificado de Expedição com INNER JOIN Multi-Tabelas

Você unirá quatro tabelas em uma única instrução SQL: tbl_OrdensFrete, tbl_Clientes, tbl_Veiculos e tbl_Motoristas.

Passo a Passo no Computador:

  1. Digite cuidadosamente a consulta SQL com parênteses encadeados:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    
    SELECT 
        tbl_OrdensFrete.ID_OrdemFrete,
        tbl_OrdensFrete.Data_Despacho,
        tbl_Clientes.Razao_Social AS [Cliente Faturado],
        tbl_Clientes.Cidade AS [Cidade Cliente],
        tbl_Veiculos.Placa AS [Placa Cavalo],
        tbl_Veiculos.Modelo_Cavalo AS [Modelo Veículo],
        tbl_Motoristas.Nome_Motorista AS [Motorista Titular],
        tbl_OrdensFrete.Valor_Frete AS [Valor do Frete]
    FROM ((tbl_OrdensFrete
    INNER JOIN tbl_Clientes ON tbl_OrdensFrete.ID_Cliente = tbl_Clientes.ID_Cliente)
    INNER JOIN tbl_Veiculos ON tbl_OrdensFrete.Placa_Veiculo = tbl_Veiculos.Placa)
    INNER JOIN tbl_Motoristas ON tbl_OrdensFrete.ID_Motorista = tbl_Motoristas.ID_Motorista
    ORDER BY tbl_OrdensFrete.Data_Despacho DESC;
  2. Clique no botão ! Executar (exclamação vermelha).
  3. Análise do Resultado:
    • Observe que a tela exibe uma visão gerencial perfeita: não há nenhum código frio como ID_Cliente ou ID_Motorista.
    • O nome da empresa cliente, a cidade, o modelo do caminhão, a placa e o nome do motorista aparecem reunidos lado a lado de forma instantânea!
  4. Salve a consulta como: qry_ExpedicaoGeralUnificada.

✅ Resultado Esperado (Prática 1):

A consulta substitui com perfeição dezenas de PROCVs do Excel, recuperando dados distribuídos em 4 tabelas relacionais em milissegundos com integridade total.


🛠️ Prática Obrigatória 2: Diagnóstico de Frota Ociosa com LEFT JOIN e IS NULL

Agora você assumirá o papel de auditor operacional, descobrindo quais caminhões da frota estão parados na garagem sem nenhuma viagem realizada.

Passo a Passo no Computador:

  1. Acesse Criar ➔ Design da Consulta ➔ Modo SQL.
  2. Digite a consulta investigativa com LEFT JOIN:
    1
    2
    3
    4
    5
    6
    7
    8
    
    SELECT 
        tbl_Veiculos.Placa,
        tbl_Veiculos.Modelo_Cavalo,
        tbl_Veiculos.Tipo_Carroceria,
        tbl_Veiculos.Capacidade_Kg,
        tbl_OrdensFrete.ID_OrdemFrete
    FROM tbl_Veiculos
    LEFT JOIN tbl_OrdensFrete ON tbl_Veiculos.Placa = tbl_OrdensFrete.Placa_Veiculo;
  3. Execute a consulta:
    • Observe que caminhões que já viajaram mostram o número do frete na última coluna.
    • Mas os caminhões que nunca viajaram exibem a coluna ID_OrdemFrete completamente EM BRANCO (NULL)!
  4. Volte ao Modo SQL e adicione a cláusula WHERE para filtrar com exclusividade os caminhões ociosos:
    1
    2
    3
    4
    5
    6
    7
    8
    
    SELECT 
        tbl_Veiculos.Placa,
        tbl_Veiculos.Modelo_Cavalo,
        tbl_Veiculos.Tipo_Carroceria,
        tbl_Veiculos.Capacidade_Kg
    FROM tbl_Veiculos
    LEFT JOIN tbl_OrdensFrete ON tbl_Veiculos.Placa = tbl_OrdensFrete.Placa_Veiculo
    WHERE tbl_OrdensFrete.ID_OrdemFrete IS NULL;
  5. Execute a consulta.
  6. A tela exibirá apenas os caminhões parados! Salve a consulta com o nome: qry_FrotaOciosaAuditoria.

✅ Resultado Esperado (Prática 2):

A consulta identifica com rigor cirúrgico os ativos logísticos ociosos, entregando à diretoria o relatório exato de veículos disponíveis para novas rotas.


📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o banco de dados e feche o Access.
  2. Nomeie o arquivo: FastLog_BD_Cap11_SeuNome_SeuSobrenome.accdb.
  3. Acesse o Microsoft Teams na sua disciplina técnica.
  4. Abra a tarefa: “Banco de Dados - Cap 11: Junções INNER JOIN e LEFT JOIN”.
  5. Anexe o seu arquivo .accdb e conclua o envio clicando em Entregar (Turn In).

💡 Checkpoint de Gestão & TI

Por que esta aula coloca você à frente no mercado? No ambiente corporativo, a maioria das pessoas sabe fazer consultas simples em uma única tabela. Mas saber cruzar múltiplas entidades com INNER JOIN e utilizar o poder investigativo do LEFT JOIN com IS NULL para descobrir clientes inativos, gargalos e equipamentos parados é a competência exata que os diretores buscam em analistas estratégicos.


🔥 Desafio de Fixação: Auditoria de Clientes Inativos

A diretoria comercial quer lançar uma campanha de reativação para clientes que estão cadastrados no sistema da FastLog mas que nunca contrataram nenhum frete.

Escreva uma consulta SQL no Access que atenda aos seguintes requisitos:

  1. Faça um LEFT JOIN entre a tabela tbl_Clientes e a tabela tbl_OrdensFrete.
  2. Projete os campos ID_Cliente, Razao_Social, Cidade, UF e Limite_Credito.
  3. Filtre exclusivamente os clientes que não possuem nenhuma ordem de frete vinculada (WHERE tbl_OrdensFrete.ID_OrdemFrete IS NULL).
  4. Ordene os clientes pelo Limite_Credito em ordem decrescente (DESC) para priorizar os clientes de maior potencial financeiro.
  5. Salve com o nome: qry_ClientesInativosCampanha.

🔑 Revelar Gabarito Oficial e Material de Apoio da Aula (Clique para expandir)
💡 Incentivo Pedagógico: Tente resolver as práticas e o desafio de fixação por conta própria antes de abrir o gabarito. Seus erros e tentativas durante o laboratório são a chave para a consolidação real do aprendizado!

Código SQL Oficial do Desafio de Fixação:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
SELECT 
    tbl_Clientes.ID_Cliente,
    tbl_Clientes.Razao_Social,
    tbl_Clientes.Cidade,
    tbl_Clientes.UF,
    tbl_Clientes.Limite_Credito
FROM tbl_Clientes
LEFT JOIN tbl_OrdensFrete ON tbl_Clientes.ID_Cliente = tbl_OrdensFrete.ID_Cliente
WHERE tbl_OrdensFrete.ID_OrdemFrete IS NULL
ORDER BY tbl_Clientes.Limite_Credito DESC;

📥 Download dos Scripts desta Aula:
Baixe o arquivo de script Capitulo_11.sql ou o pacote compactado (.zip) com os comandos SQL e esquemas da aula.


📝 Atividade Extra: Questionário de Fixação (Caderno)

Instruções: Responda no caderno, de próprio punho, as 10 perguntas reflexivas abaixo com base no conteúdo deste capítulo. Ao concluir, apresente o caderno ao professor para conferência e visto.

  1. O que é uma Junção de Tabelas (Table Join) e qual é a sua importância na arquitetura relacional?
  2. Explique o que acontece em um Produto Cartesiano quando esquecemos de definir a cláusula de ligação entre duas tabelas.
  3. Defina o comportamento do INNER JOIN com base na teoria de conjuntos e diagramas de Venn.
  4. Qual é a função da cláusula ON em uma instrução de junção SQL?
  5. Qual é a principal diferença de comportamento entre o INNER JOIN e o LEFT JOIN?
  6. No Cenário Prático da FastLog, qual prejuízo a empresa sofria devido aos caminhões parados no pátio sem registro de viagens?
  7. Como a combinação de LEFT JOIN com a cláusula WHERE ... IS NULL permite identificar frotas ociosas ou clientes inativos?
  8. Qual é a regra de sintaxe obrigatória do motor do Microsoft Access quando encadeamos mais de duas tabelas em junções múltiplas?
  9. Na Prática Obrigatória 1, por que é recomendável utilizar a notação NomeTabela.NomeCampo (como tbl_Clientes.Cidade) no comando SELECT?
  10. No Desafio de Fixação, qual é a justificativa de negócio para ordenar os clientes inativos pelo Limite_Credito DESC?