Retour à la liste des articles Articles
4 minutes de lecture

Comment dessiner un arbre de Noël en SQL

Vous pouvez utiliser SQL pour manipuler toutes sortes de données, qu'il s'agisse d'énormes requêtes analytiques ou de brèves déclarations à usage unique. Mais vous pouvez également utiliser SQL juste pour le plaisir, sans qu'aucune exigence professionnelle ne vienne étouffer votre créativité. Alors, sortez votre chapeau de fête et préparez-vous à chanter "Ô sapin de Noël" pendant que nous créons des œuvres d'art originales avec le bon vieux SQL.

Aujourd'hui, nous allons générer des images ASCII sur le thème des fêtes, juste pour le plaisir. C'est bien cela. J'ai dit " pour le plaisir". Cet exercice n'a absolument aucune valeur commerciale. Si vous cherchez à aider votre entreprise de quelque manière que ce soit, sauf peut-être en étant un employé joyeux, vous feriez mieux de passer votre chemin, car nous sommes ici pour mettre nos compétences SQL à l 'épreuve - dessiner des arbres de Noël. Pour participer à cette activité festive, vous devez avoir maîtrisé certaines compétences SQL de base. Avec un peu de chance, vous avez appris ce qui suit :

    • Fonctions SQL de base pour les chaînes de caractères
    • CTEs
    • Récursion

Nous allons nous appuyer sur ces trois éléments pour créer des objets intéressants en SQL.

De vieux chiffres ennuyeux

Avant de passer aux choses amusantes, nous devons nous familiariser avec les bases. Nous aimerions générer quelques nombres, juste pour vous réchauffer. Il existe de nombreuses façons de générer des nombres en SQL, la plus courante étant la récursion. En suivant un modèle simple, vous pouvez produire un grand nombre de chiffres.

Pour générer un simple ensemble de données de 10 nombres, nous pouvons écrire le court CTE suivant take10:

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;

Voici l'ensemble de résultats :

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

Remarque : j'utilise Oracle SQL pour démontrer les générateurs, d'où l'utilisation de la table double. Si vous utilisez PostgreSQL ou MySQL, une simple clause SELECT N sans la clause FROM suffira.

Planter un arbre

Bon, assez parlé de chiffres, il est temps de passer à la magie de Noël ! J'aimerais vraiment avoir un joli sapin de Noël pour décorer mon IDE SQL [Integrated Development Environment - Ndlr] et rester joyeux en cette saison morose. Pour générer un arbre, nous allons devoir utiliser les fonctions de chaîne SQL, que vous avez, je l'espère, pratiquées sur LearnSQL.fr.

Nous allons construire notre arbre en utilisant des pins et une certaine profondeur d'arbre :

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;

Pour notre ensemble de résultats, nous obtenons ce joli arbre de Noël :

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

Si vous souhaitez personnaliser votre arbre, il vous suffit de changer les symboles utilisés pour les pins. Si nous remplaçons nos pins par des astérisques :

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;

Nous obtenons un arbre différent :

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

Si nous sommes d'humeur vraiment festive, nous pouvons générer :

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;

Une forêt entière d'arbres :

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

Mais il manque des souches à nos arbres ! Je vous laisse relever ce défi, cher lecteur. Pendant que nous y sommes, allez-y et générez de jolies étoiles et décorations - soyez créatifs ! Lorsque vous utilisez la récursion en SQL, la seule limite à laquelle vous êtes confronté est votre imagination. La famille LearnSQL.fr vous souhaite de joyeuses fêtes de fin d'année !