<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Pensando em Dados]]></title><description><![CDATA[Olá! Me chamo Abdiel e sou o dono do blog Pensando em Dados. Aqui eu escrevo artigos relacionados a ciência de dados e IA onde busco compartilhar conhecimentos,]]></description><link>https://pensando-em-dados.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/687823e82ee038814b660467/cd9d2b1c-a498-41e6-82f0-c3758f6c59e8.png</url><title>Pensando em Dados</title><link>https://pensando-em-dados.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 07:23:19 GMT</lastBuildDate><atom:link href="https://pensando-em-dados.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[A transformação da matriz elétrica brasileira: o que os dados de 2011 a 2025 revelam]]></title><description><![CDATA[Durante décadas, a geração de eletricidade brasileira esteve fortemente associada às hidrelétricas. Isso não é surpreendente: o país possui uma das maiores disponibilidades de recursos hídricos do mun]]></description><link>https://pensando-em-dados.hashnode.dev/a-transforma-o-da-matriz-el-trica-brasileira-o-que-os-dados-de-2011-a-2025-revelam</link><guid isPermaLink="true">https://pensando-em-dados.hashnode.dev/a-transforma-o-da-matriz-el-trica-brasileira-o-que-os-dados-de-2011-a-2025-revelam</guid><category><![CDATA[Data Science]]></category><category><![CDATA[ciência de dados]]></category><category><![CDATA[energía]]></category><dc:creator><![CDATA[Abdiel Souza]]></dc:creator><pubDate>Wed, 09 Sep 2026 22:31:44 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/687823e82ee038814b660467/7e5ded91-6070-402d-a335-e78bcc011db0.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Durante décadas, a geração de eletricidade brasileira esteve fortemente associada às hidrelétricas. Isso não é surpreendente: o país possui uma das maiores disponibilidades de recursos hídricos do mundo e construiu grande parte de seu sistema elétrico sobre essa característica.</p>
<p>Mas algo mudou nos últimos anos.</p>
<p>A energia eólica cresceu de forma acelerada. A energia solar, praticamente inexistente no início da série analisada, tornou-se uma das principais fontes de geração. Ao mesmo tempo, a participação relativa da hidreletricidade caiu.</p>
<p>A pergunta que motivou esta análise foi simples:</p>
<blockquote>
<p><strong>Como a composição da geração elétrica brasileira realmente mudou entre 2011 e 2025?</strong></p>
</blockquote>
<p>Para responder, analisei dados públicos da <strong>Empresa de Pesquisa Energética (EPE)</strong>, utilizando principalmente as séries históricas do <strong>Balanço Energético Nacional (BEN)</strong>.</p>
<p>O resultado é mais interessante do que simplesmente dizer que "as energias renováveis cresceram". O que os dados mostram é uma <strong>diversificação de uma matriz que já era predominantemente renovável</strong>.</p>
<hr />
<h2>1. O que estamos chamando de "matriz elétrica"?</h2>
<p>Antes de olhar para os números, precisamos separar dois conceitos que frequentemente aparecem misturados:</p>
<ul>
<li><p><strong>matriz energética</strong>: conjunto de fontes utilizadas em toda a economia, incluindo transporte, indústria, residências etc.;</p>
</li>
<li><p><strong>matriz elétrica</strong>: conjunto de fontes utilizadas especificamente para produzir eletricidade.</p>
</li>
</ul>
<p>Este estudo trata da <strong>matriz elétrica</strong>.</p>
<p>Isso significa que estamos olhando para a geração de eletricidade e perguntando:</p>
<blockquote>
<p>De onde veio a eletricidade produzida no Brasil?</p>
</blockquote>
<p>Essa distinção é importante porque uma matriz elétrica pode ser bastante renovável mesmo quando a matriz energética como um todo possui uma participação muito maior de combustíveis fósseis.</p>
<hr />
<h2>2. Os dados</h2>
<p>A principal fonte utilizada foi a <strong>Empresa de Pesquisa Energética (EPE)</strong>, responsável pela elaboração e publicação do <strong>Balanço Energético Nacional (BEN)</strong>. A EPE disponibiliza séries históricas completas do BEN desde 1970, incluindo dados de geração, consumo, oferta, dados estaduais e capacidade instalada.</p>
<p>Para este estudo, o período principal escolhido foi:</p>
<p><strong>2011 → 2025</strong></p>
<p>O ano de 2025 é particularmente interessante porque é o ano-base mais recente disponível no <strong>BEN 2026</strong>.</p>
<p>Foram utilizados principalmente:</p>
<ul>
<li><p><strong>Capítulo 2 — Oferta e Demanda de Energia por Fonte</strong></p>
</li>
<li><p><strong>Capítulo 8 — Dados Estaduais</strong></p>
</li>
<li><p><strong>Anexo I — Capacidade instalada</strong></p>
</li>
<li><p><strong>Relatório Síntese do BEN 2026</strong></p>
</li>
</ul>
<p>O BEN 2026 registra <strong>775,896 TWh de geração elétrica em 2025</strong>, contra 751,335 TWh em 2024.</p>
<hr />
<h2>3. Antes da análise: uma etapa importante de validação</h2>
<p>Uma das partes mais interessantes deste projeto aconteceu antes mesmo dos gráficos.</p>
<p>Ao trabalhar com dados públicos, é tentador simplesmente carregar uma planilha, agrupar algumas colunas e começar a produzir visualizações. Mas isso pode gerar resultados aparentemente plausíveis e, ainda assim, incorretos. Foi exatamente o que aconteceu com os dados de geração por fonte nos primeiros anos da série.</p>
<p>Algumas categorias de geração térmica não estavam representadas da mesma forma nos dados estaduais processados para 2011 e 2012. Se eu simplesmente somasse as categorias disponíveis, obteria um total inferior ao total oficial da EPE.</p>
<p>A solução foi utilizar duas fontes de informação complementares:</p>
<ol>
<li><p>o <strong>total oficial de geração elétrica</strong> da EPE;</p>
</li>
<li><p>as gerações das principais fontes obtidas a partir dos dados estaduais.</p>
</li>
</ol>
<p>Assim, para cada ano:</p>
<p>$$G_{térmica} = G_{total} - (G_{hidro} + G_{eólica} + G_{solar} + G_{nuclear})$$</p>
<p>Essa categoria térmica deve ser interpretada como um <strong>resíduo analítico da composição utilizada neste estudo</strong>, e não como uma reprodução da categoria oficial "geração termelétrica" da EPE.</p>
<p>Essa distinção é importante.</p>
<p>No próprio BEN 2026, por exemplo, a EPE registra <strong>169,9 TWh de geração termelétrica em 2025</strong>, enquanto o agrupamento residual utilizado aqui possui outra composição.</p>
<p>Esse tipo de validação é uma das razões pelas quais uma análise de dados não deveria começar e terminar no <code>groupby()</code>.</p>
<hr />
<h2>4. A geração elétrica brasileira cresceu</h2>
<p>Vamos começar pelo panorama geral.</p>
<p>Em 2011, o Brasil produziu aproximadamente <strong>531,8 TWh.</strong> Em 2025, produziu cerca de <strong>775,9 TWh.</strong> Isso representa um crescimento de aproximadamente <strong>45,9%</strong> em quinze anos.</p>
<img src="https://cdn.hashnode.com/uploads/covers/687823e82ee038814b660467/a69381ac-cc4f-4fa9-8fe0-fd9b91244d3e.png" alt="" style="display:block;margin:0 auto" />

<p>Em outras palavras, o sistema elétrico brasileiro passou a produzir quase metade a mais de eletricidade do que produzia no início da série.</p>
<p>Esse crescimento não aconteceu simplesmente porque as hidrelétricas produziram mais. Na verdade, a história fica mais interessante quando olhamos para cada fonte.</p>
<img src="https://cdn.hashnode.com/uploads/covers/687823e82ee038814b660467/1f36ec0e-d1a8-4b2d-9d95-7f4bd78829c1.png" alt="" style="display:block;margin:0 auto" />

<hr />
<h2>5. A hidreletricidade continua enorme — mas perdeu concentração</h2>
<p>Em 2011, as hidrelétricas produziram aproximadamente <strong>428,3 TWh.</strong> Isso correspondia a cerca de <strong>80,5%</strong> de toda a geração elétrica brasileira naquele ano.</p>
<img src="https://cdn.hashnode.com/uploads/covers/687823e82ee038814b660467/49efab0f-db3b-4a61-80f6-ca5140777eb8.png" alt="" style="display:block;margin:0 auto" />

<p>Em 2025, a geração hidrelétrica foi de <strong>401,4 TWh.</strong> Ou seja, mesmo quinze anos depois, a geração hidrelétrica continuava em uma ordem de grandeza semelhante.</p>
<p>Mas sua participação caiu para aproximadamente <strong>51,7%.</strong> Essa diferença é fundamental, pois indica que a hidreletricidade não desapareceu, mas continua sendo a principal fonte individual de geração elétrica do país.</p>
<p>O que mudou foi o tamanho relativo das outras fontes.</p>
<hr />
<h3>5.1. A mudança fica mais clara olhando para a participação</h3>
<p>Podemos representar a transformação aproximadamente assim:</p>
<table>
<thead>
<tr>
<th>Ano</th>
<th>Hidrelétrica</th>
<th>Eólica</th>
<th>Solar</th>
<th>Nuclear</th>
</tr>
</thead>
<tbody><tr>
<td>2011</td>
<td>80,5%</td>
<td>0,5%</td>
<td>~0%</td>
<td>3,0%</td>
</tr>
<tr>
<td>2025</td>
<td>51,7%</td>
<td>15,0%</td>
<td>11,4%</td>
<td>2,0%</td>
</tr>
</tbody></table>
<p>A queda da participação hidrelétrica, portanto, não significa necessariamente uma substituição direta de hidrelétricas por outras tecnologias.</p>
<p>O que ocorreu foi uma <strong>expansão muito mais rápida de outras fontes</strong>.</p>
<hr />
<h2>6. A energia eólica deixou de ser marginal</h2>
<p>Talvez uma das transformações mais evidentes seja a expansão da energia eólica.</p>
<p>Em 2011, a geração eólica brasileira foi de aproximadamente <strong>2,7 TWh.</strong> Em 2025, foi cerca de <strong>116,5 TWh.</strong> Isso representa um aumento de mais de <strong>113 TWh</strong>.</p>
<p>Em termos de participação na geração total:</p>
<p><strong>0,5% → 15,0%</strong></p>
<p>A EPE registra 116,488 TWh de geração eólica em 2025, um crescimento de 8,2% em relação a 2024.</p>
<p>Além da geração, a capacidade instalada também cresceu significativamente. O Anuário Estatístico de Energia Elétrica 2026 registra aproximadamente <strong>34,7 GW de capacidade eólica instalada em 2025</strong>.</p>
<p>Isso mostra que a energia eólica deixou de ser uma fonte complementar pequena e passou a ocupar uma posição estrutural dentro do sistema elétrico brasileiro.</p>
<hr />
<h2>7. E então veio a energia solar</h2>
<p>Se a expansão eólica já é impressionante, a trajetória da solar é ainda mais radical.</p>
<p>Em 2011, a geração solar praticamente não aparecia na escala da geração elétrica nacional.</p>
<p>Em 2025, ela alcançou:</p>
<p><strong>88,1 TWh</strong></p>
<p>ou aproximadamente:</p>
<p><strong>11,4% da geração elétrica brasileira.</strong></p>
<p>A EPE registra 88,141 TWh de geração solar fotovoltaica em 2025, crescimento de <strong>24,7%</strong> em relação ao ano anterior.</p>
<p>Mas existe uma particularidade importante aqui.</p>
<p>Esse número inclui:</p>
<ul>
<li><p>geração solar centralizada;</p>
</li>
<li><p>micro e minigeração distribuída (MMGD).</p>
</li>
</ul>
<p>Ou seja, não estamos falando apenas de grandes parques solares.</p>
<p>Parte significativa dessa transformação aconteceu nos telhados e instalações de consumidores.</p>
<hr />
<h2>8. A geração distribuída mudou a escala da energia solar</h2>
<p>A expansão da solar brasileira não pode ser entendida olhando apenas para grandes usinas.</p>
<p>Segundo a EPE, a capacidade instalada solar chegou a aproximadamente <strong>64,8 GW em 2025</strong>, sendo cerca de <strong>44,7 GW de geração distribuída</strong> e <strong>20,1 GW de geração centralizada</strong>.</p>
<p>Isso é um ótimo exemplo de por que <strong>geração e capacidade instalada não são a mesma coisa</strong>.</p>
<p>Capacidade instalada responde:</p>
<blockquote>
<p>Quanto equipamento capaz de gerar eletricidade existe?</p>
</blockquote>
<p>Geração responde:</p>
<blockquote>
<p>Quanto esse equipamento efetivamente produziu?</p>
</blockquote>
<p>Neste artigo estamos principalmente interessados na segunda pergunta.</p>
<hr />
<h2>9. Eólica + solar: a transformação mais evidente</h2>
<p>Talvez o indicador mais interessante para entender a mudança estrutural seja observar eólica e solar juntas.</p>
<p>Em 2011:</p>
<p><strong>Eólica + solar ≈ 0,5% da geração</strong></p>
<p>Em 2025:</p>
<p><strong>Eólica + solar ≈ 26,4% da geração</strong></p>
<img src="https://cdn.hashnode.com/uploads/covers/687823e82ee038814b660467/bf9449df-772e-407f-97e4-bee3b00495b6.png" alt="" style="display:block;margin:0 auto" />

<p>Isso significa que, em 2025, aproximadamente <strong>um quarto de toda a eletricidade brasileira veio dessas duas fontes</strong>.</p>
<p>A própria EPE registra que eólica e solar, juntas, representaram <strong>26,4% da geração elétrica brasileira em 2025</strong>.</p>
<p>Em termos absolutos:</p>
<ul>
<li><p>Eólica: <strong>116,5 TWh</strong></p>
</li>
<li><p>Solar: <strong>88,1 TWh</strong></p>
</li>
<li><p>Eólica + solar: <strong>204,6 TWh</strong></p>
</li>
</ul>
<p>É uma mudança enorme em relação ao início da série.</p>
<hr />
<h2>10. A matriz ficou menos dependente de uma única fonte</h2>
<p>Aqui está, provavelmente, o ponto central de toda a análise. Se olharmos somente para a participação da hidreletricidade, temos:</p>
<pre><code class="language-text">2011 ─────────────────────────── 80,5%

2025 ─────────────────── 51,7%
</code></pre>
<p>A hidrelétrica continuou sendo a maior fonte individual. Mas sua participação caiu quase 29 pontos percentuais.</p>
<p>Ao mesmo tempo:</p>
<pre><code class="language-text">Eólica + Solar

2011 ─  ~0,5%

2025 ─  26,4%
</code></pre>
<p>Portanto, não estamos diante de uma simples história de:</p>
<blockquote>
<p>"hidrelétrica saiu, solar e eólica entraram."</p>
</blockquote>
<p>A história é mais interessante:</p>
<blockquote>
<p><strong>A demanda por eletricidade cresceu, novas fontes cresceram muito mais rapidamente e a participação relativa da hidreletricidade caiu.</strong></p>
</blockquote>
<p>Isso é <strong>diversificação</strong>.</p>
<img src="https://cdn.hashnode.com/uploads/covers/687823e82ee038814b660467/fea32210-5f01-4429-aafd-3b4e263c4a56.png" alt="" style="display:block;margin:0 auto" />

<hr />
<h2>11. Mas o Brasil ficou menos renovável?</h2>
<p>Não. E esse é um ponto que pode parecer contraditório à primeira vista.</p>
<p>A queda da participação hidrelétrica não significa automaticamente uma queda da participação de fontes renováveis. A hidrelétrica perdeu espaço relativo, mas outras fontes renováveis cresceram.</p>
<p>Em 2025, a EPE registrou:</p>
<p><strong>86,8% de participação das fontes renováveis na matriz elétrica brasileira.</strong></p>
<p>Portanto, uma interpretação mais correta seria:</p>
<blockquote>
<p><strong>O Brasil diversificou uma matriz elétrica que já era predominantemente renovável.</strong></p>
</blockquote>
<p>Essa diferença de linguagem é importante.</p>
<p>Não estamos descrevendo simplesmente uma "transição de uma matriz fóssil para uma matriz renovável". Estamos observando, principalmente no período analisado, uma <strong>mudança na composição interna de uma matriz já fortemente renovável</strong>.</p>
<hr />
<h2>12. E as fontes térmicas?</h2>
<p>As fontes térmicas continuam desempenhando um papel importante no sistema. A EPE registrou <strong>169,9 TWh de geração termelétrica em 2025</strong>, um aumento de 12,3% em relação a 2024.</p>
<p>O gás natural, sozinho, alcançou <strong>8,6 TWh</strong> em 2025, ou seja, um crescimento de 22,7% em relação ao ano anterior.</p>
<p>Isso ajuda a lembrar de uma coisa importante:</p>
<p><strong>uma matriz elétrica diversificada não significa uma matriz composta exclusivamente por fontes renováveis.</strong></p>
<p>Fontes térmicas continuam presentes e podem desempenhar funções importantes na operação do sistema.</p>
<hr />
<h2>13. E a energia nuclear?</h2>
<p>A geração nuclear permaneceu relativamente estável durante o período.</p>
<p>Em 2011:</p>
<p><strong>15,7 TWh</strong></p>
<p>Em 2025:</p>
<p><strong>15,8 TWh</strong></p>
<p>Portanto, enquanto eólica e solar passaram por uma expansão estrutural, a geração nuclear permaneceu em uma faixa bastante semelhante.</p>
<p>Sua participação relativa caiu de aproximadamente:</p>
<p><strong>3,0% → 2,0%</strong></p>
<p>principalmente porque o sistema como um todo cresceu enquanto a geração nuclear permaneceu relativamente estável.</p>
<hr />
<h2>14. O que aconteceu, então?</h2>
<p>Podemos resumir a transformação em quatro movimentos.</p>
<h3>1. O sistema cresceu</h3>
<p>A geração passou de:</p>
<p><strong>531,8 TWh → 775,9 TWh</strong></p>
<p>Um crescimento de aproximadamente <strong>45,9%</strong>.</p>
<h3>2. A hidreletricidade continuou dominante</h3>
<p>Mas sua participação caiu de:</p>
<p><strong>80,5% → 51,7%</strong></p>
<h3>3. A eólica se tornou estrutural</h3>
<p>Passou de:</p>
<p><strong>0,5% → 15,0%</strong></p>
<p>da geração.</p>
<h3>4. A solar surgiu como uma grande fonte</h3>
<p>Passou de praticamente zero na escala da matriz para:</p>
<p><strong>11,4%</strong></p>
<p>da geração em 2025.</p>
<p>O resultado foi uma matriz significativamente mais diversificada.</p>
<hr />
<h2>15. Uma forma diferente de enxergar a transformação</h2>
<p>Imagine que o Brasil tivesse mantido exatamente a mesma estrutura relativa de geração de 2011. A hidreletricidade teria continuado representando aproximadamente 80% da geração.</p>
<p>Mas isso não aconteceu. Em 2025, mais de 48% da geração veio de fontes diferentes da hidrelétrica.</p>
<p>Isso não significa que as hidrelétricas deixaram de ser importantes. Significa que <strong>o sistema passou a distribuir uma parcela muito maior da geração entre diferentes tecnologias</strong>.</p>
<p>Essa é uma diferença conceitual importante.</p>
<hr />
<h2>16. O que os dados não conseguem responder?</h2>
<p>É aqui que precisamos tomar cuidado. Uma análise histórica da geração elétrica consegue mostrar <strong>o que aconteceu</strong>. Ela não consegue, sozinha, explicar completamente <strong>por que aconteceu</strong>.</p>
<p>Este estudo não modela:</p>
<ul>
<li><p>despacho horário;</p>
</li>
<li><p>restrições de transmissão;</p>
</li>
<li><p>armazenamento;</p>
</li>
<li><p>hidrologia detalhada;</p>
</li>
<li><p>preços da energia;</p>
</li>
<li><p>custos de geração;</p>
</li>
<li><p>curtailment;</p>
</li>
<li><p>segurança energética;</p>
</li>
<li><p>confiabilidade;</p>
</li>
<li><p>expansão da rede;</p>
</li>
<li><p>políticas públicas;</p>
</li>
<li><p>fatores econômicos;</p>
</li>
<li><p>causalidade entre os eventos.</p>
</li>
</ul>
<p>Também não estamos calculando fatores de capacidade, pois isso exigiria dados de geração e capacidade com metodologia e granularidade adequadas.</p>
<p>Da mesma forma, <strong>capacidade instalada não deve ser interpretada como geração efetiva</strong>. Uma usina de 1 GW não necessariamente produz a mesma quantidade de energia que outra usina de 1 GW.</p>
<hr />
<h2>17. Geração não é capacidade</h2>
<p>Esse ponto merece uma seção própria porque é uma das confusões mais comuns em análises do setor elétrico.</p>
<p>Imagine duas tecnologias:</p>
<pre><code class="language-text">Tecnologia A
Capacidade: 10 GW
Geração:    30 TWh

Tecnologia B
Capacidade: 10 GW
Geração:    50 TWh
</code></pre>
<p>As duas possuem a mesma potência instalada. Mas produziram quantidades diferentes de energia.</p>
<p>Portanto:</p>
<blockquote>
<p><strong>MW/GW representam capacidade.</strong></p>
<p><strong>MWh/TWh representam energia gerada.</strong></p>
</blockquote>
<p>Neste estudo, quando afirmamos que a participação da eólica chegou a 15%, estamos falando da <strong>participação na geração elétrica</strong>, não da participação na capacidade instalada.</p>
<hr />
<h2>18. E onde ficam os estados?</h2>
<p>Os dados estaduais também revelam uma característica interessante do sistema brasileiro: a geração não está distribuída uniformemente pelo território.</p>
<p>Em 2025, os maiores volumes de geração estadual foram registrados por:</p>
<table>
<thead>
<tr>
<th>Estado</th>
<th>Geração aproximada</th>
</tr>
</thead>
<tbody><tr>
<td>Paraná</td>
<td>89,4 TWh</td>
</tr>
<tr>
<td>São Paulo</td>
<td>75,1 TWh</td>
</tr>
<tr>
<td>Minas Gerais</td>
<td>72,0 TWh</td>
</tr>
<tr>
<td>Pará</td>
<td>64,9 TWh</td>
</tr>
<tr>
<td>Bahia</td>
<td>63,4 TWh</td>
</tr>
<tr>
<td>Rio de Janeiro</td>
<td>59,2 TWh</td>
</tr>
</tbody></table>
<p>Esses números mostram que a geografia da geração elétrica brasileira é bastante concentrada em determinadas regiões e estados.</p>
<p>E isso abre uma outra pergunta interessante:</p>
<blockquote>
<p><strong>Onde estão sendo construídas as novas fontes de geração?</strong></p>
</blockquote>
<p>Essa pergunta merece uma análise própria, especialmente quando pensamos em eólica e solar.</p>
<hr />
<h2>19. Uma observação importante sobre 2025</h2>
<p>Os dados mais recentes reforçam que a transformação continua acontecendo.</p>
<p>Em 2025:</p>
<ul>
<li><p>geração total: <strong>775,9 TWh</strong></p>
</li>
<li><p>hidrelétrica: <strong>401,4 TWh</strong></p>
</li>
<li><p>eólica: <strong>116,5 TWh</strong></p>
</li>
<li><p>solar: <strong>88,1 TWh</strong></p>
</li>
<li><p>nuclear: <strong>15,8 TWh</strong></p>
</li>
</ul>
<p>A EPE também registra que a geração hidráulica caiu 4,8% em relação a 2024, enquanto a solar cresceu 24,7% e a eólica 8,2%.</p>
<p>Isso significa que a fotografia de 2025 não é apenas uma continuação passiva do que aconteceu nos anos anteriores.</p>
<p>A composição continua mudando.</p>
<hr />
<h2>20. Então, afinal: o Brasil deixou de depender das hidrelétricas?</h2>
<p><strong>Não.</strong></p>
<p>Mas também não é correto dizer que nada mudou.</p>
<p>A melhor interpretação dos dados é:</p>
<blockquote>
<p><strong>O Brasil continua profundamente dependente da hidreletricidade, mas sua matriz elétrica tornou-se muito menos concentrada nela.</strong></p>
</blockquote>
<p>Em 2011, aproximadamente quatro quintos da geração vinham da hidreletricidade.</p>
<p>Em 2025, pouco mais da metade vinha dessa fonte.</p>
<p>Ao mesmo tempo, eólica e solar passaram juntas de aproximadamente 0,5% para 26,4% da geração.</p>
<p>Essa transformação não eliminou a importância das hidrelétricas. Ela mudou o contexto em que elas operam.</p>
<hr />
<h2>21. O que mais me chamou atenção nesta análise</h2>
<p>Quando comecei este estudo, era fácil imaginar uma narrativa simples:</p>
<blockquote>
<p>"O Brasil está abandonando as hidrelétricas e adotando energia solar e eólica."</p>
</blockquote>
<p>Os dados não contam exatamente essa história.</p>
<p>A narrativa mais precisa é:</p>
<blockquote>
<p><strong>O Brasil ampliou sua capacidade de geração e diversificou as fontes utilizadas para produzir eletricidade, reduzindo a concentração relativa da geração hidrelétrica sem deixar de possuir uma matriz predominantemente renovável.</strong></p>
</blockquote>
<p>Essa diferença pode parecer apenas semântica. Mas, para quem trabalha com dados, ela é fundamental. Uma boa análise não deve confirmar uma narrativa que parece intuitiva. Ela deve permitir que os dados <strong>modifiquem a narrativa</strong>.</p>
<hr />
<h2>22. Como a análise foi construída</h2>
<p>O pipeline conceitual utilizado neste estudo foi:</p>
<pre><code class="language-text">Dados brutos da EPE
        │
        ▼
Extração das séries históricas
        │
        ▼
Padronização dos dados
        │
        ▼
Agregação por fonte e ano
        │
        ▼
Validação contra o total oficial
        │
        ▼
Cálculo das participações
        │
        ▼
Análise exploratória
        │
        ▼
Visualizações
        │
        ▼
Interpretação
</code></pre>
<p>Para cada ano:</p>
<p>$$Participação = \frac{Geração\ da\ fonte} {Geração\ total} \times 100$$</p>
<p>A análise foi construída com foco em transparência e reprodutibilidade.</p>
<hr />
<h2>23. Reprodutibilidade</h2>
<p>Todo o estudo foi estruturado para que os dados e resultados possam ser reproduzidos.</p>
<p>O projeto contém:</p>
<ul>
<li><p>dataset tratado;</p>
</li>
<li><p>código de processamento;</p>
</li>
<li><p>análises exploratórias;</p>
</li>
<li><p>gráficos;</p>
</li>
<li><p>manuscrito;</p>
</li>
<li><p>documentação das decisões metodológicas.</p>
</li>
</ul>
<blockquote>
<p><strong>Repositório:</strong> <a href="https://github.com/abdielsouza/cpap/tree/master/An%C3%A1lise%20da%20Matriz%20Energ%C3%A9tica%20Brasileira">https://github.com/abdielsouza/cpap/tree/master/An%C3%A1lise%20da%20Matriz%20Energ%C3%A9tica%20Brasileira</a></p>
</blockquote>
<blockquote>
<p><strong>Datasets:</strong> <a href="https://github.com/abdielsouza/cpap/tree/master/An%C3%A1lise%20da%20Matriz%20Energ%C3%A9tica%20Brasileira/datasets">https://github.com/abdielsouza/cpap/tree/master/An%C3%A1lise%20da%20Matriz%20Energ%C3%A9tica%20Brasileira/datasets</a></p>
</blockquote>
<p>A ideia é que os números apresentados neste artigo não sejam apenas números "jogados na tela". Eles devem poder ser rastreados até a fonte original.</p>
<hr />
<h2>24. Fontes oficiais</h2>
<p>As principais fontes utilizadas foram:</p>
<ul>
<li><p><a href="https://www.epe.gov.br/pt/publicacoes-dados-abertos/publicacoes/BEN-Series-Historicas-Completas">EPE — BEN: Séries Históricas e Matrizes</a></p>
</li>
<li><p><a href="https://www.epe.gov.br/pt/publicacoes-dados-abertos/publicacoes/Balanco-Energetico-Nacional-2026">EPE — Balanço Energético Nacional 2026</a></p>
</li>
<li><p><a href="https://www.epe.gov.br/sites-pt/publicacoes-dados-abertos/publicacoes/PublicacoesArquivos/publicacao-975/topico-847/BEN_S%C3%ADntese_2026_PT.pdf">EPE — Relatório Síntese BEN 2026</a></p>
</li>
<li><p><a href="https://www.epe.gov.br/pt/imprensa/noticias/epe-publica-o-anuario-estatistico-de-energia-eletrica-2026-ano-base-2025-">EPE — Anuário Estatístico de Energia Elétrica 2026</a></p>
</li>
</ul>
<p>As séries históricas do BEN disponibilizadas pela EPE cobrem dados desde 1970 e incluem, entre outros, os capítulos de oferta e demanda por fonte, dados estaduais e capacidade instalada.</p>
<hr />
<h2>25. Conclusão</h2>
<p>Entre 2011 e 2025, o sistema elétrico brasileiro passou por uma transformação significativa.</p>
<p>A geração total cresceu quase 46%.</p>
<p>A hidreletricidade continuou sendo a principal fonte, mas sua participação caiu de aproximadamente 80,5% para 51,7%.</p>
<p>Enquanto isso:</p>
<ul>
<li><p>a eólica passou de uma fonte marginal para aproximadamente 15% da geração;</p>
</li>
<li><p>a solar passou de praticamente zero para aproximadamente 11%;</p>
</li>
<li><p>eólica e solar juntas chegaram a 26,4%;</p>
</li>
<li><p>a participação total de fontes renováveis permaneceu muito elevada, chegando a 86,8% em 2025.</p>
</li>
</ul>
<p>Portanto, a principal transformação não foi simplesmente a substituição da hidreletricidade, mas sim a <strong>diversificação da matriz elétrica brasileira</strong>.</p>
<p>E talvez essa seja a melhor forma de resumir quinze anos de dados:</p>
<blockquote>
<p><strong>O Brasil não deixou de depender da hidreletricidade, mas passou a depender menos exclusivamente dela.</strong></p>
</blockquote>
]]></content:encoded></item><item><title><![CDATA[JOINs em SQL: como combinar dados de diferentes tabelas]]></title><description><![CDATA[Nos artigos anteriores, aprendemos a consultar, filtrar e agregar dados. Já conseguimos responder perguntas como:

Quantos pedidos foram realizados?

Qual foi o faturamento?

Qual categoria vendeu mai]]></description><link>https://pensando-em-dados.hashnode.dev/joins-em-sql-como-combinar-dados-de-diferentes-tabelas</link><guid isPermaLink="true">https://pensando-em-dados.hashnode.dev/joins-em-sql-como-combinar-dados-de-diferentes-tabelas</guid><category><![CDATA[SQL]]></category><category><![CDATA[Banco de Dados]]></category><category><![CDATA[ciência de dados]]></category><dc:creator><![CDATA[Abdiel Souza]]></dc:creator><pubDate>Tue, 18 Aug 2026 19:15:57 GMT</pubDate><content:encoded><![CDATA[<p>Nos artigos anteriores, aprendemos a consultar, filtrar e agregar dados. Já conseguimos responder perguntas como:</p>
<ul>
<li><p>Quantos pedidos foram realizados?</p>
</li>
<li><p>Qual foi o faturamento?</p>
</li>
<li><p>Qual categoria vendeu mais?</p>
</li>
<li><p>Qual foi o ticket médio?</p>
</li>
</ul>
<p>Mas existe um problema que aparece rapidamente quando começamos a trabalhar com bancos de dados reais: <strong>as informações geralmente estão distribuídas em várias tabelas</strong>.</p>
<p>Um pedido pode estar em uma tabela, enquanto as informações sobre o cliente estão em outra. Os detalhes dos produtos podem estar em uma terceira tabela.</p>
<p>Como combinamos tudo isso?</p>
<p>É para isso que servem os <strong>JOINs</strong>.</p>
<h2>Por que os dados ficam em tabelas diferentes?</h2>
<p>Antes de entender os <code>JOINs</code>, precisamos entender por que não colocamos tudo em uma única tabela.</p>
<p>Imagine uma loja virtual. Poderíamos ter uma tabela <code>customers</code>:</p>
<table>
<thead>
<tr>
<th>id</th>
<th>name</th>
<th>city</th>
</tr>
</thead>
<tbody><tr>
<td>101</td>
<td>Ana</td>
<td>São Paulo</td>
</tr>
<tr>
<td>102</td>
<td>João</td>
<td>Recife</td>
</tr>
<tr>
<td>103</td>
<td>Maria</td>
<td>Curitiba</td>
</tr>
</tbody></table>
<p>E uma tabela <code>orders</code>:</p>
<table>
<thead>
<tr>
<th>id</th>
<th>customer_id</th>
<th>order_date</th>
<th>order_value</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>101</td>
<td>2026-01-10</td>
<td>1500</td>
</tr>
<tr>
<td>2</td>
<td>102</td>
<td>2026-01-12</td>
<td>200</td>
</tr>
<tr>
<td>3</td>
<td>101</td>
<td>2026-01-15</td>
<td>800</td>
</tr>
</tbody></table>
<p>Observe que a tabela <code>orders</code> não precisa repetir o nome e a cidade do cliente em cada pedido.</p>
<p>Em vez disso, ela possui a coluna <code>customer_id</code>, que permite identificar <strong>quem fez cada pedido</strong>.</p>
<p>Essa coluna funciona como uma ligação entre as duas tabelas.</p>
<h2>O que é um JOIN?</h2>
<p>Um <code>JOIN</code> permite combinar registros de duas ou mais tabelas utilizando uma condição de relacionamento entre elas.</p>
<p>No nosso exemplo, podemos relacionar:</p>
<pre><code class="language-text">customers.id
      ↓
orders.customer_id
</code></pre>
<p>Ou seja, o <code>id</code> do cliente em <code>customers</code> corresponde ao <code>customer_id</code> armazenado em <code>orders</code>.</p>
<p>Podemos utilizar essa relação para descobrir, por exemplo, o nome do cliente associado a cada pedido.</p>
<pre><code class="language-sql">SELECT
    orders.id,
    customers.name,
    orders.order_value
FROM orders
JOIN customers
    ON orders.customer_id = customers.id;
</code></pre>
<p>O resultado poderia ser:</p>
<table>
<thead>
<tr>
<th>id</th>
<th>name</th>
<th>order_value</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Ana</td>
<td>1500</td>
</tr>
<tr>
<td>2</td>
<td>João</td>
<td>200</td>
</tr>
<tr>
<td>3</td>
<td>Ana</td>
<td>800</td>
</tr>
</tbody></table>
<p>Agora temos informações que originalmente estavam em duas tabelas diferentes.</p>
<h2>Entendendo o ON</h2>
<p>A parte mais importante de um <code>JOIN</code> é a condição definida depois de <code>ON</code>.</p>
<p>No exemplo:</p>
<pre><code class="language-sql">ON orders.customer_id = customers.id
</code></pre>
<p>Estamos dizendo ao banco:</p>
<blockquote>
<p>"Relacione um pedido ao cliente cujo <code>id</code> corresponde ao <code>customer_id</code> desse pedido."</p>
</blockquote>
<p>Essa condição determina <strong>como as tabelas devem ser relacionadas</strong>.</p>
<p>Se escolhermos uma condição errada, o resultado também estará errado.</p>
<p>Por isso, entender as relações entre as tabelas é uma das partes mais importantes de trabalhar com SQL.</p>
<h2>INNER JOIN</h2>
<p>O tipo de <code>JOIN</code> mais comum é o <code>INNER JOIN</code>.</p>
<p>Ele retorna apenas os registros que possuem correspondência <strong>nas duas tabelas</strong>.</p>
<p>Por exemplo:</p>
<pre><code class="language-sql">SELECT
    orders.id,
    customers.name,
    orders.order_value
FROM orders
INNER JOIN customers
    ON orders.customer_id = customers.id;
</code></pre>
<p>Se existir um pedido cujo <code>customer_id</code> não corresponda a nenhum cliente na tabela <code>customers</code>, esse pedido não aparecerá no resultado.</p>
<p>Podemos visualizar a ideia assim:</p>
<pre><code class="language-text">customers        orders
    ●──────────────●
       correspondência
</code></pre>
<p>O <code>INNER JOIN</code> mantém apenas aquilo que existe nos dois lados.</p>
<p>Na prática, quando escrevemos simplesmente:</p>
<pre><code class="language-sql">JOIN customers
</code></pre>
<p>em muitos bancos de dados estamos utilizando <code>INNER JOIN</code>.</p>
<h2>LEFT JOIN</h2>
<p>Agora imagine outra situação.</p>
<p>Queremos listar <strong>todos os clientes</strong>, inclusive aqueles que nunca fizeram um pedido.</p>
<p>Nesse caso, um <code>INNER JOIN</code> não seria suficiente.</p>
<p>Podemos utilizar um <code>LEFT JOIN</code>:</p>
<pre><code class="language-sql">SELECT
    customers.name,
    orders.id AS order_id,
    orders.order_value
FROM customers
LEFT JOIN orders
    ON customers.id = orders.customer_id;
</code></pre>
<p>O <code>LEFT JOIN</code> mantém todos os registros da tabela que está à esquerda do <code>JOIN</code>.</p>
<p>Nesse caso, <code>customers</code> é a tabela da esquerda.</p>
<p>Se um cliente não tiver nenhum pedido, as colunas provenientes de <code>orders</code> aparecerão como <code>NULL</code>.</p>
<p>Por exemplo:</p>
<table>
<thead>
<tr>
<th>name</th>
<th>order_id</th>
<th>order_value</th>
</tr>
</thead>
<tbody><tr>
<td>Ana</td>
<td>1</td>
<td>1500</td>
</tr>
<tr>
<td>Ana</td>
<td>3</td>
<td>800</td>
</tr>
<tr>
<td>João</td>
<td>2</td>
<td>200</td>
</tr>
<tr>
<td>Maria</td>
<td>NULL</td>
<td>NULL</td>
</tr>
</tbody></table>
<p>Maria continua aparecendo porque o objetivo era manter todos os clientes.</p>
<p>Essa diferença entre <code>INNER JOIN</code> e <code>LEFT JOIN</code> é extremamente importante.</p>
<h2>INNER JOIN vs. LEFT JOIN</h2>
<p>Podemos resumir assim:</p>
<p><strong>INNER JOIN</strong></p>
<blockquote>
<p>"Quero somente os registros que possuem correspondência nas duas tabelas."</p>
</blockquote>
<p><strong>LEFT JOIN</strong></p>
<blockquote>
<p>"Quero todos os registros da tabela da esquerda, mesmo que não exista correspondência na tabela da direita."</p>
</blockquote>
<p>Uma boa pergunta para fazer antes de escolher o <code>JOIN</code> é:</p>
<blockquote>
<p><strong>"Quero manter registros que não possuem correspondência?"</strong></p>
</blockquote>
<p>Se a resposta for não, <code>INNER JOIN</code> pode ser adequado.</p>
<p>Se a resposta for sim, provavelmente você precisará de um <code>LEFT JOIN</code>.</p>
<h2>JOIN com três tabelas</h2>
<p>Na prática, análises frequentemente precisam combinar mais de duas tabelas.</p>
<p>Imagine que nosso banco tenha:</p>
<ul>
<li><p><code>customers</code>: clientes;</p>
</li>
<li><p><code>orders</code>: pedidos;</p>
</li>
<li><p><code>products</code>: produtos.</p>
</li>
</ul>
<p>Podemos combinar essas tabelas em uma única consulta.</p>
<p>Por exemplo:</p>
<pre><code class="language-sql">SELECT
    customers.name,
    orders.id AS order_id,
    products.name AS product_name,
    orders.order_value
FROM orders
INNER JOIN customers
    ON orders.customer_id = customers.id
INNER JOIN products
    ON orders.product_id = products.id;
</code></pre>
<p>Agora podemos consultar informações do cliente, do pedido e do produto simultaneamente.</p>
<p>A ideia continua sendo a mesma: cada <code>JOIN</code> adiciona uma nova relação.</p>
<h2>O perigo da duplicação</h2>
<p>Aqui chegamos a um dos problemas mais importantes para quem está começando com SQL.</p>
<p>Um <code>JOIN</code> pode <strong>aumentar a quantidade de linhas do resultado</strong>.</p>
<p>Isso não significa necessariamente que existe um erro.</p>
<p>Imagine que Ana tenha feito três pedidos.</p>
<p>Na tabela <code>customers</code>, Ana aparece uma vez:</p>
<table>
<thead>
<tr>
<th>id</th>
<th>name</th>
</tr>
</thead>
<tbody><tr>
<td>101</td>
<td>Ana</td>
</tr>
</tbody></table>
<p>Na tabela <code>orders</code>, ela aparece três vezes:</p>
<table>
<thead>
<tr>
<th>id</th>
<th>customer_id</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>101</td>
</tr>
<tr>
<td>3</td>
<td>101</td>
</tr>
<tr>
<td>7</td>
<td>101</td>
</tr>
</tbody></table>
<p>Ao fazer o <code>JOIN</code>, Ana aparecerá três vezes:</p>
<table>
<thead>
<tr>
<th>name</th>
<th>order_id</th>
</tr>
</thead>
<tbody><tr>
<td>Ana</td>
<td>1</td>
</tr>
<tr>
<td>Ana</td>
<td>3</td>
</tr>
<tr>
<td>Ana</td>
<td>7</td>
</tr>
</tbody></table>
<p>Isso acontece porque existe uma relação de <strong>um para muitos</strong>:</p>
<blockquote>
<p>um cliente → vários pedidos.</p>
</blockquote>
<p>O <code>JOIN</code> está funcionando corretamente.</p>
<p>O problema aparece quando não entendemos essa relação e fazemos uma agregação depois.</p>
<h2>Um exemplo de erro em uma análise</h2>
<p>Imagine que queremos calcular o faturamento por cliente.</p>
<p>Podemos fazer:</p>
<pre><code class="language-sql">SELECT
    customers.name,
    SUM(orders.order_value) AS total_sales
FROM customers
INNER JOIN orders
    ON customers.id = orders.customer_id
GROUP BY customers.name;
</code></pre>
<p>Essa consulta faz sentido porque cada pedido aparece uma vez no resultado do <code>JOIN</code>.</p>
<p>Mas, se adicionarmos outra tabela que tenha várias linhas para cada pedido, podemos acabar multiplicando os registros.</p>
<p>Por isso, antes de fazer um <code>JOIN</code>, é importante entender:</p>
<ul>
<li><p>Qual é a granularidade de cada tabela?</p>
</li>
<li><p>Qual coluna conecta as tabelas?</p>
</li>
<li><p>A relação é um para um?</p>
</li>
<li><p>Um para muitos?</p>
</li>
<li><p>Muitos para muitos?</p>
</li>
<li><p>Quantas linhas espero ter depois do <code>JOIN</code>?</p>
</li>
</ul>
<p>Essas perguntas são fundamentais para evitar análises incorretas.</p>
<h2>O que é uma chave?</h2>
<p>Para entender melhor os <code>JOINs</code>, vale conhecer dois conceitos:</p>
<p><strong>Chave primária</strong> é uma coluna — ou conjunto de colunas — utilizada para identificar unicamente um registro em uma tabela.</p>
<p>No nosso exemplo:</p>
<pre><code class="language-text">customers.id
</code></pre>
<p>pode ser a chave primária da tabela <code>customers</code>.</p>
<p>Já uma <strong>chave estrangeira</strong> é uma coluna que faz referência a uma chave de outra tabela.</p>
<p>No nosso caso:</p>
<pre><code class="language-text">orders.customer_id
</code></pre>
<p>faz referência a:</p>
<pre><code class="language-text">customers.id
</code></pre>
<p>Essa estrutura permite estabelecer relações entre as tabelas.</p>
<p>Não é necessário dominar modelagem de bancos de dados para começar a usar SQL, mas entender esse conceito ajuda muito na hora de construir <code>JOINs</code>.</p>
<h2>Usando aliases</h2>
<p>Quando começamos a combinar várias tabelas, as consultas podem ficar grandes.</p>
<p>Uma prática bastante útil é utilizar aliases para dar nomes mais curtos às tabelas.</p>
<p>Por exemplo:</p>
<pre><code class="language-sql">SELECT
    c.name,
    o.id AS order_id,
    o.order_value
FROM orders AS o
INNER JOIN customers AS c
    ON o.customer_id = c.id;
</code></pre>
<p>Agora:</p>
<ul>
<li><p><code>o</code> representa <code>orders</code>;</p>
</li>
<li><p><code>c</code> representa <code>customers</code>.</p>
</li>
</ul>
<p>Isso deixa a consulta mais compacta e, em consultas com várias tabelas, pode melhorar bastante a legibilidade.</p>
<h2>JOIN e análise de dados</h2>
<p>Os <code>JOINs</code> são especialmente importantes porque permitem transformar dados armazenados de maneira separada em informações úteis para análise.</p>
<p>Imagine uma pergunta como:</p>
<blockquote>
<p>"Quais clientes geraram mais receita?"</p>
</blockquote>
<p>Precisamos de pelo menos duas informações:</p>
<ul>
<li><p>o cliente;</p>
</li>
<li><p>o valor dos seus pedidos.</p>
</li>
</ul>
<p>Essas informações estão em tabelas diferentes.</p>
<p>Podemos combiná-las e depois utilizar <code>GROUP BY</code>:</p>
<pre><code class="language-sql">SELECT
    c.name,
    SUM(o.order_value) AS total_sales
FROM customers AS c
INNER JOIN orders AS o
    ON c.id = o.customer_id
GROUP BY c.name
ORDER BY total_sales DESC;
</code></pre>
<p>Aqui estamos combinando vários conceitos que já aprendemos:</p>
<ul>
<li><p><code>JOIN</code> conecta clientes e pedidos;</p>
</li>
<li><p><code>SUM</code> calcula a receita;</p>
</li>
<li><p><code>GROUP BY</code> cria uma linha por cliente;</p>
</li>
<li><p><code>ORDER BY</code> organiza os clientes pelo faturamento.</p>
</li>
</ul>
<p>É assim que SQL começa a se tornar realmente poderoso para análise de dados: <strong>combinando diferentes operações para responder perguntas de negócio</strong>.</p>
<h2>O que aprendemos até aqui?</h2>
<p>Neste artigo, vimos:</p>
<ul>
<li><p>por que os dados são armazenados em diferentes tabelas;</p>
</li>
<li><p>o que é um <code>JOIN</code>;</p>
</li>
<li><p>como utilizar <code>ON</code> para definir o relacionamento;</p>
</li>
<li><p>a diferença entre <code>INNER JOIN</code> e <code>LEFT JOIN</code>;</p>
</li>
<li><p>como combinar três ou mais tabelas;</p>
</li>
<li><p>o conceito de chave primária e chave estrangeira;</p>
</li>
<li><p>por que um <code>JOIN</code> pode aumentar a quantidade de registros;</p>
</li>
<li><p>como evitar problemas de duplicação;</p>
</li>
<li><p>como utilizar aliases para deixar consultas mais legíveis.</p>
</li>
</ul>
<p>Se você está começando, não se preocupe em memorizar todos os tipos de <code>JOIN</code> agora.</p>
<p>O mais importante é entender a ideia central:</p>
<blockquote>
<p><strong>Um JOIN permite combinar informações relacionadas que estão armazenadas em tabelas diferentes.</strong></p>
</blockquote>
<p>A partir daqui, já temos os principais fundamentos para começar a escrever consultas realmente úteis para análise de dados.</p>
<p>No próximo artigo, vamos avançar para recursos que permitem <strong>transformar e organizar os dados dentro das próprias consultas</strong>, como <code>CASE WHEN</code>, <code>NULL</code> e outras ferramentas bastante úteis no dia a dia de um analista.</p>
]]></content:encoded></item><item><title><![CDATA[GROUP BY e funções de agregação: criando métricas com SQL]]></title><description><![CDATA[No artigo anterior, aprendemos a consultar, filtrar e ordenar dados utilizando comandos como SELECT, WHERE e ORDER BY.
Isso já permite responder perguntas simples sobre uma tabela. Mas, em análise de ]]></description><link>https://pensando-em-dados.hashnode.dev/group-by-e-fun-es-de-agrega-o-criando-m-tricas-com-sql</link><guid isPermaLink="true">https://pensando-em-dados.hashnode.dev/group-by-e-fun-es-de-agrega-o-criando-m-tricas-com-sql</guid><category><![CDATA[ciência de dados]]></category><category><![CDATA[Banco de Dados]]></category><category><![CDATA[SQL]]></category><dc:creator><![CDATA[Abdiel Souza]]></dc:creator><pubDate>Tue, 18 Aug 2026 19:11:30 GMT</pubDate><content:encoded><![CDATA[<p>No artigo anterior, aprendemos a consultar, filtrar e ordenar dados utilizando comandos como <code>SELECT</code>, <code>WHERE</code> e <code>ORDER BY</code>.</p>
<p>Isso já permite responder perguntas simples sobre uma tabela. Mas, em análise de dados, frequentemente precisamos ir além de consultar registros individuais.</p>
<p>Imagine uma tabela com 1 milhão de pedidos. Em vez de analisar cada pedido separadamente, talvez você queira responder perguntas como:</p>
<ul>
<li><p>Quantos pedidos foram realizados?</p>
</li>
<li><p>Qual foi o faturamento total?</p>
</li>
<li><p>Qual foi o valor médio dos pedidos?</p>
</li>
<li><p>Quanto cada categoria vendeu?</p>
</li>
<li><p>Quantos pedidos cada cliente realizou?</p>
</li>
</ul>
<p>Para esse tipo de análise, precisamos conhecer as <strong>funções de agregação</strong> e o <code>GROUP BY</code>.</p>
<h2>O que são funções de agregação?</h2>
<p>Funções de agregação são funções que recebem vários registros e produzem um resultado resumido.</p>
<p>As principais que você deve conhecer no início são:</p>
<table>
<thead>
<tr>
<th>Função</th>
<th>O que calcula</th>
</tr>
</thead>
<tbody><tr>
<td><code>COUNT</code></td>
<td>Quantidade</td>
</tr>
<tr>
<td><code>SUM</code></td>
<td>Soma</td>
</tr>
<tr>
<td><code>AVG</code></td>
<td>Média</td>
</tr>
<tr>
<td><code>MIN</code></td>
<td>Menor valor</td>
</tr>
<tr>
<td><code>MAX</code></td>
<td>Maior valor</td>
</tr>
</tbody></table>
<p>Vamos utilizar novamente nossa tabela <code>orders</code>, que poderia ter uma estrutura semelhante a esta:</p>
<table>
<thead>
<tr>
<th>id</th>
<th>customer_id</th>
<th>category</th>
<th>order_value</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>101</td>
<td>Eletrônicos</td>
<td>1500</td>
</tr>
<tr>
<td>2</td>
<td>102</td>
<td>Livros</td>
<td>200</td>
</tr>
<tr>
<td>3</td>
<td>101</td>
<td>Eletrônicos</td>
<td>800</td>
</tr>
<tr>
<td>4</td>
<td>103</td>
<td>Casa</td>
<td>350</td>
</tr>
<tr>
<td>5</td>
<td>104</td>
<td>Livros</td>
<td>120</td>
</tr>
</tbody></table>
<h2>COUNT: contando registros</h2>
<p>Comecemos pelo <code>COUNT</code>.</p>
<p>Se quisermos saber quantos pedidos existem na tabela:</p>
<pre><code class="language-sql">SELECT COUNT(*)
FROM orders;
</code></pre>
<p>O banco retorna um único número representando a quantidade de registros.</p>
<p>Essa é uma das consultas mais simples e também uma das mais úteis.</p>
<p>Podemos, por exemplo, utilizar <code>COUNT</code> para descobrir quantos pedidos foram realizados:</p>
<pre><code class="language-sql">SELECT COUNT(*) AS total_orders
FROM orders;
</code></pre>
<p>O <code>AS</code> cria um <strong>alias</strong>, ou seja, um nome mais amigável para a coluna do resultado.</p>
<p>Em vez de termos uma coluna chamada simplesmente <code>COUNT(*)</code>, teremos <code>total_orders</code>.</p>
<h2>SUM: calculando totais</h2>
<p>Agora imagine que queremos saber quanto foi vendido no total.</p>
<p>Podemos utilizar <code>SUM</code>:</p>
<pre><code class="language-sql">SELECT SUM(order_value) AS total_sales
FROM orders;
</code></pre>
<p>Nesse caso, o SQL soma todos os valores da coluna <code>order_value</code>.</p>
<p>Essa operação é extremamente comum em análise de dados. Dependendo do contexto, podemos utilizar <code>SUM</code> para calcular:</p>
<ul>
<li><p>faturamento;</p>
</li>
<li><p>quantidade de produtos vendidos;</p>
</li>
<li><p>custos;</p>
</li>
<li><p>descontos;</p>
</li>
<li><p>margem;</p>
</li>
<li><p>outras métricas acumuláveis.</p>
</li>
</ul>
<h2>AVG: calculando médias</h2>
<p>Para calcular uma média, usamos <code>AVG</code>.</p>
<p>Por exemplo:</p>
<pre><code class="language-sql">SELECT AVG(order_value) AS average_order_value
FROM orders;
</code></pre>
<p>Podemos utilizar essa métrica para descobrir o <strong>ticket médio</strong>, por exemplo.</p>
<p>A ideia é simples:</p>
<blockquote>
<p>Se <code>SUM</code> nos ajuda a descobrir o total, <code>AVG</code> nos ajuda a entender o valor médio.</p>
</blockquote>
<h2>MIN e MAX</h2>
<p>As funções <code>MIN</code> e <code>MAX</code> retornam, respectivamente, o menor e o maior valor.</p>
<pre><code class="language-sql">SELECT
    MIN(order_value) AS smallest_order,
    MAX(order_value) AS largest_order
FROM orders;
</code></pre>
<p>Com uma única consulta, podemos descobrir o menor e o maior pedido da tabela.</p>
<p>Essas funções também podem ser utilizadas com datas, números e outros tipos de dados compatíveis.</p>
<h2>O problema de olhar apenas para o total</h2>
<p>Até aqui, conseguimos responder perguntas gerais.</p>
<p>Por exemplo:</p>
<blockquote>
<p>"Quanto a loja vendeu?"</p>
</blockquote>
<p>Mas imagine que a pergunta seja:</p>
<blockquote>
<p>"Quanto a loja vendeu em cada categoria?"</p>
</blockquote>
<p>Agora precisamos de uma forma de <strong>dividir os dados em grupos</strong>.</p>
<p>É exatamente isso que o <code>GROUP BY</code> faz.</p>
<h2>O que é GROUP BY?</h2>
<p>O <code>GROUP BY</code> permite agrupar registros que possuem determinado valor em comum.</p>
<p>Por exemplo:</p>
<pre><code class="language-sql">SELECT
    category,
    SUM(order_value) AS total_sales
FROM orders
GROUP BY category;
</code></pre>
<p>Agora, em vez de obter um único total, teremos um total para cada categoria.</p>
<p>O resultado poderia ser:</p>
<table>
<thead>
<tr>
<th>category</th>
<th>total_sales</th>
</tr>
</thead>
<tbody><tr>
<td>Casa</td>
<td>350</td>
</tr>
<tr>
<td>Eletrônicos</td>
<td>2300</td>
</tr>
<tr>
<td>Livros</td>
<td>320</td>
</tr>
</tbody></table>
<p>Podemos interpretar a consulta da seguinte forma:</p>
<blockquote>
<p>"Separe os pedidos por categoria e calcule o total de vendas de cada grupo."</p>
</blockquote>
<p>Essa é uma das ideias mais importantes de SQL para análise de dados.</p>
<h2>GROUP BY com COUNT</h2>
<p>Podemos combinar <code>GROUP BY</code> com diferentes funções de agregação.</p>
<p>Por exemplo, para descobrir quantos pedidos existem em cada categoria:</p>
<pre><code class="language-sql">SELECT
    category,
    COUNT(*) AS total_orders
FROM orders
GROUP BY category;
</code></pre>
<p>O resultado poderia ser:</p>
<table>
<thead>
<tr>
<th>category</th>
<th>total_orders</th>
</tr>
</thead>
<tbody><tr>
<td>Casa</td>
<td>1</td>
</tr>
<tr>
<td>Eletrônicos</td>
<td>2</td>
</tr>
<tr>
<td>Livros</td>
<td>2</td>
</tr>
</tbody></table>
<p>Agora temos uma métrica de quantidade para cada grupo.</p>
<h2>GROUP BY com AVG</h2>
<p>Também podemos calcular a média por grupo.</p>
<pre><code class="language-sql">SELECT
    category,
    AVG(order_value) AS average_order_value
FROM orders
GROUP BY category;
</code></pre>
<p>Assim, conseguimos descobrir o valor médio dos pedidos de cada categoria.</p>
<p>Essa mesma lógica pode ser aplicada a praticamente qualquer dimensão que faça sentido para a análise.</p>
<p>Por exemplo:</p>
<ul>
<li><p>vendas por mês;</p>
</li>
<li><p>pedidos por cidade;</p>
</li>
<li><p>receita por produto;</p>
</li>
<li><p>clientes por segmento;</p>
</li>
<li><p>salário médio por departamento.</p>
</li>
</ul>
<h2>Agrupando por mais de uma coluna</h2>
<p>Também podemos utilizar mais de uma coluna no <code>GROUP BY</code>.</p>
<p>Imagine que queremos descobrir quanto cada cliente gastou em cada categoria:</p>
<pre><code class="language-sql">SELECT
    customer_id,
    category,
    SUM(order_value) AS total_sales
FROM orders
GROUP BY customer_id, category;
</code></pre>
<p>Nesse caso, o grupo é definido pela combinação de <code>customer_id</code> e <code>category</code>.</p>
<p>Ou seja, teremos uma linha para cada combinação de cliente e categoria.</p>
<p>Essa possibilidade é muito importante em análises mais detalhadas.</p>
<h2>WHERE e GROUP BY</h2>
<p>É comum utilizar <code>WHERE</code> junto com <code>GROUP BY</code>.</p>
<p>Por exemplo, podemos querer calcular as vendas por categoria considerando apenas pedidos acima de R$ 500:</p>
<pre><code class="language-sql">SELECT
    category,
    SUM(order_value) AS total_sales
FROM orders
WHERE order_value &gt; 500
GROUP BY category;
</code></pre>
<p>Aqui acontece uma sequência lógica:</p>
<ol>
<li><p>O <code>WHERE</code> filtra os pedidos.</p>
</li>
<li><p>O <code>GROUP BY</code> agrupa os pedidos restantes.</p>
</li>
<li><p>O <code>SUM</code> calcula o total de cada grupo.</p>
</li>
</ol>
<p>Essa ordem de raciocínio é importante.</p>
<p>Primeiro decidimos <strong>quais registros participam da análise</strong>. Depois decidimos <strong>como agrupá-los</strong>.</p>
<h2>WHERE não é HAVING</h2>
<p>Existe uma diferença importante entre <code>WHERE</code> e <code>HAVING</code>.</p>
<p>O <code>WHERE</code> filtra <strong>registros antes da agregação</strong>.</p>
<p>O <code>HAVING</code> filtra <strong>grupos depois da agregação</strong>.</p>
<p>Por exemplo, imagine que queremos encontrar apenas as categorias que faturaram mais de R$ 1.000:</p>
<pre><code class="language-sql">SELECT
    category,
    SUM(order_value) AS total_sales
FROM orders
GROUP BY category
HAVING SUM(order_value) &gt; 1000;
</code></pre>
<p>Nesse caso, não queremos filtrar pedidos individuais.</p>
<p>Queremos primeiro calcular o total de cada categoria e, depois, manter apenas as categorias cujo total ultrapassa R$ 1.000.</p>
<p>Uma forma simples de lembrar é:</p>
<blockquote>
<p><strong>WHERE filtra linhas. HAVING filtra grupos.</strong></p>
</blockquote>
<p>Essa diferença aparece com muita frequência em consultas de análise de dados.</p>
<h2>Uma consulta mais completa</h2>
<p>Agora podemos combinar vários dos conceitos que aprendemos.</p>
<p>Imagine que queremos descobrir as cinco categorias com maior faturamento em 2026.</p>
<p>Uma consulta poderia ser:</p>
<pre><code class="language-sql">SELECT
    category,
    COUNT(*) AS total_orders,
    SUM(order_value) AS total_sales,
    AVG(order_value) AS average_order_value
FROM orders
WHERE order_date &gt;= '2026-01-01'
  AND order_date &lt; '2027-01-01'
GROUP BY category
ORDER BY total_sales DESC
LIMIT 5;
</code></pre>
<p>Essa consulta parece mais complexa, mas podemos desmontá-la em etapas:</p>
<ul>
<li><p><code>WHERE</code> seleciona apenas os pedidos de 2026;</p>
</li>
<li><p><code>GROUP BY</code> separa os pedidos por categoria;</p>
</li>
<li><p><code>COUNT</code> calcula a quantidade de pedidos;</p>
</li>
<li><p><code>SUM</code> calcula o faturamento;</p>
</li>
<li><p><code>AVG</code> calcula o ticket médio;</p>
</li>
<li><p><code>ORDER BY</code> coloca as categorias mais lucrativas primeiro;</p>
</li>
<li><p><code>LIMIT</code> mantém apenas as cinco primeiras.</p>
</li>
</ul>
<p>Perceba como os comandos que aprendemos nos artigos anteriores começam a se combinar para responder perguntas mais interessantes.</p>
<h2>Pensando como um analista</h2>
<p>A essa altura, é importante começar a mudar a maneira de pensar sobre SQL.</p>
<p>Uma consulta não deve ser apenas uma sequência de comandos que você tenta montar até funcionar.</p>
<p>Antes de escrever o código, tente transformar a pergunta em etapas.</p>
<p>Por exemplo:</p>
<blockquote>
<p>"Quais cidades geraram mais vendas?"</p>
</blockquote>
<p>Podemos pensar:</p>
<p><strong>O que quero medir?</strong> Valor das vendas → <code>SUM</code></p>
<p><strong>Como quero dividir os dados?</strong> Por cidade → <code>GROUP BY city</code></p>
<p><strong>Como quero ordenar?</strong> Da maior para a menor venda → <code>ORDER BY</code></p>
<p>A consulta então surge naturalmente:</p>
<pre><code class="language-sql">SELECT
    city,
    SUM(order_value) AS total_sales
FROM orders
GROUP BY city
ORDER BY total_sales DESC;
</code></pre>
<p>Esse raciocínio é muito mais importante do que decorar a sintaxe.</p>
<h2>Cuidado com o nível de detalhe</h2>
<p>Um erro bastante comum ao começar a utilizar <code>GROUP BY</code> é escolher uma granularidade que não corresponde à pergunta.</p>
<p>Imagine que queremos descobrir o faturamento por cidade. Se adicionarmos também <code>customer_id</code> ao agrupamento:</p>
<pre><code class="language-sql">GROUP BY city, customer_id
</code></pre>
<p>já não teremos mais o faturamento por cidade. Teremos o faturamento por <strong>cliente dentro de cada cidade</strong>.</p>
<p>O resultado pode continuar sendo tecnicamente correto, mas responderá a uma pergunta diferente.</p>
<p>Por isso, antes de utilizar <code>GROUP BY</code>, pergunte:</p>
<blockquote>
<p><strong>"Qual deve ser uma linha do meu resultado final?"</strong></p>
</blockquote>
<p>Se a resposta for "uma linha por cidade", provavelmente <code>city</code> será a dimensão que você deve utilizar no agrupamento.</p>
<p>Essa forma de pensar será cada vez mais importante à medida que as consultas ficarem mais complexas.</p>
<h2>O que aprendemos até aqui?</h2>
<p>Neste artigo, vimos como transformar registros individuais em métricas e resumos utilizando:</p>
<ul>
<li><p><code>COUNT</code> para contar registros;</p>
</li>
<li><p><code>SUM</code> para calcular totais;</p>
</li>
<li><p><code>AVG</code> para calcular médias;</p>
</li>
<li><p><code>MIN</code> e <code>MAX</code> para encontrar extremos;</p>
</li>
<li><p><code>GROUP BY</code> para dividir os dados em grupos;</p>
</li>
<li><p><code>HAVING</code> para filtrar grupos após a agregação.</p>
</li>
</ul>
<p>Esses recursos estão entre os mais utilizados em SQL para análise de dados.</p>
<p>Com eles, já conseguimos responder perguntas bastante comuns de negócio, como:</p>
<blockquote>
<p>Quanto vendemos?</p>
</blockquote>
<blockquote>
<p>Quantos pedidos recebemos?</p>
</blockquote>
<blockquote>
<p>Qual é o ticket médio?</p>
</blockquote>
<blockquote>
<p>Qual categoria vende mais?</p>
</blockquote>
<blockquote>
<p>Quais cidades geram mais receita?</p>
</blockquote>
<p>Mas ainda existe um problema importante.</p>
<p>Os dados de uma empresa normalmente não estão todos em uma única tabela. Clientes estão em uma tabela, pedidos em outra, produtos em outra e assim por diante.</p>
<p>Como podemos combinar essas informações?</p>
<p>Para isso, precisamos aprender um dos conceitos mais importantes de SQL: os <strong>JOINs</strong>.</p>
<p>No próximo artigo, vamos entender como combinar dados de diferentes tabelas e, principalmente, como evitar erros comuns que podem fazer uma análise apresentar números incorretos.</p>
]]></content:encoded></item><item><title><![CDATA[SELECT, WHERE e ORDER BY: consultando e filtrando dados com SQL]]></title><description><![CDATA[No artigo anterior, vimos o que é SQL, como os bancos de dados são organizados e por que essa linguagem é tão importante para quem trabalha com análise de dados.
Agora vamos começar a colocar a mão na]]></description><link>https://pensando-em-dados.hashnode.dev/select-where-e-order-by-consultando-e-filtrando-dados-com-sql</link><guid isPermaLink="true">https://pensando-em-dados.hashnode.dev/select-where-e-order-by-consultando-e-filtrando-dados-com-sql</guid><category><![CDATA[ciência de dados]]></category><category><![CDATA[Banco de Dados]]></category><category><![CDATA[SQL]]></category><dc:creator><![CDATA[Abdiel Souza]]></dc:creator><pubDate>Tue, 18 Aug 2026 01:28:15 GMT</pubDate><content:encoded><![CDATA[<p>No artigo anterior, vimos o que é SQL, como os bancos de dados são organizados e por que essa linguagem é tão importante para quem trabalha com análise de dados.</p>
<p>Agora vamos começar a colocar a mão na massa.</p>
<p>Neste artigo, vamos conhecer alguns dos comandos mais básicos e importantes do SQL: <code>SELECT</code>, <code>FROM</code>, <code>WHERE</code> e <code>ORDER BY</code>. Com eles, já conseguimos fazer algo fundamental em qualquer análise: <strong>escolher quais dados queremos consultar, filtrar os registros que nos interessam e organizar o resultado</strong>.</p>
<p>Para os exemplos, vamos continuar imaginando o banco de dados de uma loja virtual.</p>
<h2>Consultando uma tabela com SELECT</h2>
<p>O comando <code>SELECT</code> é provavelmente o primeiro comando SQL que você vai aprender. Ele serve para indicar <strong>quais informações queremos obter</strong> de uma tabela.</p>
<p>Imagine uma tabela chamada <code>customers</code>, que contém informações sobre os clientes:</p>
<table>
<thead>
<tr>
<th>id</th>
<th>name</th>
<th>city</th>
<th>age</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Ana</td>
<td>São Paulo</td>
<td>28</td>
</tr>
<tr>
<td>2</td>
<td>João</td>
<td>Recife</td>
<td>35</td>
</tr>
<tr>
<td>3</td>
<td>Maria</td>
<td>Curitiba</td>
<td>31</td>
</tr>
</tbody></table>
<p>Se quisermos consultar os nomes dos clientes, podemos escrever:</p>
<pre><code class="language-sql">SELECT name
FROM customers;
</code></pre>
<p>A palavra <code>FROM</code> indica <strong>de qual tabela</strong> queremos buscar os dados.</p>
<p>Podemos interpretar a consulta assim:</p>
<blockquote>
<p>"Selecione o nome a partir da tabela de clientes."</p>
</blockquote>
<p>O resultado seria:</p>
<table>
<thead>
<tr>
<th>name</th>
</tr>
</thead>
<tbody><tr>
<td>Ana</td>
</tr>
<tr>
<td>João</td>
</tr>
<tr>
<td>Maria</td>
</tr>
</tbody></table>
<p>Também podemos selecionar mais de uma coluna:</p>
<pre><code class="language-sql">SELECT name, city
FROM customers;
</code></pre>
<p>Nesse caso, o resultado terá apenas o nome e a cidade de cada cliente.</p>
<h2>Selecionando todas as colunas</h2>
<p>Às vezes queremos consultar todas as informações disponíveis na tabela. Para isso, podemos utilizar o asterisco (<code>*</code>):</p>
<pre><code class="language-sql">SELECT *
FROM customers;
</code></pre>
<p>O <code>*</code> significa que queremos todas as colunas.</p>
<p>Embora seja útil para explorar uma tabela rapidamente, é uma boa prática evitar <code>SELECT *</code> em consultas que serão utilizadas de forma definitiva. Quando sabemos quais colunas precisamos, é preferível especificá-las:</p>
<pre><code class="language-sql">SELECT name, city, age
FROM customers;
</code></pre>
<p>Isso deixa a consulta mais clara e evita trazer dados desnecessários.</p>
<h2>Filtrando dados com WHERE</h2>
<p>Selecionar dados é apenas o começo. Em uma análise, normalmente não queremos todos os registros de uma tabela.</p>
<p>Imagine que queremos descobrir apenas os clientes que moram em São Paulo.</p>
<p>É para isso que usamos o <code>WHERE</code>.</p>
<pre><code class="language-sql">SELECT name, city
FROM customers
WHERE city = 'São Paulo';
</code></pre>
<p>Agora o banco de dados retorna somente os registros que atendem à condição.</p>
<p>O <code>WHERE</code> pode ser entendido como:</p>
<blockquote>
<p>"Retorne apenas os registros que satisfazem esta condição."</p>
</blockquote>
<p>Esse é um dos comandos mais importantes do SQL, porque permite trabalhar com subconjuntos dos dados.</p>
<h2>Comparando valores</h2>
<p>Podemos utilizar diferentes operadores para criar filtros.</p>
<p>Por exemplo, para encontrar clientes com mais de 30 anos:</p>
<pre><code class="language-sql">SELECT name, age
FROM customers
WHERE age &gt; 30;
</code></pre>
<p>Podemos também procurar clientes com idade igual a 30:</p>
<pre><code class="language-sql">SELECT name, age
FROM customers
WHERE age = 30;
</code></pre>
<p>Alguns dos operadores mais comuns são:</p>
<table>
<thead>
<tr>
<th>Operador</th>
<th>Significado</th>
</tr>
</thead>
<tbody><tr>
<td><code>=</code></td>
<td>igual a</td>
</tr>
<tr>
<td><code>&lt;&gt;</code></td>
<td>diferente de</td>
</tr>
<tr>
<td><code>&gt;</code></td>
<td>maior que</td>
</tr>
<tr>
<td><code>&lt;</code></td>
<td>menor que</td>
</tr>
<tr>
<td><code>&gt;=</code></td>
<td>maior ou igual a</td>
</tr>
<tr>
<td><code>&lt;=</code></td>
<td>menor ou igual a</td>
</tr>
</tbody></table>
<p>Eles podem ser utilizados tanto com números quanto com outros tipos de dados, dependendo da situação.</p>
<h2>Combinando condições</h2>
<p>Também podemos criar filtros mais específicos combinando condições.</p>
<p>O operador <code>AND</code> exige que <strong>todas as condições</strong> sejam verdadeiras.</p>
<p>Por exemplo, para encontrar clientes de São Paulo com mais de 30 anos:</p>
<pre><code class="language-sql">SELECT name, city, age
FROM customers
WHERE city = 'São Paulo'
  AND age &gt; 30;
</code></pre>
<p>Já o operador <code>OR</code> permite que <strong>pelo menos uma das condições</strong> seja verdadeira.</p>
<pre><code class="language-sql">SELECT name, city
FROM customers
WHERE city = 'São Paulo'
   OR city = 'Rio de Janeiro';
</code></pre>
<p>Nesse caso, serão retornados clientes de qualquer uma das duas cidades.</p>
<p>É importante prestar atenção à lógica das condições. À medida que as consultas ficam mais complexas, o uso de parênteses pode ajudar a deixar essa lógica explícita.</p>
<h2>Filtrando por uma lista de valores com IN</h2>
<p>Quando queremos verificar se uma coluna corresponde a vários valores possíveis, o operador <code>IN</code> pode deixar a consulta mais simples.</p>
<p>Por exemplo:</p>
<pre><code class="language-sql">SELECT name, city
FROM customers
WHERE city IN ('São Paulo', 'Rio de Janeiro', 'Curitiba');
</code></pre>
<p>Em vez de escrever várias condições com <code>OR</code>, podemos informar diretamente a lista de valores desejados.</p>
<h2>Filtrando intervalos com BETWEEN</h2>
<p>O <code>BETWEEN</code> é útil quando queremos trabalhar com intervalos.</p>
<p>Por exemplo, para encontrar clientes com idade entre 25 e 35 anos:</p>
<pre><code class="language-sql">SELECT name, age
FROM customers
WHERE age BETWEEN 25 AND 35;
</code></pre>
<p>Ele também pode ser utilizado com datas, algo bastante comum em análise de dados.</p>
<p>Por exemplo:</p>
<pre><code class="language-sql">SELECT *
FROM orders
WHERE order_date BETWEEN '2026-01-01' AND '2026-01-31';
</code></pre>
<p>Ao trabalhar com datas, entretanto, é importante entender como o banco de dados armazena valores de data e hora. Em situações mais complexas, outras formas de filtragem podem ser mais adequadas.</p>
<h2>Procurando textos com LIKE</h2>
<p>O operador <code>LIKE</code> permite procurar padrões dentro de textos.</p>
<p>Por exemplo, imagine que queremos encontrar clientes cujo nome começa com "Mar":</p>
<pre><code class="language-sql">SELECT name
FROM customers
WHERE name LIKE 'Mar%';
</code></pre>
<p>O símbolo <code>%</code> representa uma sequência de caracteres.</p>
<p>Assim, a condição poderia encontrar nomes como:</p>
<ul>
<li><p>Maria</p>
</li>
<li><p>Marcos</p>
</li>
<li><p>Mariana</p>
</li>
</ul>
<p>O <code>LIKE</code> é especialmente útil quando não conhecemos exatamente o valor que estamos procurando.</p>
<h2>Organizando os resultados com ORDER BY</h2>
<p>Depois de selecionar e filtrar os dados, talvez seja interessante organizá-los.</p>
<p>Para isso, usamos o <code>ORDER BY</code>.</p>
<p>Por exemplo, podemos listar os clientes do mais velho para o mais novo:</p>
<pre><code class="language-sql">SELECT name, age
FROM customers
ORDER BY age DESC;
</code></pre>
<p><code>DESC</code> significa que queremos a ordenação decrescente.</p>
<p>Para fazer o contrário, podemos usar <code>ASC</code>:</p>
<pre><code class="language-sql">SELECT name, age
FROM customers
ORDER BY age ASC;
</code></pre>
<p><code>ASC</code> significa ordem crescente.</p>
<p>Na prática, <code>ASC</code> costuma ser o comportamento padrão, então também poderíamos escrever:</p>
<pre><code class="language-sql">SELECT name, age
FROM customers
ORDER BY age;
</code></pre>
<h2>Ordenando por mais de uma coluna</h2>
<p>Também podemos utilizar mais de uma coluna no <code>ORDER BY</code>.</p>
<p>Imagine que queremos ordenar os clientes primeiro por cidade e, dentro de cada cidade, pelo nome:</p>
<pre><code class="language-sql">SELECT name, city
FROM customers
ORDER BY city ASC, name ASC;
</code></pre>
<p>O banco primeiro organiza os registros pela cidade. Quando dois ou mais registros possuem a mesma cidade, o nome é utilizado como critério seguinte.</p>
<p>Essa possibilidade é bastante útil quando estamos explorando dados e queremos tornar o resultado mais fácil de interpretar.</p>
<h2>Limitando a quantidade de resultados</h2>
<p>Quando estamos trabalhando com tabelas muito grandes, pode ser útil retornar apenas uma determinada quantidade de registros.</p>
<p>Em muitos bancos de dados, podemos utilizar <code>LIMIT</code>:</p>
<pre><code class="language-sql">SELECT name, age
FROM customers
ORDER BY age DESC
LIMIT 10;
</code></pre>
<p>Nesse exemplo, estamos pedindo os 10 clientes mais velhos.</p>
<p>Uma combinação como essa é bastante comum:</p>
<pre><code class="language-text">SELECT → escolhe as colunas
FROM → indica a tabela
WHERE → filtra os registros
ORDER BY → organiza o resultado
LIMIT → limita a quantidade de linhas
</code></pre>
<h2>Juntando tudo</h2>
<p>Agora podemos combinar os conceitos que vimos.</p>
<p>Imagine que queremos encontrar os cinco pedidos de maior valor realizados em janeiro de 2026.</p>
<p>Uma consulta poderia ser:</p>
<pre><code class="language-sql">SELECT customer_id, order_date, order_value
FROM orders
WHERE order_date BETWEEN '2026-01-01' AND '2026-01-31'
ORDER BY order_value DESC
LIMIT 5;
</code></pre>
<p>Podemos ler essa consulta de cima para baixo:</p>
<ul>
<li><p><code>SELECT</code>: queremos cliente, data e valor do pedido;</p>
</li>
<li><p><code>FROM</code>: os dados estão na tabela <code>orders</code>;</p>
</li>
<li><p><code>WHERE</code>: queremos apenas pedidos de janeiro;</p>
</li>
<li><p><code>ORDER BY</code>: queremos ordenar pelo valor, do maior para o menor;</p>
</li>
<li><p><code>LIMIT</code>: queremos apenas os cinco primeiros resultados.</p>
</li>
</ul>
<p>Essa forma de pensar é muito importante. Em vez de tentar decorar cada consulta, procure entender <strong>qual pergunta estamos fazendo ao banco e como cada cláusula ajuda a responder essa pergunta</strong>.</p>
<h2>E o DISTINCT?</h2>
<p>Existe ainda um comando bastante útil nessa etapa: <code>DISTINCT</code>. Ele serve para eliminar valores duplicados do resultado.</p>
<p>Por exemplo, se quisermos descobrir quais cidades aparecem na tabela de clientes:</p>
<pre><code class="language-sql">SELECT DISTINCT city
FROM customers;
</code></pre>
<p>Em vez de retornar a cidade de cada cliente, teremos uma lista de cidades sem repetições.</p>
<p>Isso pode ser bastante útil durante a exploração inicial dos dados.</p>
<h2>O que aprendemos até aqui?</h2>
<p>Neste artigo, conhecemos alguns dos principais blocos de construção de uma consulta SQL:</p>
<ul>
<li><p><code>SELECT</code> para escolher as colunas;</p>
</li>
<li><p><code>FROM</code> para indicar a tabela;</p>
</li>
<li><p><code>WHERE</code> para filtrar registros;</p>
</li>
<li><p><code>AND</code> e <code>OR</code> para combinar condições;</p>
</li>
<li><p><code>IN</code> para trabalhar com listas de valores;</p>
</li>
<li><p><code>BETWEEN</code> para intervalos;</p>
</li>
<li><p><code>LIKE</code> para procurar padrões em textos;</p>
</li>
<li><p><code>ORDER BY</code> para ordenar resultados;</p>
</li>
<li><p><code>LIMIT</code> para limitar a quantidade de registros;</p>
</li>
<li><p><code>DISTINCT</code> para remover duplicidades do resultado.</p>
</li>
</ul>
<p>Com esses comandos, já conseguimos realizar uma quantidade razoável de consultas simples.</p>
<p>Mas ainda estamos olhando para os dados principalmente <strong>linha por linha</strong>. Em análise de dados, muitas vezes queremos algo diferente: transformar milhares ou milhões de registros em métricas e resumos.</p>
<p>Por exemplo:</p>
<blockquote>
<p>Quantos pedidos foram realizados?</p>
</blockquote>
<blockquote>
<p>Qual foi o faturamento total?</p>
</blockquote>
<blockquote>
<p>Qual produto vendeu mais?</p>
</blockquote>
<blockquote>
<p>Quanto cada categoria faturou?</p>
</blockquote>
<p>Para responder perguntas desse tipo, precisamos aprender a <strong>agrupar e agregar dados</strong>.</p>
<p>É isso que veremos no próximo artigo, quando entraremos em <code>COUNT</code>, <code>SUM</code>, <code>AVG</code> e <code>GROUP BY</code>.</p>
]]></content:encoded></item><item><title><![CDATA[SQL para análise de dados: o que é e por onde começar]]></title><description><![CDATA[Se você está começando a estudar análise de dados, provavelmente já encontrou a sigla SQL em algum momento. Ela aparece em vagas de emprego, cursos, ferramentas de BI e praticamente em qualquer área q]]></description><link>https://pensando-em-dados.hashnode.dev/sql-para-an-lise-de-dados-o-que-e-por-onde-come-ar</link><guid isPermaLink="true">https://pensando-em-dados.hashnode.dev/sql-para-an-lise-de-dados-o-que-e-por-onde-come-ar</guid><category><![CDATA[Banco de Dados]]></category><category><![CDATA[SQL]]></category><category><![CDATA[ciência de dados]]></category><dc:creator><![CDATA[Abdiel Souza]]></dc:creator><pubDate>Tue, 18 Aug 2026 01:23:38 GMT</pubDate><content:encoded><![CDATA[<p>Se você está começando a estudar análise de dados, provavelmente já encontrou a sigla <strong>SQL</strong> em algum momento. Ela aparece em vagas de emprego, cursos, ferramentas de BI e praticamente em qualquer área que trabalhe diretamente com grandes volumes de dados.</p>
<p>Mas afinal, o que é SQL e por que ele é tão importante para quem trabalha com dados?</p>
<p>Neste artigo, vamos entender os conceitos básicos sem entrar em detalhes técnicos. A ideia é oferecer um ponto de partida para quem nunca trabalhou com SQL e mostrar quais conhecimentos você deve desenvolver a partir daqui.</p>
<h2>O que é SQL?</h2>
<p>SQL, sigla para <strong>Structured Query Language</strong> (Linguagem de Consulta Estruturada), é uma linguagem utilizada para trabalhar com bancos de dados relacionais.</p>
<p>De forma simples, podemos pensar no SQL como uma maneira de <strong>fazer perguntas aos dados</strong>.</p>
<p>Imagine, por exemplo, que uma empresa tenha milhares de registros de vendas. Um analista pode querer responder perguntas como:</p>
<ul>
<li><p>Quanto a empresa vendeu no último mês?</p>
</li>
<li><p>Quais foram os produtos mais vendidos?</p>
</li>
<li><p>Quais clientes fizeram mais compras?</p>
</li>
<li><p>Qual categoria gerou mais receita?</p>
</li>
<li><p>Como as vendas evoluíram ao longo do tempo?</p>
</li>
</ul>
<p>Em vez de procurar essas informações manualmente, podemos utilizar SQL para fazer essas consultas diretamente ao banco de dados.</p>
<h2>Onde os dados ficam?</h2>
<p>Antes de entender SQL, é importante conhecer alguns conceitos básicos de bancos de dados.</p>
<p>Um banco de dados pode armazenar diversas <strong>tabelas</strong>, e cada tabela normalmente representa um tipo de informação.</p>
<p>Imagine um banco de dados de uma loja virtual. Ele poderia ter tabelas como:</p>
<ul>
<li><p><code>customers</code>: informações sobre clientes;</p>
</li>
<li><p><code>orders</code>: pedidos realizados;</p>
</li>
<li><p><code>products</code>: produtos disponíveis;</p>
</li>
<li><p><code>categories</code>: categorias dos produtos.</p>
</li>
</ul>
<p>Uma tabela, por sua vez, é formada por <strong>colunas</strong> e <strong>linhas</strong>.</p>
<p>Por exemplo:</p>
<table>
<thead>
<tr>
<th>id</th>
<th>cliente</th>
<th>cidade</th>
<th>idade</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Ana</td>
<td>São Paulo</td>
<td>28</td>
</tr>
<tr>
<td>2</td>
<td>João</td>
<td>Recife</td>
<td>35</td>
</tr>
<tr>
<td>3</td>
<td>Maria</td>
<td>Curitiba</td>
<td>31</td>
</tr>
</tbody></table>
<p>Cada <strong>coluna</strong> representa uma característica dos dados. Nesse caso, temos <code>id</code>, <code>cliente</code>, <code>cidade</code> e <code>idade</code>.</p>
<p>Cada <strong>linha</strong> representa um registro.</p>
<p>É sobre essas tabelas que vamos fazer nossas consultas utilizando SQL.</p>
<h2>O que um analista pode fazer com SQL?</h2>
<p>Uma das grandes vantagens do SQL é que ele permite transformar grandes quantidades de registros em informações úteis para análise.</p>
<p>Por exemplo, suponha que a tabela <code>orders</code> tenha milhões de pedidos.</p>
<p>Podemos utilizar SQL para descobrir apenas os pedidos realizados em determinado período:</p>
<pre><code class="language-sql">SELECT *
FROM orders
WHERE order_date &gt;= '2026-01-01';
</code></pre>
<p>Ou podemos calcular o valor total das vendas:</p>
<pre><code class="language-sql">SELECT SUM(order_value)
FROM orders;
</code></pre>
<p>Também podemos agrupar os dados para descobrir quanto foi vendido por categoria:</p>
<pre><code class="language-sql">SELECT category, SUM(order_value)
FROM orders
GROUP BY category;
</code></pre>
<p>Não é necessário entender todos esses comandos agora. O importante é perceber a lógica: <strong>SQL permite selecionar, filtrar, organizar, combinar e resumir dados para responder perguntas.</strong></p>
<p>É justamente por isso que SQL é tão útil para análise de dados.</p>
<h2>SQL é programação?</h2>
<p>Essa é uma dúvida bastante comum de quem está começando.</p>
<p>SQL é, sim, uma linguagem, mas sua utilização é diferente daquela de linguagens de programação de propósito geral, como Python ou Java.</p>
<p>Quando estamos fazendo uma consulta SQL, normalmente estamos dizendo ao banco <strong>o que queremos encontrar</strong>, e não descrevendo passo a passo como o computador deve executar toda a tarefa.</p>
<p>Por exemplo:</p>
<pre><code class="language-sql">SELECT name
FROM customers
WHERE city = 'São Paulo';
</code></pre>
<p>Essa consulta pode ser lida de maneira bastante próxima da linguagem natural:</p>
<blockquote>
<p>"Selecione o nome dos clientes que moram em São Paulo."</p>
</blockquote>
<p>Essa característica torna SQL relativamente acessível para iniciantes, especialmente quando o objetivo é trabalhar com análise de dados.</p>
<h2>SQL e análise de dados</h2>
<p>Para um analista, SQL não é importante apenas porque permite consultar bancos de dados. O mais importante é que ele ajuda a transformar dados brutos em informações que podem responder perguntas de negócio.</p>
<p>Imagine que uma empresa queira saber:</p>
<blockquote>
<p>"As vendas aumentaram neste ano?"</p>
</blockquote>
<p>Essa pergunta pode parecer simples, mas para respondê-la talvez seja necessário:</p>
<ol>
<li><p>encontrar os pedidos do período analisado;</p>
</li>
<li><p>calcular o valor das vendas;</p>
</li>
<li><p>agrupar os resultados por mês;</p>
</li>
<li><p>comparar os meses;</p>
</li>
<li><p>calcular a variação percentual.</p>
</li>
</ol>
<p>SQL pode ser utilizado em várias dessas etapas.</p>
<p>Por isso, aprender SQL para análise de dados não significa apenas decorar comandos. É necessário desenvolver a capacidade de <strong>pensar sobre os dados</strong> e transformar uma pergunta em uma consulta.</p>
<h2>O que você precisa aprender primeiro?</h2>
<p>SQL possui muitos recursos, mas você não precisa aprender tudo de uma vez.</p>
<p>Para quem está começando com foco em análise de dados, uma sequência bastante útil é:</p>
<p><strong>1. SELECT e FROM</strong> Aprender a selecionar informações de uma tabela.</p>
<p><strong>2. WHERE</strong> Aprender a filtrar os dados.</p>
<p><strong>3. ORDER BY e LIMIT</strong> Aprender a ordenar e limitar os resultados.</p>
<p><strong>4. Funções de agregação e GROUP BY</strong> Aprender a calcular métricas como soma, média e quantidade.</p>
<p><strong>5. JOINs</strong> Aprender a combinar informações de diferentes tabelas.</p>
<p><strong>6. CASE WHEN e tratamento de NULL</strong> Aprender a criar classificações e lidar com dados ausentes.</p>
<p><strong>7. CTEs e subqueries</strong> Aprender a estruturar consultas mais complexas.</p>
<p><strong>8. Window Functions</strong> Aprender técnicas mais avançadas para comparar registros, criar rankings e realizar análises ao longo do tempo.</p>
<p>Essa sequência não é uma regra absoluta, mas oferece um bom caminho para quem está começando.</p>
<h2>SQL é suficiente para trabalhar com dados?</h2>
<p>Não necessariamente.</p>
<p>SQL é uma ferramenta muito importante, mas análise de dados normalmente envolve outras competências também.</p>
<p>Dependendo da função, um profissional pode trabalhar com ferramentas de visualização, como Power BI ou Tableau, planilhas, Python, estatística e outras tecnologias.</p>
<p>Além disso, conhecer SQL não substitui a capacidade de entender o contexto do negócio e fazer boas perguntas.</p>
<p>Uma consulta SQL pode estar perfeitamente correta e ainda assim responder à pergunta errada.</p>
<p>Por isso, uma boa análise combina <strong>conhecimento técnico, raciocínio analítico e entendimento do problema que precisa ser resolvido</strong>.</p>
<h2>Por onde começar?</h2>
<p>Se você nunca utilizou SQL, não tente memorizar dezenas de comandos de uma vez.</p>
<p>Comece entendendo a estrutura de um banco de dados e aprenda a fazer consultas simples. Depois, avance gradualmente para filtros, agregações, combinações entre tabelas e, por fim, recursos mais avançados.</p>
<p>Ao longo deste guia, vamos seguir justamente esse caminho.</p>
<p>Nos próximos artigos, começaremos pelo básico: como <strong>selecionar, filtrar e ordenar dados com SQL</strong>. Depois, avançaremos para agregações, <code>JOINs</code> e recursos intermediários.</p>
<p>O objetivo não é transformar você em especialista em SQL, mas oferecer uma base suficiente para que consiga <strong>entender consultas, explorar dados e começar a resolver problemas reais de análise</strong>.</p>
<p>E talvez essa seja a melhor maneira de pensar em SQL:</p>
<blockquote>
<p><strong>SQL é uma ferramenta para fazer perguntas aos dados e transformar as respostas em informação útil.</strong></p>
</blockquote>
]]></content:encoded></item><item><title><![CDATA[Por que a velocidade da análise de dados importa:]]></title><description><![CDATA[Contexto: o grande volume de dados
Vivemos em uma época em que a quantidade de dados gerados cresce diariamente. Empresas registram milhões de transações, sensores produzem. informações em tempo real ]]></description><link>https://pensando-em-dados.hashnode.dev/por-que-a-velocidade-da-an-lise-de-dados-importa</link><guid isPermaLink="true">https://pensando-em-dados.hashnode.dev/por-que-a-velocidade-da-an-lise-de-dados-importa</guid><category><![CDATA[ciência de dados]]></category><dc:creator><![CDATA[Abdiel Souza]]></dc:creator><pubDate>Wed, 01 Jul 2026 12:16:09 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/687823e82ee038814b660467/3210a486-ebbf-4c27-a88e-4d4989569fbb.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Contexto: o grande volume de dados</h2>
<p>Vivemos em uma época em que a quantidade de dados gerados cresce diariamente. Empresas registram milhões de transações, sensores produzem. informações em tempo real e aplicações web armazenam eventos a cada segundo.</p>
<p>Nesse cenário, a velocidade de análise desses dados deixou de ser apenas uma questão de conveniência e passou a ser um fator estratégico.</p>
<h2>O requerimento da agilidade</h2>
<p>Quando uma análise demora minutos ou horas para ser executada, a produtividade diminui. O cientista de dados perde tempo esperando consultas terminarem, a experimentação fica mais lenta e a tomada de decisão é adiada. Em projetos maiores, esse impacto se torna ainda mais evidente.</p>
<p>Felizmente, o ecossistema de ciência de dados evoluiu bastante nos últimos anos. Ferramentas modernas foram desenvolvidas para aproveitar melhor os recursos do hardware e processar grandes volumes de dados com muito mais eficiência.</p>
<h2>As ferramentas "aceleradoras"</h2>
<p>Dentro do contexto da exigência de mais rapidez no processamento e análise de dados, temos muitas tecnologias extremamente atuais que nos ajudam nesse propósito.</p>
<p>O <a href="https://pola.rs"><strong>Polars</strong></a>, por exemplo, utiliza <strong>processamento colunar e execução paralela</strong>, permitindo que muitas operações sejam realizadas significativamente mais rápido do que em abordagens tradicionais.</p>
<img src="https://cdn.hashnode.com/uploads/covers/687823e82ee038814b660467/1e4cb148-6599-4ccd-9545-694b36dfc6c1.png" alt="" style="display:block;margin:0 auto" />

<p>Outro avanço importante é o uso do <a href="https://arrow.apache.org"><strong>Apache Arrow</strong></a>, que <strong>padroniza a representação de dados em memória</strong>. Isso reduz cópias desnecessárias entre bibliotecas e acelera a comunicação entre diferentes ferramentas do ecossistema.</p>
<img src="https://cdn.hashnode.com/uploads/covers/687823e82ee038814b660467/160af326-aa0a-4007-b74a-0909379874d9.png" alt="" style="display:block;margin:0 auto" />

<p>Entretanto, <strong>velocidade não significa apenas executar código mais rápido</strong>. Ela também representa ciclos menores de experimentação. Quanto mais rapidamente conseguimos limpar dados e gerar visualizações, mais tempo sobra para interpretar resultados e produzir conhecimento de valor.</p>
<h2>Conclusão</h2>
<p>No fim das contas, o objetivo da ciência de dados não é apenas processar grandes volumes de informação, mas transformar dados em decisões. Em um mundo cada vez mais orientado por dados, fazer isso de forma rápida pode ser um dos maiores diferenciais de um profissional ou de uma organização.</p>
]]></content:encoded></item><item><title><![CDATA[Ciência de Dados na Igreja: Como eu implementei melhorias em uma turma de alunos]]></title><description><![CDATA[Quando falamos sobre ciência de dados, é comum imaginar grandes empresas, algoritmos complexos e enormes volumes de informação. No entanto, a verdade é que os princípios da área podem ser aplicados em]]></description><link>https://pensando-em-dados.hashnode.dev/ci-ncia-de-dados-na-igreja-como-eu-implementei-melhorias-em-uma-turma-de-alunos</link><guid isPermaLink="true">https://pensando-em-dados.hashnode.dev/ci-ncia-de-dados-na-igreja-como-eu-implementei-melhorias-em-uma-turma-de-alunos</guid><category><![CDATA[ciência de dados]]></category><dc:creator><![CDATA[Abdiel Souza]]></dc:creator><pubDate>Sun, 31 May 2026 20:47:14 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/687823e82ee038814b660467/2e2735a9-c4fe-4dc8-b8c5-05730751d3ba.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Quando falamos sobre ciência de dados, é comum imaginar grandes empresas, algoritmos complexos e enormes volumes de informação. No entanto, a verdade é que os princípios da área podem ser aplicados em praticamente qualquer contexto onde existam dados e decisões a serem tomadas.</p>
<p>Recentemente, tive a oportunidade de aplicar conceitos de coleta, organização e análise de dados em um ambiente pouco convencional: uma turma de alunos em um projeto chamado IBUC (Instituto Bíblico Único Caminho). Você pode achar informações sobre o projeto <a href="https://ibuc.com.br/">clicando neste link</a>.</p>
<p>Sendo assim, gostaria de falar neste artigo sobre as tarefas que ando desenvolvendo dentro desse projeto maravilhoso.</p>
<h2>Contexto geral</h2>
<p><img src="https://cdn.hashnode.com/uploads/covers/687823e82ee038814b660467/daed8e09-269c-4a59-975b-97c0810a0e17.png?align=middle" alt="" /></p>
<p>O IBUC é um projeto grande iniciado no estado de Goiás com o objetivo de ensinar a Bíblia para crianças e adolescentes. O projeto cresceu e desenvolveu diferentes núcleos de ensino em igrejas de outros estados do Brasil, sendo que um desses núcleos se instalou justamente na igreja da qual faço parte.</p>
<p>Dentro do IBUC, eu trabalho como professor de uma turma de adolescentes onde as aulas ocorrem toda terça-feira. Cada professor fica responsável pelo controle e acompanhamento da colaboração dos alunos com o compromisso de realizar atividades, se comportar bem, ler a Bíblia, entre outros.</p>
<h2>O problema real</h2>
<p>O problema começou a partir do momento em que a turma cresceu. Acompanhar todas as informações manualmente se tornou cada vez mais difícil, pois nós éramos orientados a seguir um tipo de "protocolo" de aula pré-estabelecido e tivemos dificuldade em seguir isso à risca.</p>
<p>Sempre foi necessário controlar:</p>
<ul>
<li><p>Frequência dos alunos</p>
</li>
<li><p>Participação em atividades</p>
</li>
<li><p>Sistema de moedas do IBUC</p>
</li>
<li><p>Histórico de movimentações</p>
</li>
<li><p>Indicadores gerais da turma</p>
</li>
</ul>
<p>Com os registros espalhados em diferentes lugares, obter respostas para perguntas simples exigia muito trabalho manual.</p>
<h2>Desenvolvendo a solução</h2>
<p>Para resolver esses desafios, desenvolvi então um conjunto de planilhas integradas no Google Sheets para facilitar e automatizar o controle de dados da minha turma.</p>
<p>A ideia foi estruturar os dados de forma semelhante ao que encontramos em projetos de análise de dados. Criei uma pasta no Google Drive dedicada ao projeto e adicionei um arquivo do Google Sheets para realizar o registro dos dados.</p>
<h3>Tabelas de registro</h3>
<p>Cada evento importante gera um registro:</p>
<ul>
<li><p>Movimentação de moedas</p>
</li>
<li><p>Comportamento e compromisso</p>
</li>
<li><p>Presença em aulas</p>
</li>
<li><p>Participação em atividades especiais</p>
</li>
</ul>
<h3>Tabela de alunos</h3>
<p>Uma tabela central reúne as informações básicas dos estudantes. Essa tabela guarda o nome, a data de aniversário e um ID interno dos alunos matriculados, de forma que as informações registradas são utilizadas como base de preenchimento em outras planilhas dentro do espaço de trabalho.</p>
<h3>Controle de frequência e pontuação</h3>
<p>Dentro do espaço de trabalho, criei uma planilha para registrar a frequência dos alunos. Por meio de uma fórmula de filtro, a planilha "puxa" os nomes e identificadores dos alunos matriculados e, automaticamente, atualiza as linhas onde a frequência de cada aluno é registrada por data.</p>
<p><img src="https://cdn.hashnode.com/uploads/covers/687823e82ee038814b660467/8fcccf54-b8ba-4c4e-863e-a5939df09071.png" alt="" /></p>
<p>Além disso, há uma outra planilha igualmente importante que realiza o registro das pontuações dos alunos ao longo das aulas. Os alunos são pontuados dentro de alguns critérios, de forma que cada critério possui um valor em "moedas do IBUC" para cada aluno. Isso possibilita uma distribuição mais justa dos pontos para os alunos sem que a correria da aula afete o meu papel como professor.</p>
<p><img src="https://cdn.hashnode.com/uploads/covers/687823e82ee038814b660467/44e70535-ab87-4c49-991c-6b166a136ad5.png" alt="" /></p>
<h3>Registro de saldos</h3>
<p>Aqui é onde ficam registrados os saldos de cada aluno. As pontuações registradas na planilha que mencionei anteriormente são convertidas em valores de moedas do IBUC para os alunos. A ideia é que os alunos usem essas moedas em uma feira no final de cada módulo para comprar itens e alimentos.</p>
<p>A planilha de saldos registra os ganhos e perdas de cada aluno ao longo das aulas e o montante atual acumulado das aulas antecedentes.</p>
<p><img src="https://cdn.hashnode.com/uploads/covers/687823e82ee038814b660467/c134fab6-f29c-47c5-9a94-2fa4a5c88eb4.png" alt="" /></p>
<h3>Gráficos e Estatísticas</h3>
<p>Para visualizar melhor o desempenho da turma, eu criei uma seção separada de dashboard para gráficos dentro do meu espaço de trabalho do Google Sheets.</p>
<p><img src="https://cdn.hashnode.com/uploads/covers/687823e82ee038814b660467/9092262b-a955-45b4-8428-b303c7887197.png" alt="" /></p>
<p>Na imagem acima estão representados dois gráficos: Um realiza o acompanhamento da frequência dos alunos e o outro mostra as ofertas dos alunos ao longo do tempo. Embora seja ainda uma parte experimental, pretendo evoluir o dashboard futuramente para exibir outras informações.</p>
<p>Além dos gráficos, eu costumo filtrar os dados das planilhas diretamente para facilitar a visualização de informações relevantes no momento da consulta. O Google Sheets me permite ver automaticamente algumas estatísticas em visualizações agrupadas, como médias, somas, máximos e mínimos.</p>
<h2>Evolução da solução: automatizando cálculos</h2>
<p>Depois das planilhas prontas, pensei comigo: "não basta ter apenas um espaço de trabalho organizado, preciso executar tarefas recorrentes com o menor esforço possível". Pesquisando um pouco na internet, conheci um recurso da Google chamado Apps Script, uma plataforma que me permite utilizar JavaScript para automatizar tarefas no Google Sheets e outros serviços.</p>
<p>Adotando o uso do Apps Script, consegui automatizar os cálculos que determinam o ganho dos alunos nas aulas a partir das pontuações registradas. Isso foi um passo enorme para o meu projeto, já que eu não preciso criar tantos registros manualmente à medida que os dados dos alunos são atualizados.</p>
<h3>Mais passos, mais problemas...</h3>
<p>Conforme o sistema foi evoluindo, percebi que algumas limitações começaram a surgir.</p>
<p>Grande parte da automações era executada através do Google Apps Script, que por sinal demonstrou ser uma ferramenta excelente para pequenas automações dentro do sistema Google.</p>
<p>Porém, o controle de dados da turma começou a tender para a criação de regras de negócio e lógicas mais complexas e robustas, de modo que surgiu uma dificuldade em separá-las da própria planilha.</p>
<p>Isso me levou a começar o planejamento de uma nova arquitetura baseada em um serviço isolado em Python que irá realizar processamentos avançados.</p>
<p>Ao meu ver, essa abordagem poderia trazer algumas vantagens:</p>
<ul>
<li><p>Maior organização do código.</p>
</li>
<li><p>Reutilização das regras de negócio.</p>
</li>
<li><p>Integração com múltiplas plataformas.</p>
</li>
<li><p>Facilidade para testes automatizados.</p>
</li>
<li><p>Possibilidade de futuras análises avançadas e modelos preditivos.</p>
</li>
</ul>
<h3>Nova API para o controle de turma do IBUC</h3>
<p>Durante esse processo também surgiu outro desafio: grande parte do trabalho envolvia operações repetitivas de leitura, escrita, sincronização e validação de dados em planilhas a um ponto em que o uso de fórmulas não dava conta sozinho.</p>
<p>Pensando nisso, eu iniciei o desenvolvimento do <a href="https://github.com/abdielsouza/nitrogen-py">Nitrogen</a>, uma biblioteca Python para transformar planilhas do Excel e Google Sheets em espaços de armazenamento e controle de dados.</p>
<p>O objetivo é fornecer uma camada de abstração para trabalhar com dados em planilhas de forma semelhante ao que frameworks ORM fazem com bancos de dados.</p>
<p>O meu plano para o futuro é construir uma API Python que se integra no Google Sheets e realiza as tarefas mais avançadas na planilha de forma automática. Isso substituiria o uso total de Apps Script e poderia transsformá-lo em uma ponte de integração entre o Google Sheets e o backend Python.</p>
<h2>Conclusão</h2>
<p>Algo que pude aprender foi que Ciência de Dados não depende necessariamente de grandes volumes de informação ou tecnologias complexas. Em muitos casos, ela começa com algo bem mais simples: organizar informações, registrar eventos e transformar dados em conhecimento útil.</p>
<p>O projeto das planilhas do IBUC me mostrou que conceitos utilizados em empresas de tecnologia também podem gerar valor em contextos educacionais, comunitários e até mesmo dentro de uma igreja.</p>
]]></content:encoded></item><item><title><![CDATA[Entendendo JOINs em SQL: Como combinar dados de múltiplas tabelas]]></title><description><![CDATA[Ao trabalhar com bancos de dados relacionais, raramente todas as informações necessárias estão armazenadas em uma única tabela. Em aplicações reais, dados costumam ser divididos em estruturas relacion]]></description><link>https://pensando-em-dados.hashnode.dev/entendendo-joins-em-sql-como-combinar-dados-de-m-ltiplas-tabelas</link><guid isPermaLink="true">https://pensando-em-dados.hashnode.dev/entendendo-joins-em-sql-como-combinar-dados-de-m-ltiplas-tabelas</guid><category><![CDATA[Banco de Dados]]></category><category><![CDATA[ciência de dados]]></category><dc:creator><![CDATA[Abdiel Souza]]></dc:creator><pubDate>Thu, 28 May 2026 13:59:33 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/687823e82ee038814b660467/4344ec36-8b5e-4447-a7a8-631ce5b47702.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Ao trabalhar com bancos de dados relacionais, raramente todas as informações necessárias estão armazenadas em uma única tabela. Em aplicações reais, dados costumam ser divididos em estruturas relacionadas: usuários, pedidos, produtos, pagamentos, endereços etc. Para unir essas informações em consultas úteis, utilizamos JOINs.</p>
<p>Neste artigo, vamos entender o que são JOINs, os principais tipos existentes, exemplos práticos e boas práticas de uso.</p>
<hr />
<h2>O que é um JOIN?</h2>
<p>JOIN é uma operação SQL usada para combinar linhas de duas ou mais tabelas com base em uma relação entre colunas.</p>
<p>Imagine duas tabelas:</p>
<p>Tabela <code>clientes</code></p>
<table>
<thead>
<tr>
<th>id</th>
<th>nome</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Ana</td>
</tr>
<tr>
<td>2</td>
<td>Carlos</td>
</tr>
<tr>
<td>3</td>
<td>João</td>
</tr>
</tbody></table>
<p>Tabela <code>pedidos</code></p>
<table>
<thead>
<tr>
<th>id</th>
<th>cliente_id</th>
<th>produto</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>1</td>
<td>Notebook</td>
</tr>
<tr>
<td>2</td>
<td>2</td>
<td>Mouse</td>
</tr>
<tr>
<td>3</td>
<td>1</td>
<td>Teclado</td>
</tr>
</tbody></table>
<p>A coluna <code>cliente_id</code> referencia <code>clientes.id</code>.</p>
<p>Se quisermos descobrir qual cliente comprou qual produto, precisamos unir as tabelas.</p>
<pre><code class="language-sql">SELECT clientes.nome, pedidos.produto
FROM clientes
JOIN pedidos
ON clientes.id = pedidos.cliente_id;
</code></pre>
<p>Resultado:</p>
<table>
<thead>
<tr>
<th>nome</th>
<th>produto</th>
</tr>
</thead>
<tbody><tr>
<td>Ana</td>
<td>Notebook</td>
</tr>
<tr>
<td>Carlos</td>
<td>Mouse</td>
</tr>
<tr>
<td>Ana</td>
<td>Teclado</td>
</tr>
</tbody></table>
<hr />
<h2>INNER JOIN</h2>
<p>O INNER JOIN retorna apenas registros que possuem correspondência em ambas as tabelas.</p>
<p>Sintaxe:</p>
<pre><code class="language-sql">SELECT *
FROM tabela1
INNER JOIN tabela2
ON tabela1.id = tabela2.id_relacionado;
</code></pre>
<p>Exemplo:</p>
<pre><code class="language-sql">SELECT clientes.nome, pedidos.produto
FROM clientes
INNER JOIN pedidos
ON clientes.id = pedidos.cliente_id;
</code></pre>
<p>Resultado:</p>
<table>
<thead>
<tr>
<th>nome</th>
<th>produto</th>
</tr>
</thead>
<tbody><tr>
<td>Ana</td>
<td>Notebook</td>
</tr>
<tr>
<td>Carlos</td>
<td>Mouse</td>
</tr>
<tr>
<td>Ana</td>
<td>Teclado</td>
</tr>
</tbody></table>
<p>João não aparece porque não possui pedidos.</p>
<p>Quando usar?</p>
<p>Use INNER JOIN quando deseja somente registros relacionados.</p>
<p>Exemplos:</p>
<ul>
<li><p>Clientes com pedidos</p>
</li>
<li><p>Alunos matriculados em cursos</p>
</li>
<li><p>Funcionários associados a departamentos</p>
</li>
</ul>
<hr />
<h2>LEFT JOIN (LEFT OUTER JOIN)</h2>
<p>Retorna todos os registros da tabela da esquerda, mesmo sem correspondência na direita.</p>
<pre><code class="language-sql">SELECT *
FROM clientes
LEFT JOIN pedidos
ON clientes.id = pedidos.cliente_id;
</code></pre>
<p>Resultado:</p>
<table>
<thead>
<tr>
<th>nome</th>
<th>produto</th>
</tr>
</thead>
<tbody><tr>
<td>Ana</td>
<td>Notebook</td>
</tr>
<tr>
<td>Ana</td>
<td>Teclado</td>
</tr>
<tr>
<td>Carlos</td>
<td>Mouse</td>
</tr>
<tr>
<td>João</td>
<td>NULL</td>
</tr>
</tbody></table>
<p>João aparece porque está na tabela principal (clientes), apesar de não possuir pedidos.</p>
<p>Quando usar?</p>
<p>Muito útil para:</p>
<ul>
<li><p>Encontrar usuários sem compras</p>
</li>
<li><p>Mostrar produtos sem vendas</p>
</li>
<li><p>Listar funcionários sem tarefas</p>
</li>
</ul>
<p>Exemplo para identificar clientes sem pedidos:</p>
<pre><code class="language-sql">SELECT clientes.nome
FROM clientes
LEFT JOIN pedidos
ON clientes.id = pedidos.cliente_id
WHERE pedidos.id IS NULL;
</code></pre>
<p>Resultado: <code>João</code></p>
<hr />
<h2>RIGHT JOIN</h2>
<p>Funciona como o LEFT JOIN, mas prioriza a tabela da direita.</p>
<pre><code class="language-sql">SELECT *
FROM clientes
RIGHT JOIN pedidos
ON clientes.id = pedidos.cliente_id;
</code></pre>
<p>Retorna todos os pedidos, mesmo sem cliente correspondente.</p>
<p>Entretanto, muitos desenvolvedores evitam RIGHT JOIN porque geralmente é possível reorganizar a consulta usando LEFT JOIN, tornando o código mais legível.</p>
<hr />
<h2>FULL OUTER JOIN</h2>
<p>Retorna:</p>
<ul>
<li><p>Correspondências entre ambas tabelas</p>
</li>
<li><p>Registros sem correspondência da esquerda</p>
</li>
<li><p>Registros sem correspondência da direita</p>
</li>
</ul>
<p>Exemplo:</p>
<pre><code class="language-sql">SELECT *
FROM clientes
FULL OUTER JOIN pedidos
ON clientes.id = pedidos.cliente_id;
</code></pre>
<p>Resultado hipotético:</p>
<table>
<thead>
<tr>
<th>nome</th>
<th>produto</th>
</tr>
</thead>
<tbody><tr>
<td>Ana</td>
<td>Notebook</td>
</tr>
<tr>
<td>Carlos</td>
<td>Mouse</td>
</tr>
<tr>
<td>João</td>
<td>NULL</td>
</tr>
<tr>
<td>NULL</td>
<td>Monitor</td>
</tr>
</tbody></table>
<p>Nem todos os bancos suportam FULL OUTER JOIN diretamente (por exemplo, versões antigas do MySQL).</p>
<hr />
<h2>CROSS JOIN</h2>
<p>Produz o produto cartesiano entre tabelas.</p>
<p>Cada linha da primeira tabela combina com todas as linhas da segunda.</p>
<p>Exemplo:</p>
<p>Tabela A:</p>
<table>
<thead>
<tr>
<th>cor</th>
</tr>
</thead>
<tbody><tr>
<td>Azul</td>
</tr>
<tr>
<td>Verde</td>
</tr>
</tbody></table>
<p>Tabela B:</p>
<table>
<thead>
<tr>
<th>tamanho</th>
</tr>
</thead>
<tbody><tr>
<td>P</td>
</tr>
<tr>
<td>M</td>
</tr>
</tbody></table>
<p>Consulta:</p>
<pre><code class="language-sql">SELECT *
FROM cores
CROSS JOIN tamanhos;
</code></pre>
<p>Resultado:</p>
<table>
<thead>
<tr>
<th>cor</th>
<th>tamanho</th>
</tr>
</thead>
<tbody><tr>
<td>Azul</td>
<td>P</td>
</tr>
<tr>
<td>Azul</td>
<td>M</td>
</tr>
<tr>
<td>Verde</td>
<td>P</td>
</tr>
<tr>
<td>Verde</td>
<td>M</td>
</tr>
</tbody></table>
<p>Uso comum:</p>
<ul>
<li><p>Geração de combinações</p>
</li>
<li><p>Matrizes</p>
</li>
<li><p>Simulações</p>
</li>
</ul>
<hr />
<h2>SELF JOIN</h2>
<p>Ocorre quando uma tabela é associada a ela mesma.</p>
<p>Exemplo:</p>
<p>Tabela <code>funcionarios</code></p>
<table>
<thead>
<tr>
<th>id</th>
<th>nome</th>
<th>gerente_id</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Maria</td>
<td>NULL</td>
</tr>
<tr>
<td>2</td>
<td>Pedro</td>
<td>1</td>
</tr>
<tr>
<td>3</td>
<td>João</td>
<td>1</td>
</tr>
</tbody></table>
<p>Consulta:</p>
<pre><code class="language-sql">SELECT
    f.nome AS funcionario,
    g.nome AS gerente
FROM funcionarios f
LEFT JOIN funcionarios g
ON f.gerente_id = g.id;
</code></pre>
<p>Resultado:</p>
<table>
<thead>
<tr>
<th>funcionario</th>
<th>gerente</th>
</tr>
</thead>
<tbody><tr>
<td>Maria</td>
<td>NULL</td>
</tr>
<tr>
<td>Pedro</td>
<td>Maria</td>
</tr>
<tr>
<td>João</td>
<td>Maria</td>
</tr>
</tbody></table>
<hr />
<h2>Visualizando os JOINs mentalmente</h2>
<p>Uma forma simples:</p>
<h3>INNER JOIN</h3>
<p>Somente interseção:</p>
<p><code>A ∩ B</code></p>
<h3>LEFT JOIN</h3>
<p>Tudo da esquerda + interseção:</p>
<p><code>A + (A ∩ B)</code></p>
<h3>RIGHT JOIN</h3>
<p>Tudo da direita + interseção:</p>
<p><code>B + (A ∩ B)</code></p>
<h3>FULL JOIN</h3>
<p>União completa:</p>
<p><code>A ∪ B</code></p>
<hr />
<h2>Desempenho e otimização</h2>
<p>JOINs podem se tornar caros em tabelas grandes. Algumas boas práticas:</p>
<h3>1. Crie índices</h3>
<p>Evite:</p>
<p><code>ON usuarios.id = pedidos.usuario_id</code></p>
<p>sem índices.</p>
<p>Melhor:</p>
<pre><code class="language-sql">CREATE INDEX idx_usuario
ON pedidos(usuario_id);
</code></pre>
<hr />
<h3>2. Selecione apenas colunas necessárias</h3>
<p>Evite:</p>
<p><code>SELECT *</code></p>
<p>Prefira:</p>
<p><code>SELECT nome, email</code></p>
<p>Reduz transferência de dados.</p>
<hr />
<h3>3. Filtre cedo</h3>
<p>Melhor:</p>
<pre><code class="language-sql">SELECT *
FROM pedidos
JOIN clientes
ON ...
WHERE pedidos.data &gt; '2025-01-01';
</code></pre>
<p>do que trazer milhões de registros primeiro.</p>
<hr />
<p>Exemplo completo: E-commerce</p>
<p>Tabelas:</p>
<p><code>clientes</code></p>
<table>
<thead>
<tr>
<th>id</th>
<th>nome</th>
</tr>
</thead>
<tbody><tr>
<td>1</td>
<td>Ana</td>
</tr>
</tbody></table>
<p><code>pedidos</code></p>
<table>
<thead>
<tr>
<th>id</th>
<th>cliente_id</th>
</tr>
</thead>
<tbody><tr>
<td>10</td>
<td>1</td>
</tr>
</tbody></table>
<p><code>itens_pedido</code></p>
<table>
<thead>
<tr>
<th>pedido_id</th>
<th>produto</th>
</tr>
</thead>
<tbody><tr>
<td>10</td>
<td>Notebook</td>
</tr>
</tbody></table>
<p>Consulta:</p>
<pre><code class="language-sql">SELECT
    clientes.nome,
    itens_pedido.produto
FROM clientes
JOIN pedidos
    ON clientes.id = pedidos.cliente_id
JOIN itens_pedido
    ON pedidos.id = itens_pedido.pedido_id;
</code></pre>
<p>Resultado:</p>
<table>
<thead>
<tr>
<th>nome</th>
<th>produto</th>
</tr>
</thead>
<tbody><tr>
<td>Ana</td>
<td>Notebook</td>
</tr>
</tbody></table>
<p>Observe que múltiplos JOINs podem ser encadeados.</p>
<hr />
<h2>Conclusão</h2>
<p>JOINs são um dos conceitos mais importantes em SQL porque permitem reconstruir relacionamentos entre dados distribuídos em várias tabelas.</p>
<p>Os tipos principais podem ser resumidos assim:</p>
<table>
<thead>
<tr>
<th>JOIN</th>
<th>Retorna</th>
</tr>
</thead>
<tbody><tr>
<td>INNER</td>
<td>Apenas correspondências</td>
</tr>
<tr>
<td>LEFT</td>
<td>Tudo da esquerda</td>
</tr>
<tr>
<td>RIGHT</td>
<td>Tudo da direita</td>
</tr>
<tr>
<td>FULL</td>
<td>Tudo de ambos</td>
</tr>
<tr>
<td>CROSS</td>
<td>Produto cartesiano</td>
</tr>
<tr>
<td>SELF</td>
<td>Relação da tabela consigo mesma</td>
</tr>
</tbody></table>
<p>Dominar JOINs significa conseguir transformar dados separados em informações úteis — habilidade essencial para análise de dados, backend, engenharia de dados e administração de bancos relacionais.</p>
<p>Quanto mais complexos forem os sistemas, mais frequentemente você verá consultas envolvendo múltiplos JOINs. Entender bem esse mecanismo torna leitura e otimização de SQL muito mais simples. mais simples.</p>
]]></content:encoded></item></channel></rss>