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