Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
3
respostas

[Dúvida] Uso de duas tabelas na cláusula FROM

Olá, mais uma dúvida.

Nessa aula, a seguinte consulta foi criada (copiada da transcrição da aula):

WITH Media_Vendas_Anteriores AS (SELECT AVG(Qtd_Vendas) AS Media_Qtd_Vendas
FROM (
    SELECT COUNT(*) AS Qtd_Vendas, strftime("%Y", v.data_venda) AS Ano
    FROM vendas v
    WHERE strftime("%m", v.data_venda) = "11" AND Ano != "2022"
    GROUP BY Ano
)), Vendas_Atual AS (SELECT Qtd_Vendas AS Qtd_Vendas_Atual
FROM(
    SELECT COUNT(*) AS Qtd_Vendas, strftime("%Y", v.data_venda) AS Ano
    FROM vendas v
    WHERE strftime("%m", v.data_venda) = "11" AND Ano = "2022"
    GROUP BY Ano
    ))
    SELECT
    mva.Media_Qtd_Vendas,
    va.Qtd_Vendas_Atual,
    ROUND((va.Qtd_Vendas_Atual - mva.Media_Qtd_Vendas)/mva.Media_Qtd_Vendas *100.0, 2) || "%" AS Porcentagem
    FROM Vendas_Atual va, Media_Vendas_Anteriores mva

Na cláusula FROM estão sendo passadas as duas "tabelas" criadas com a cláusula WITH.

FROM Vendas_Atual va, Media_Vendas_Anteriores mva

Por favor, gostaria de entender por que isso está funcionando. Em aulas e cursos anteriores foi ensinado que para combinar tabelas deveria ser usado o JOIN, mas nesse caso simplesmente foram passadas as duas "tabelas" para o FROM e aparentemente funcionou.

Obrigado.

3 respostas
solução!

Olá, Matheus! Como vai?

Nesse caso, o FROM está funcionando como um JOIN implícito. O SQLite permite essa sintaxe mais antiga, onde você simplesmente lista as tabelas no FROM e, por padrão, ele assume que você quer um JOIN do tipo INNER JOIN.

O SQLite entende que você quer combinar as linhas das duas tabelas, Vendas_Atual e Media_Vendas_Anteriores, com base em uma condição implícita. Essa condição é que as linhas de ambas as tabelas devem ter valores correspondentes para todas as colunas que possuem o mesmo nome.

Imagine que as tabelas Vendas_Atual e Media_Vendas_Anteriores tivessem uma coluna chamada id. O SQLite automaticamente faria um JOIN implícito, combinando as linhas que tivessem o mesmo valor para a coluna id.

Apesar de funcionar, usar o JOIN explícito é recomendado por alguns motivos:

  • A sintaxe do JOIN é mais explícita e deixa claro como as tabelas estão sendo combinadas.
  • O JOIN oferece mais opções de combinação, como LEFT JOIN, RIGHT JOIN e FULL JOIN.
  • A maioria dos outros bancos de dados não permite essa sintaxe implícita, então usar o JOIN garante que sua consulta seja compatível com outros sistemas.

Espero ter ajudado!

Abraço ✨

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Oi Maiully, agradeço sua explicação!

Não lembro de isso do JOIN implícito ter sido abordado em nenhum dos cursos de SQLite, então valeu a pena aprender sobre ele. Obrigado!

Por nada, Matheus! Tô aqui para ajudar! E que bom que você trouxe essa discussão para o Fórum! ✨✨