Voltar para a lista de artigos Artigos
4 minutos de leitura

Como desenhar uma árvore de Natal em SQL

Você pode usar SQL para manipular todos os tipos de dados, desde enormes consultas analíticas até breves declarações de propósito único. Mas você também pode usar SQL apenas por diversão, sem qualquer exigência comercial que sufoque sua criatividade. Então, tire seu chapéu alegre e prepare-se para cantar O Christmas Tree enquanto criamos alguma arte peculiar com o SQL simples e antigo.

Hoje, vamos gerar alguma arte ASCII com tema de feriado, apenas por diversão. Isso mesmo. Eu disse divertido. Este exercício tem valor comercial absolutamente zero. Se você está procurando ajudar sua empresa de alguma forma, exceto talvez por ser um funcionário alegre, é melhor seguir em frente, porque estamos aqui para colocar nossas habilidades em SQL nas últimas árvores de Natal de teste. Para participar desta atividade festiva, você precisará ter dominado algumas habilidades básicas de SQL. Esperamos que você tenha aprendido o seguinte:

    • Funções básicas de SQL string
    • CTEs
    • Recurssão

Vamos contar com todos estes três para criar objetos interessantes em SQL.

Números antigos chatos

Antes de chegarmos às coisas divertidas, precisamos baixar o básico. Gostaríamos de gerar alguns números apenas para aquecê-lo. Há muitas maneiras de gerar números em SQL, sendo a mais comum a recursividade. Seguindo um padrão simples, você pode produzir um monte inteiro de números.

Para gerar um conjunto de dados simples de 10 números, podemos escrever a seguinte abreviação take10 CTE:

WITH take10(list_of_numbers) AS 
(SELECT 0 FROM DUAL
  UNION ALL 
 SELECT 
  list_of_numbers+1 
  FROM take10
  WHERE list_of_numbers < 10)
SELECT * FROM take10;

Aqui está o conjunto de resultados :

list_of_numbers
0
1
2
3
4
5
6
7
8
9
10

Nota: Estou usando Oracle SQL para demonstrar os geradores, daí o uso da tabela dupla. Se você estiver usando PostgreSQL ou MySQL, uma simples cláusula SELECT N sem a cláusula FROM será suficiente.

Plantar uma árvore

Muito bem, chega de conversa de números - está na hora de um pouco de magia natalina! Gostaria muito de ter uma bela árvore de Natal para decorar minha IDE SQL [Integrated Development Environment - Ed.] e me manter alegre durante esta época sombria. Para gerar uma árvore, precisaremos aproveitar as funções das cordas SQL, que você esperançosamente já praticou em LearnSQL.com.br.

Vamos construir nossa árvore usando pinheiros e uma certa profundidade de árvore:

WITH small_tree(tree_depth,pine) AS (
  SELECT 1 tree_depth,rpad(' ',10,' ') || '*' pine
  FROM   dual
  UNION ALL
  SELECT small_tree.tree_depth +1 tree_depth,
  rpad(' ',10-small_tree.tree_depth,' ') || rpad('*',small_tree.tree_depth+1,'.') || lpad('*',small_tree.tree_depth,'.') pine
  FROM   small_tree
  where small_tree.tree_depth < 10
)
SELECT pine
FROM small_tree;

Para nosso conjunto de resultados, obtemos esta bela árvore de Natal:

          *
         *.*
        *...*
       *.....*
      *.......*
     *.........*
    *...........*
   *.............*
  *...............*
 *.................*

Se você quiser personalizar sua árvore, simplesmente mude os símbolos que você usa para pinheiros. Se substituirmos nossos pinheiros por asteriscos:

WITH small_tree(tree_depth,pine) AS (
  SELECT 1 tree_depth,rpad(' ',10,' ') || '.' pine
  FROM   dual
  UNION ALL
  SELECT small_tree.tree_depth +1 tree_depth,
  rpad(' ',10-small_tree.tree_depth,' ') || rpad('.',small_tree.tree_depth+1,'*') || lpad('.',small_tree.tree_depth,'*') pine
  FROM   small_tree
  where small_tree.tree_depth < 10
)
SELECT pine
FROM small_tree;

Recebemos uma árvore diferente:

          .
         .*.
        .***.
       .*****.
      .*******.
     .*********.
    .***********.
   .*************.
  .***************.
 .*****************.

Se estivermos em um clima verdadeiramente festivo, podemos gerar:

WITH small_tree(tree_depth,pine) AS (
  SELECT 1 tree_depth,
  rpad(' ',10,' ') || '*' 
  || rpad(' ',20,' ') || '*' 
  || rpad(' ',20,' ') || '*' 
  pine
  FROM   dual
  UNION ALL
  SELECT small_tree.tree_depth +1 tree_depth,
  rpad(' ',10-small_tree.tree_depth,' ') || rpad('*',small_tree.tree_depth+1,'.') || lpad('*',small_tree.tree_depth,'.') 
  || rpad(' ',20-small_tree.tree_depth-tree_depth,' ') || rpad('*',small_tree.tree_depth+1,'.') || lpad('*',small_tree.tree_depth,'.') 
  || rpad(' ',20-small_tree.tree_depth-tree_depth,' ') || rpad('*',small_tree.tree_depth+1,'.') || lpad('*',small_tree.tree_depth,'.') pine
  FROM   small_tree
  where small_tree.tree_depth < 10
)
SELECT pine
FROM small_tree;

Uma floresta inteira de árvores:

          *                    *                    *
         *.*                  *.*                  *.*
        *...*                *...*                *...*
       *.....*              *.....*              *.....*
      *.......*            *.......*            *.......*
     *.........*          *.........*          *.........*
    *...........*        *...........*        *...........*
   *.............*      *.............*      *.............*
  *...............*    *...............*    *...............*
 *.................*  *.................*  *.................*

Mas faltam alguns tocos em nossas árvores! Vou deixar esse desafio para você, caro leitor. Já que estamos nisso, vá em frente e gere algumas belas estrelas e decorações - seja criativo! Quando você usa a recorrência em SQL, o único limite que você enfrenta é sua imaginação. Festas felizes e festivas da família LearnSQL.com.br!