SQLShack (Português)

INNER JOIN vs LEFT JOIN, isto é a questão. Hoje, vamos explicar brevemente como esses dois tipos de junção são usados e qual é a diferença. Voltaremos a este tópico mais tarde, quando expandiremos nosso modelo e poderemos escrever consultas muito mais complexas.

Mudanças nos dados

Antes de compararmos INNER JOIN com LEFT JOIN, vamos ver o que sabemos atualmente. Até agora, nesta série, explicamos os fundamentos do banco de dados – como criar banco de dados e tabelas, como preencher tabelas com dados e verificar o que está armazenado nelas usando consultas simples. Até juntamos duas tabelas no artigo anterior. Agora estamos prontos para a próxima etapa.

Mas antes de prosseguirmos, vamos fazer apenas uma pequena alteração nossos dados. Vamos adicionar 2 linhas na tabela de país, usando os seguintes comandos INSERT INTO:

Agora vamos verificar o conteúdo de ambas as tabelas:

Você pode facilmente notar que temos 2 novas linhas na tabela país, uma para a Espanha e outra para a Rússia. Seus ids são 6 e 7. Observe também que na tabela de cidades não há country_id com valor 6 ou 7. Isso significa simplesmente que não temos uma cidade da Rússia ou Espanha em nosso banco de dados. Usaremos esse fato mais tarde.

INNER JOIN

Vamos discutir essas duas consultas:

O resultado que elas retornam é apresentado na imagem abaixo:

Ambas as consultas retornam exatamente o mesmo resultado. Isso não é por acaso, mas o resultado do fato de que esta é a mesma consulta escrita de duas maneiras diferentes. Ambas as formas estão corretas e você pode usar qualquer uma delas.

Na primeira consulta, listamos todas as tabelas que usamos na parte FROM da consulta (FROM país, cidade) e depois fizemos a junção condição na parte WHERE da consulta (WHERE city.country_id = country.id). Caso tenhamos esquecido de escrever esta condição de junção, teríamos o produto cartesiano de ambas as tabelas.

Na segunda consulta, temos apenas uma tabela na parte FROM da consulta (país FROM) e então temos a segunda tabela e a condição JOIN na parte JOIN da consulta (INNER JOIN city ON city.country_id = country.id).

Embora ambas as consultas sejam bem escritas, sugiro que você sempre usa INNER JOIN em vez de listar tabelas e juntá-las na parte WHERE da consulta. Existem algumas razões para isso:

  • A legibilidade é muito melhor porque a tabela usada e a condição JOIN relacionada são iguais linha. Você pode ver facilmente se omitiu a condição JOIN ou não
  • Se quiser usar outros JOINs mais tarde (LEFT ou RIGHT), você não poderá fazer isso (facilmente) a menos que tenha usado INNER JOIN antes que

Agora, vamos comentar sobre quais consultas realmente retornaram:

  • Todos os pares de países e cidades que estão relacionados (via chave estrangeira)
  • Não temos 2 países na lista (Espanha e Rússia), porque eles não têm nenhuma cidade relacionada na tabela de cidades

LEFT JOIN

Vou repetir – “Não temos 2 países na lista (Espanha e Rússia) porque eles não têm nenhuma cidade relacionada na tabela de cidades”. Isso será crucial ao comparar INNER JOIN vs LEFT JOIN.

Em alguns casos, queremos ter até mesmo esses registros em nossos resultados. Por exemplo, você simplesmente deseja ver no resultado que esses países não têm registros relacionados em outra tabela. Isso pode ser parte de algum controle, ou talvez apenas contagem de casos, etc. Não importa qual seja a motivação por trás desse desejo, devemos ser tecnicamente capazes de fazer isso. E nós somos. Em bancos de dados, LEFT JOIN faz exatamente isso.

O resultado de LEFT JOIN deve ser o mesmo que o resultado de INNER JOIN + teremos linhas, da tabela “esquerda”, sem um par no mesa “certa”. Usaremos a mesma consulta INNER JOIN e apenas substituir a palavra INNER por LEFT. Este é o resultado:

Você pode facilmente notar, que temos mais 2 linhas, em comparação com o resultado do INNER JOIN query. Essas são linhas para Rússia e Espanha. Uma vez que ambos não têm nenhuma cidade relacionada, todos os atributos de cidade nessas duas linhas têm valores NULL (não são definidos). Essa é a maior diferença ao comparar INNER JOIN vs LEFT JOIN.

RIGHT JOIN

Você ouvirá pelo menos sobre o RIGHT JOIN. Raramente é usado porque retorna o mesmo resultado que LEFT JOIN. Por outro lado, as consultas que usam LEFT JOIN são muito mais fáceis de ler porque simplesmente listamos as tabelas uma após a outra.

Isso é o equivalente à consulta anterior usando o RIGHT JOIN:

Você pode notar que os valores retornados são os mesmos, apenas neste caso os valores da tabela de cidade estão nas primeiras 5 colunas, e país- valores relacionados vêm depois deles.

INNER JOIN vs LEFT JOIN

INNER JOIN vs LEFT JOIN?Na verdade, essa não é a questão. Você usará INNER JOIN quando quiser retornar apenas registros com pares em ambos os lados, e usará LEFT JOIN quando precisar de todos os registros da tabela “esquerda”, não importa se eles têm pares na tabela “direita” ou não. Se você precisar de todos os registros de ambas as tabelas, não importa se eles têm par, você precisará usar CROSS JOIN (ou simular usando LEFT JOINs e UNION). Mais sobre isso nos próximos artigos.

Índice

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

Aprenda SQL: INSERT INTO TABLE

Aprenda SQL: Chave primária

Aprenda SQL: Chave estrangeira

Aprenda SQL: instrução SELECT

Aprenda SQL: INNER JOIN vs LEFT JOIN

Aprenda SQL: Scripts SQL

Aprenda SQL: Tipos de relações

Aprenda SQL: Una várias tabelas

Aprenda SQL: Funções Agregadas

Aprenda SQL: Como escrever uma consulta SELECT complexa

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: Visualizações SQL

Aprenda SQL: Gatilhos SQL

Aprenda SQL: Pratique consultas SQL

Aprenda SQL: exemplos de consulta SQL

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 o 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 ao SQL

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

Aprenda SQL: SQL Injeção

  • 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 *