A Jornada do Relatório: Passo a Passo com Analogias Visuais
Cenário: Uma loja precisa entender como cruzar a tabela de Clientes com a de Pedidos sem ignorar cadastros ou perder informações.
O Ponto Cego do INNER JOIN
O INNER JOIN exige perfeição matemática. Ele retorna apenas a intersecção exata. Se um cliente se cadastrou hoje e ainda não comprou nada, ele é silenciosamente ignorado pelo relatório.
FROM clientes c
INNER JOIN pedidos p ON c.id = p.cliente_id;
LEFT JOIN: A Tabela Âncora
O LEFT JOIN transforma a primeira tabela (à esquerda) na nossa ÂNCORA. Preserva-se 100% dos seus registros. Onde a tabela da direita não encontrar correspondência, o banco preenche com [NULL].
FROM clientes c -- Âncora
LEFT JOIN pedidos p ON c.id = p.cliente_id;
id_pedido exibirá NULL.
Caçadores de Órfãos (IS NULL)
Em Business Intelligence, um valor NULL não é um erro; é uma oportunidade estratégica! Quando combinamos LEFT JOIN com a condição WHERE tabela_direita.id IS NULL, isolamos exclusivamente quem NÃO possui correspondência.
FROM clientes c
LEFT JOIN pedidos p ON c.id = p.cliente_id
WHERE p.id_pedido IS NULL;
Eixo Vertical: UNION vs UNION ALL
Enquanto os JOINs conectam tabelas horizontalmente (adicionando colunas), o UNION empilha resultados no eixo vertical (adicionando linhas).
- UNION: A Peneira. Avalia o conjunto inteiro e elimina duplicatas (mais lento).
- UNION ALL: O Funil Rápido. Junta tudo sem conferir duplicatas (alta performance).
UNION ALL
SELECT empresa_nome, email, 'Fornecedor' AS tipo FROM fornecedores;
UNION ALL a menos que remover duplicatas seja um requisito estrito da regra de negócio.
32 Exercícios Práticos Orientados
Cada card apresenta uma situação real de mercado. Localize o exercício pelo seu número de chamada.
Clientes Sem Compras
O departamento de Marketing precisa de uma lista contendo o nome e email de todos os clientes cadastrados na tabela clientes que jamais realizaram nenhum pedido na tabela pedidos.
pedidos(id, cliente_id, data)
Médicos Sem Agenda
A direção do hospital quer identificar quais médicos da tabela medicos não possuem nenhuma consulta agendada na tabela consultas para readequação de plantão.
consultas(id, medico_id, data)
Acervo Intacto
Gere um relatório listando o título e o ISBN dos livros da tabela livros que jamais foram emprestados na tabela emprestimos.
emprestimos(id, livro_id, data)
Alunos Não Iniciados
Encontre o nome e e-mail dos alunos matriculados na tabela alunos que ainda não concluíram nenhum módulo na tabela progresso.
progresso(id, aluno_id, modulo_id)
Artistas Sem Tocadas
Consulte o nome dos artistas da tabela artistas que não registraram nenhuma execução na tabela de histórico reproducoes.
reproducoes(id, artista_id, data)
Veículos Sem Manutenção
Selecione a placa e o modelo dos veículos da tabela veiculos que não possuem nenhuma Ordem de Serviço cadastrada em ordens_servico.
ordens_servico(id, veiculo_id, valor)
Imóveis Sem Proposta
Liste o endereço e valor pedido dos imóveis de imoveis que ainda não receberam nenhuma oferta formal na tabela propostas.
propostas(id, imovel_id, valor_oferta)
Alunos Ausentes
Consulte os alunos matriculados em alunos que não registraram nenhuma passagem na catraca na tabela frequencias.
frequencias(id, aluno_id, data_hora)
Pratos Sem Saída
Descubra os nomes dos pratos da tabela pratos que jamais foram vendidos e incluídos na tabela itens_pedido.
itens_pedido(id, prato_id, qtd)
Pets Sem Atendimento
Liste o nome do pet e espécie cadastrados em pets que nunca realizaram nenhuma consulta médica em consultas_vet.
consultas_vet(id, pet_id, data)
Sessões Vazias
Consulte a sala e o horário das sessões programadas em sessoes para as quais não foi vendido nenhum bilhete na tabela ingressos.
ingressos(id, sessao_id, poltrona)
Produtos Sem Reposição
Liste a descrição dos produtos do catálogo produtos que não possuem nenhum registro de reposição na tabela entradas_estoque.
entradas_estoque(id, produto_id, qtd)
Motoristas Inativos
Consulte o nome e a CNH dos motoristas da frota motoristas que não foram atribuídos a nenhuma rota na tabela viagens.
viagens(id, motorista_id, destino)
Projetos Sem Ofertas
Gere uma lista dos títulos dos projetos publicados na tabela projetos que ainda não receberam nenhuma candidatura na tabela propostas.
propostas(id, projeto_id, valor)
Veículos Nunca Alugados
Consulte a placa e modelo dos automóveis da frota carros que jamais constaram em nenhum contrato da tabela locacoes.
locacoes(id, carro_id, data_inicio)
Quartos Vagos no Período
Mostre o número e andar dos quartos da categoria 'Luxo' em quartos que não tiveram nenhuma reserva registrada em reservas.
reservas(id, quarto_id, data_entrada)
Departamentos Desocupados
Exiba o nome dos setores da tabela departamentos que não possuem nenhum colaborador vinculado na tabela funcionarios.
funcionarios(id, departamento_id, nome)
Eventos Sem Vendas
Liste o nome e data dos shows agendados na tabela eventos que não contam com nenhum bilhete emitido em ingressos_evento.
ingressos_evento(id, evento_id, preco)
Remédios Sem Prescrição
Selecione o nome comercial dos medicamentos de uso controlado em medicamentos que não registraram nenhuma venda em dispensacoes.
dispensacoes(id, medicamento_id, receita)
Pilotos Fora de Escala
Consulte a matrícula e o nome dos pilotos cadastrados em pilotos que não foram escalados para nenhum voo na tabela escalas_voo.
escalas_voo(id, piloto_id, voo_codigo)
Consolidação de Contatos (UNION)
Utilize o comando UNION para consolidar em uma única lista os nomes e telefones cadastrados tanto na tabela de clientes quanto na de fornecedores.
fornecedores(nome_empresa, fone)
Apólices Sem Sinistro
Selecione o número da apólice e titular da tabela apolices que não possuem nenhum sinistro comunicado na tabela sinistros.
sinistros(id, apolice_id, data_ocorrencia)
Filmes Fora de Favoritos
Mostre o título dos filmes catalogados em filmes que não aparecem na lista de favoritos de nenhum usuário na tabela favoritos.
favoritos(id, filme_id, usuario_id)
Clientes Inativos no Período
Identifique o nome e telefone dos clientes de clientes que não possuem agendamentos registrados na tabela agendamentos nos últimos 60 dias.
agendamentos(id, cliente_id, data_agendada)
Lotes Não Distribuídos
Consulte o código do lote e a data de fabricação em lotes_producao para os lotes que ainda não possuem ordem de envio em distribuicao.
distribuicao(id, lote_id, destino)
Times Sem Partidas Alocadas
Exiba o nome da equipe cadastrada em times que ainda não tem nenhum confronto agendado na tabela de tabela de jogos partidas.
partidas(id, time_casa_id, time_fora_id)
Encomendas Sem Confeiteiro
Liste o número do pedido e descrição do bolo na tabela encomendas para os quais nenhum confeiteiro foi atribuído na tabela confeiteiros.
atribuicoes(id, encomenda_id, confeiteiro_id)
Salas Sem Reserva no Fim de Semana
Consulte o nome e capacidade das salas de reunião em salas que jamais registraram agendamento em fins de semana na tabela reservas_fds.
reservas_fds(id, sala_id, data)
Animais Sem Prontuário Exames
Selecione o apelido e o recinto dos animais em animais que não possuem nenhum laudo cadastrado na tabela de exames_veterinarios.
exames_veterinarios(id, animal_id, resultado)
Contas Digitais Inativas
Liste o número da conta e titular das contas digitais em contas que jamais efetuaram nenhuma transação financeira na tabela transacoes.
transacoes(id, conta_id, valor)
Escalas Unificadas (UNION ALL)
Utilize o comando UNION ALL para empilhar em alta velocidade as listas das tabelas escala_manha e escala_noite (nome do barista e horário).
escala_noite(barista, horario)
Colecionadores Sem Lances
Descubra o nome e e-mail dos colecionadores cadastrados na tabela colecionadores que ainda não fizeram nenhum lance na tabela lances_leilao.
lances_leilao(id, colecionador_id, valor)