Voltar para a lista de artigos Artigos
7 minutos de leitura

Qual é a diferença entre ter várias tabelas de origem e usar juntas?

Qual é a sua abordagem para juntar tabelas em SQL? Neste artigo, discutimos duas abordagens e explicamos por que muitos desenvolvedores de SQL têm uma preferência definida por JOIN.

Você prefere listar várias tabelas em FROM e usar WHERE para definir as condições de junção? Ou você usa a palavra-chave JOIN? SQL suporta ambas, mas há diferenças significativas entre elas. Vamos analisar cada uma delas em detalhes e depois discutir por que o JOIN é geralmente preferido.

Juntando Tabelas através da listagem das mesmas de

Digamos que administramos uma loja de brinquedos e temos duas tabelas de banco de dados às quais queremos aderir: toys e sales.

Brinquedos

idnamebrandprice
1BumblebeeTransformers14.99
2Optimus PrimeTransformers19.99
3Lightning McQueenDisney Cars23.97
4RamoneDisney Cars20.99
5Wonder WomanBarbie39.99
6Princess LeiaBarbie99.99
7Wizard of Oz: GlindaBarbie43.95

Vendas

idtoy_idemployee_iddatequantity
1532020-07-011
2112020-07-011
3312020-07-021
4632020-07-031
5232020-07-031

Podemos simplesmente listar ambas as tabelas na cláusula FROM e declarar na cláusula WHERE que o id do toy deve corresponder à tabela toy_id do sales mesa:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date
FROM toys t, sales s
WHERE t.id = s.toy_id;

Vamos obter o seguinte resultado:

idnamebrandpricequantitydate
1BumblebeeTransformers14.9912020-07-01
2Optimus PrimeTransformers19.9912020-07-03
3Lightning McQueenDisney Cars23.9712020-07-02
5Wonder WomanBarbie39.9912020-07-01
6Princess LeiaBarbie99.9912020-07-03

Tudo funcionou como pretendido - juntamos duas mesas e obtivemos os resultados que esperávamos.

Esta é definitivamente uma solução que funciona para unir mesas em SQL. Entretanto, ela usa uma sintaxe antiga que era comum antes do padrão SQL-92 introduzir a palavra-chave JOIN. Vamos agora ver como podemos obter o mesmo resultado usando uma abordagem moderna para unir tabelas.

Unindo Tabelas usando a palavra-chave JOIN

Podemos usar a seguinte consulta com a palavra-chave JOIN para fazer a mesma coisa:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date
FROM toys t
JOIN sales s
ON t.id = s.toy_id;

Esta sintaxe foi introduzida no padrão SQL-92. Aqui, temos apenas uma tabela na cláusula FROM; a tabela que queremos juntar está listada na cláusula JOIN. Depois, temos a palavra-chave ON para especificar as colunas a serem usadas para unir estas tabelas.

O resultado desta consulta é o mesmo que o anterior. No entanto, esta abordagem tem uma série de vantagens que a tornam mais prevalecente entre os praticantes de SQL. Se você preferir usar a antiga sintaxe para unir tabelas, verifique os seguintes argumentos. Eles podem fazer com que você mude de idéia.

Por que usar a Nova Sintaxe para Juntar SQL?

Vamos começar esclarecendo que , em termos de desempenho, não há diferença entre as duas sintaxes. O uso da palavra-chave JOIN não é apenas um padrão formal hoje em dia, é também uma prática comum entre os usuários de SQL. Então, quais são os benefícios de usar a cláusula JOIN?

As condições de junção são separadas das condições de filtragem

Quando você usa a sintaxe antiga, suas condições de adesão e condições de filtragem são fisicamente agrupadas na cláusula WHERE. Isto pode causar alguma confusão.

Por exemplo, digamos que queremos ver apenas as vendas a partir de 3 de julho. Precisaremos acrescentar mais uma condição à cláusula ONDE:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date
FROM toys t, sales s
WHERE t.id = s.toy_id AND s.date = '2020-07-03';

Agora temos duas condições em ONDE, mas apenas uma delas é uma verdadeira condição de filtragem. A outra é usada apenas para especificar as colunas nas quais se devem juntar as tabelas.

Com a palavra-chave JOIN, as condições de união são separadas das condições de filtragem:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date
FROM toys t
JOIN sales s
ON t.id = s.toy_id
WHERE s.date = '2020-07-03';

Aqui, especificamos a condição de junção em ON e usamos WHERE para filtrar os resultados.

Ambas as consultas produzirão o mesmo resultado, mas a nova sintaxe deixa claro onde se está unindo as tabelas e onde se está filtrando os resultados.

É mais fácil unir várias tabelas

Muitas vezes, você precisará unir várias tabelas com SQL. Por exemplo, digamos que queremos unir a employees mesa para o toys e sales tabelas para que saibamos quem vendeu cada brinquedo.

Empregados

idname
1Rob Stevens
2Jane White
3Sofia Clark

Com a velha sintaxe, teríamos a seguinte pergunta:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date, e.name AS employee
FROM toys t, sales s, employees e
WHERE t.id = s.toy_id AND e.id = s.employee_id;

Para unir as mesmas três tabelas com a sintaxe JOIN, usaríamos esta consulta:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date, e.name AS employee
FROM toys t
JOIN sales s
ON t.id = s.toy_id
JOIN employees e
ON e.id = s.employee_id;

O resultado é o mesmo:

idnamebrandpricequantitydateemployee
1BumblebeeTransformers14.9912020-07-01Rob Stevens
2Optimus PrimeTransformers19.9912020-07-03Sofia Clark
3Lightning McQueenDisney Cars23.9712020-07-02Rob Stevens
5Wonder WomanBarbie39.9912020-07-01Sofia Clark
6Princess LeiaBarbie99.9912020-07-03Sofia Clark

A "cadeia" de tabelas que queremos juntar é mais visível na nova sintaxe, onde primeiro juntamos duas tabelas em colunas específicas e depois juntamos a terceira tabela usando outra condição de junção. Com a sintaxe antiga, temos todas as três tabelas listadas juntas em FROM, e depois ambas as condições de junção especificadas (em qualquer ordem) em WHERE. Qual condição corresponde a qual juntar, especialmente se precisarmos juntar mais de três tabelas, rapidamente se torna confusa nesta sintaxe.

ESQUERDA / DIREITA / CUMPRIDADE DE USO são mais fáceis

A sintaxe JOIN torna todos os tipos de uniões externas muito simples. Você pode fazer uniões à esquerda (exterior), à direita (exterior) ou uniões completas (exterior) simplesmente usando as respectivas palavras-chave (LEFT JOIN, RIGHT JOIN, ou FULL JOIN).

Digamos que queremos nos unir à toys e sales mesas para que tenhamos todos os brinquedos expostos no resultado, mesmo que não houvesse vendas para um brinquedo durante o período determinado. Você pode fazer isto juntando-se facilmente em qualquer banco de dados simplesmente usando o LEFT JOIN:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.date
FROM toys t
LEFT JOIN sales s
ON t.id = s.toy_id;

O resultado incluirá todos os brinquedos e as informações de vendas correspondentes, quando aplicável:

idnamebrandpricequantitydate
5Wonder WomanBarbie39.9912020-07-01
1BumblebeeTransformers14.9912020-07-01
3Lightning McQueenDisney Cars23.9712020-07-02
6Princess LeiaBarbie99.9912020-07-03
2Optimus PrimeTransformers19.9912020-07-03
4RamoneDisney Cars20.99NULLNULL
7Wizard of Oz: GlindaBarbie43.95NULLNULL

Se você é novo em LEFT JOINs, leia este guia abrangente em várias mesas à esquerda.

E quanto à antiga sintaxe? Isso é complicado. Alguns bancos de dados podem permitir certos truques para mesas de junção à esquerda sem usar a palavra-chave JOIN, mas não há uma solução consistente que funcione em todos os casos.

Por exemplo, no Oracle você pode usar o operador (+) para fazer uma junção à esquerda:

SELECT t.id, t.name, t.brand, t.price, s.quantity, s.day
FROM toys t, sales s
WHERE t.id = s.toy_id (+);

Entretanto, esta sintaxe não funciona em outros bancos de dados.

Junções acidentais de CROSS são evitadas

Outra questão comum com a união de mesas com FROM é o acidental CROSS JOIN. Se você omitir uma condição de união em ONDE, você terá todas as linhas da primeira tabela combinadas com todas as linhas da segunda tabela. Assim, o número de linhas no conjunto de resultados será a multiplicação do número de linhas em cada tabela. Tal erro pode ser complicado de detectar e debugar.

Ao mesmo tempo, quando você usa o padrão SQL-92 para juntar tabelas, você receberá um erro de sintaxe se omitir a condição de junção. É claro que você pode cruzar suas tabelas na nova sintaxe, mas somente se você usar explicitamente a palavra-chave correspondente (CROSS JOIN).

É hora de aprender a nova sintaxe para Cláusulas JOIN em SQL!

A maioria dos praticantes de SQL concorda que a nova sintaxe é mais legível uma vez que você se acostume com ela. Esperamos que você também esteja convencido de que a abordagem moderna para unir tabelas em SQL vale a sua atenção.

LearnSQL oferece um curso abrangente em Cláusulas JOIN em SQL que inclui 93 exercícios interativos. Você terá a oportunidade de praticar as uniões internas, todos os tipos de uniões externas, uniões não-equi e uniões de si mesmo.

Além dos exercícios, você pode achar útil atualizar seus conhecimentos sobre Cláusulas JOIN em SQL com nossos guias para iniciantes:

Feliz aprendizagem!