Aller au contenu
Reverb Games Contact

Neon Query : apprendre le SQL en jouant

Pirate la ville. Apprends le SQL.

Tu es un runner, un pirate de données, dans une ville cyberpunk peinte à la main. Pour ouvrir chaque serrure, tu écris du vrai SQL, exécuté par une vraie base SQLite dans ton navigateur, jusqu'à reproduire une cible chiffrée. Les lignes justes s'allument à mesure que tu t'en approches.

🏙️ 6 quartiers 💾 39 niveaux 👾 6 boss ⏱️ ~5 h 🗄️ vrai SQLite 🌐 FR / EN

Le principe

Une cible chiffrée, une requête pour l'ouvrir

Le SQL s'apprend souvent avec des exercices secs sur des tables de commandes et de clients. Neon Query en fait un jeu de piratage : chaque mission affiche le résultat attendu, mais chiffré. Tu écris ta requête, tu l'exécutes, et le jeu compare ton résultat à la cible, ligne par ligne.

Du vrai SQL

Pas de glisser-déposer : on tape SELECT, JOIN ou GROUP BY dans le deck, un éditeur avec couleurs, complétion Tab et Ctrl+Entrée. SQLite l'exécute pour de vrai, dans le navigateur.

La cible se déchiffre

Les lignes de ta requête qui existent dans la cible s'allument en vert. On voit qu'on se rapproche, on ajuste le filtre, on relance. Quand tout correspond : PIRATÉ !

Des boss pour retenir

Chaque quartier finit par un boss : des questions éclair et des « Quelle requête ? » à quatre choix. Une bonne réponse le frappe, une mauvaise te coûte un bouclier.

Mission 1-3 · Filtre le bruit

« La cible a 4 lignes, tu en as 7. »

La mission demande les runners qui vivent à Kabuki. Ici, le joueur a filtré sur l'âge : deux lignes de la cible se déchiffrent (Neon Viper et Jinx ont moins de 25 ans), les autres restent brouillées, et le jeu dit exactement ce qui cloche.

  • À droite, la puce de la mission : la syntaxe, en une phrase et un exemple.
  • En dessous, le coffre : toutes les tables et leurs colonnes. Un clic insère le nom dans la requête.
  • Des mots-clés à toucher sous l'éditeur, pratiques sur téléphone.
6quartiers
39niveaux
6boss
33puces de codex
7tables à pirater
0installation

Essaie tout de suite

Pirate ta première cible

Cinq vraies étapes du jeu, de SELECT * à LEFT JOIN. Ta requête est exécutée par une vraie base SQLite, ici, dans cette page. Tu peux écrire ce que tu veux : rien ne peut casser.

Sortie

Mission

CIBLE ·

BIT, le petit drone

Coffre

HACKED!

Cible piratée !

Tu viens d'écrire 5 requêtes SQL, jusqu'à une jointure externe. Dans le jeu, il reste 34 niveaux, six boss… et l'Overmind au cœur du mainframe.

Des retours qui expliquent

Le jeu te dit pourquoi

« Syntax error » n'a jamais rien appris à personne. Neon Query traduit chaque échec en une phrase courte : le nombre de colonnes, de lignes, l'ordre, le mot-clé attendu, la table mal orthographiée. Voici ce qu'il répond vraiment.

SORTIE://JOURNAL
  1. SELECT handle age FROM runners;✗ La cible a 2 colonne(s), tu en as 1.
  2. SELECT * FROM runners WHERE age < 25;✗ La cible a 4 ligne(s), tu en as 7.
  3. SELECT handle FROM runners ORDER BY age;✗ Bonnes lignes, mauvais ordre.
  4. SELECT * FROM jobs WHERE runner_id = NULL;✗ Bonne forme, mauvaises données.
  5. SELECT r.handle, f.name FROM runners r JOIN factions f ON …✗ Utilise LEFT JOIN pour celle-ci.
  6. SELECT name, price * 1.2 FROM implants;✗ Nomme la colonne « street_price » avec AS.
  7. SELECT type FROM implants WHERE AVG(price) > 3000 …✗ Pas d'agrégat dans WHERE — essaie HAVING.
  8. SELECT handle FROM runner;✗ Pas de table « runner ». Regarde le coffre.
  9. UPDATE runners SET credits = 1000;✗ Aïe, ça a touché toutes les lignes ! Ajoute un WHERE.

L'indice en trois paliers

  1. 1Un coup de pouce : « Ajoute WHERE colonne = valeur. Le texte va entre apostrophes. »
  2. 2Un squelette à trous : SELECT * FROM runners WHERE ________ = '______';
  3. 3La réponse complète, quand on est vraiment bloqué. Chaque indice coûte une étoile.

Après trois essais ratés, le bouton INDICE se met à clignoter. Rien ne s'ouvre tout seul : c'est le joueur qui décide.

Le plan de la ville

6 quartiers, du premier SELECT à l'Overmind

Chaque quartier a sa ligne d'horizon, sa musique synthwave et son boss. Sur la carte, on avance de station en station : chaque mission réussie ouvre la suivante, et un quartier s'ouvre quand son boss tombe.

Quartier 1 · SELECT · WHERE · ORDER BY

Marché Néon

Tu te réveilles dans le marché de nuit : échoppes de ramen, néons qui grésillent et un dirigeable qui fait défiler SELECT * FROM dreams. Tu apprends à lire une table, à choisir tes colonnes, à filtrer et à trier.

SELECT *SELECT col1, col2WHEREAND / ORORDER BY … DESCLIMIT
  1. 1-1Réveille-toi
  2. 1-2Choisis tes colonnes
  3. 1-3Filtre le bruit
  4. 1-4Double verrou
  5. 1-5Au sommet
  6. BOSSSentinelle ICE
Boss du quartierSentinelle ICE
Quartier 2 · Filtres précis

Docks de Données

Grues, cargos et eau noire : ici les données arrivent en vrac. On dédoublonne, on lance des filets (listes et intervalles), on chasse des motifs… et on traque les fantômes de la base : les valeurs NULL.

DISTINCTIN (…)BETWEENLIKE 'N%'IS NULLAS
  1. 2-1Signaux uniques
  2. 2-2Lance le filet
  3. 2-3Chasseur de motifs
  4. 2-4Fantômes dans les données
  5. 2-5Maths de rue
  6. BOSSDémon Kraken
Boss du quartierDémon Kraken
Quartier 3 · Compter & grouper

Tour du Syndicat

Une méga-tour au coucher du soleil, où l'on compte l'argent. Les agrégats écrasent des centaines de lignes en un chiffre, GROUP BY fait un résultat par groupe, HAVING filtre les groupes.

COUNT(*)SUM / AVGMIN / MAXGROUP BYHAVINGROUND
  1. 3-1Recensement
  2. 3-2Contrôle des crédits
  3. 3-3Recensement des gangs
  4. 3-4Blocs bondés
  5. 3-5Classement
  6. BOSSHydre Corporatiste
Boss du quartierHydre Corporatiste
Quartier 4 · Jointures

Souterrains Chrome

Sous la ville, des câbles relient tout. Les jointures : coller deux tables par leur clé, donner des alias, ne perdre personne avec LEFT JOIN, traverser une table de liaison, et joindre une table à elle-même pour lire une hiérarchie.

JOIN … ONaliasLEFT JOINJOIN + JOINJOIN + GROUP BYauto-jointure
  1. 4-1Connexion
  2. 4-2Liste d'équipage
  3. 4-3Personne n'est oublié
  4. 4-4Maillons
  5. 4-5Compte chrome
  6. 4-6Chaîne de commandement
  7. BOSSLéviathan Chrome
Boss du quartierLéviathan Chrome
Quartier 5 · Sous-requêtes · CASE · CTE

Grille Fantôme

Un sol synthwave et des cubes qui flottent : bienvenue dans le SQL avancé. Des requêtes dans les requêtes, le piège de NOT IN avec un NULL, CASE, UNION, les CTE avec WITH et les sous-requêtes corrélées.

(SELECT AVG…)IN (SELECT…)CASE WHENUNIONWITH … ASUPPER / ||
  1. 5-1Au-dessus de la moyenne
  2. 5-2Coup monté
  3. 5-3Rang de rue
  4. 5-4Fusion de flux
  5. 5-5Mémoire nommée
  6. 5-6Amplificateur
  7. BOSSWyrm Fantôme
Boss du quartierWyrm Fantôme
Quartier 6 · Écrire · Fenêtres

Cœur du Mainframe

Le faisceau du noyau, les éclairs… et l'Overmind. On écrit enfin dans la base (et le jeu annule tout UPDATE sans WHERE), puis on termine par les fonctions de fenêtre : classements, partitions et cumuls.

INSERT INTOUPDATE … SETDELETE FROMCREATE TABLERANK() OVERPARTITION BY
  1. 6-1Branche-toi
  2. 6-2Réécris la réalité
  3. 6-3Efface les traces
  4. 6-4Construis ta planque
  5. 6-5Moteur de classement
  6. 6-6La piste de l'argent
  7. BOSSL'Overmind
Boss du quartierL'Overmind

Le bestiaire

Affronte un boss

Les combats ne demandent rien à taper : des scans rapides et des « Quelle requête ? » où il faut repérer la bonne parmi quatre, souvent à un mot près. Une bonne réponse zappe le boss, une mauvaise te coûte un bouclier. Choisis ton adversaire :

RunnerBoucliers
BOSS

Le runner
Une erreur coûte un bouclier……et le jeu affiche aussitôt ce que renvoie la bonne requête : on comprend l'écart au lieu de juste perdre.
Six boss, six décorsChaque quartier a sa palette : rose du Marché Néon, cyan des Docks, or de la Tour, vert chrome des Souterrains, violet de la Grille, rouge du Mainframe.

Le Codex

33 puces à collectionner

Chaque mission réussie installe une puce dans le Codex du joueur : la syntaxe, une phrase, un exemple. À la fin de la partie, c'est l'antisèche SQL complète, de SELECT * aux fonctions de fenêtre.

n°1
Scanner
SELECT * FROM table;

Lire toutes les colonnes d'une table. * veut dire « toutes les colonnes ».

n°2
Sélecteur
SELECT col1, col2 FROM table;

Ne liste que les colonnes utiles, séparées par des virgules.

n°3
Filtre
SELECT * FROM t WHERE col = 'text';

Garde seulement les lignes qui correspondent. Le texte entre guillemets. Aussi >, <, >=, <=, <>.

n°4
Double Verrou
WHERE a AND b / WHERE a OR b

AND : les deux vrais. OR : au moins un.

n°5
Trieur
ORDER BY col DESC LIMIT n

ORDER BY trie (ASC = petit d'abord, DESC = grand d'abord). LIMIT garde les n premières lignes.

n°6
Dédoublonneur
SELECT DISTINCT col FROM t;

Supprime les lignes en double du résultat.

n°7
Lance-filet
col IN ('a','b') col BETWEEN x AND y

IN : une valeur de la liste. BETWEEN : un intervalle, bornes incluses.

n°8
Joker
col LIKE 'Ne%'

% = n'importe quels caractères, _ = exactement un.

n°9
Détecteur de fantômes
col IS NULL col IS NOT NULL

NULL = « pas de valeur ». Jamais = NULL : utilise IS NULL.

n°10
Étiqueteuse
SELECT price * 2 AS double_price FROM t;

Calcule avec + - * / et nomme la colonne avec AS.

n°11
Compteur
SELECT COUNT(*) FROM t;

COUNT(*) compte les lignes. COUNT(col) ignore les NULL.

n°12
Calculateur
SUM(col) AVG(col) MIN(col) MAX(col)

Écrase plusieurs lignes en un seul nombre.

n°13
Choixpeau
SELECT col, COUNT(*) FROM t GROUP BY col;

Une ligne par groupe. Les agrégats sont calculés dans chaque groupe.

n°14
Porte des groupes
GROUP BY col HAVING COUNT(*) > 2

WHERE filtre les lignes avant, HAVING filtre les groupes après.

n°15
Classement
ROUND(AVG(col)) ... ORDER BY SUM(col) DESC

Les agrégats peuvent être arrondis et triés comme une colonne.

n°16
Connecteur
FROM a JOIN b ON a.b_id = b.id

Colle les lignes de deux tables quand la clé correspond.

n°17
Surnoms
FROM runners r JOIN factions f ON ... WHERE f.name = ...

Donne des alias courts aux tables (r, f) et filtre après la jointure.

n°18
Filet
FROM a LEFT JOIN b ON ...

Garde toutes les lignes de gauche, avec des NULL si rien ne correspond.

n°19
Chaîne
FROM a JOIN b ON ... JOIN c ON ...

Enchaîne les jointures pour traverser une table de liaison.

n°20
Pointeur
FROM a JOIN b ON ... GROUP BY a.name

Joins d'abord, puis groupe pour compter ou sommer.

n°21
Miroir
FROM t a JOIN t b ON a.parent_id = b.id

Joins une table avec elle-même grâce à deux alias.

n°22
Requête gigogne
WHERE col > (SELECT AVG(col) FROM t)

Une requête entre parenthèses donne une valeur à comparer.

n°23
Portail
WHERE id IN (SELECT ... ) NOT IN (...)

Compare avec une liste produite par une autre requête. Attention : NOT IN avec un NULL dans la liste ne renvoie rien.

n°24
Aiguillage
CASE WHEN cond THEN 'a' ELSE 'b' END AS label

Choisit une valeur ligne par ligne. Le premier WHEN vrai gagne.

n°25
Fusion de flux
SELECT a FROM t1 UNION SELECT b FROM t2

Empile deux résultats de même nombre de colonnes. UNION enlève les doublons, UNION ALL les garde.

n°26
Mémoire nommée
WITH name AS (SELECT ...) SELECT ... FROM name

Nomme d'abord un sous-résultat, puis interroge-le comme une table.

n°27
Outils texte
UPPER(x) LOWER(x) LENGTH(x) a || ' ' || b

Transforme le texte. || colle des chaînes.

n°28
Injecteur
INSERT INTO t (a, b) VALUES (1, 'x');

Ajoute une ligne. Les valeurs suivent l'ordre des colonnes.

n°29
Réécriveur
UPDATE t SET col = value WHERE ...;

Modifie des lignes. Sans WHERE, TOUTES les lignes changent !

n°30
Gomme
DELETE FROM t WHERE ...;

Supprime des lignes. Sans WHERE, la table est vidée !

n°31
Bâtisseur
CREATE TABLE t (id INTEGER PRIMARY KEY, name TEXT);

Crée une table : chaque colonne a un nom et un type.

n°32
Classeur
RANK() OVER (PARTITION BY g ORDER BY x DESC)

Les fonctions de fenêtre calculent sur des lignes liées sans les fusionner. PARTITION BY recommence par groupe.

n°33
Cumul
SUM(x) OVER (ORDER BY id) AVG(x) OVER (PARTITION BY g)

Un agrégat avec OVER garde chaque ligne : cumuls, moyennes de groupe…

Dans le jeu

Une ville vivante, peinte en code

Pas une seule image dans le jeu : la ville est peinte en code, façon gouache et encre. Voitures volantes, monorail, dirigeable, carpes holographiques, néons qui grésillent, pluie, et un chat qui marche sur les toits. Cliquez sur une image pour l'agrandir.

Mission 4-3 · Personne n'est oublié

Des données qui racontent une histoire

Sept tables relient toute la ville : runners, factions, corps, implants, installs, jobs et agents. On y cherche des runners sans faction, des corporations qui paient le plus, la chaîne de commandement des agents.

  • Des données assez petites pour tout vérifier à l'œil, assez riches pour poser de vraies questions.
  • Des NULL placés exprès, pour tomber dans les pièges classiques (et en sortir).
  • Certaines étapes commencent par une requête cassée à réparer.
Neon Query sur téléphone : le deck, la sortie et la cible empilés
Téléphone, tablette, ordinateur

Du SQL dans le métro

Sur un petit écran, le deck, la sortie et la cible s'empilent, et les mots-clés à toucher évitent de taper chaque SELECT. La progression est sauvegardée : on commence une mission dans le train, on la finit au bureau.

  • Musique synthwave générée en direct, qu'on coupe d'un clic.
  • Français et anglais, on change à tout moment.
Le Codex, toujours à portéeIl s'ouvre depuis n'importe quel écran, pendant une mission comme pendant un combat.
« Tu parles SQL couramment »Après l'Overmind, la ville est libre : étoiles, crédits et les 33 puces du Codex.

Formateurs, écoles, entreprises

Le module SQL que vos apprenants finissent

  • Suivi mission par mission : qui avance, qui bloque, et sur quelle notion (filtres, agrégats, jointures, sous-requêtes…).
  • Zéro installation : SQLite tourne dans le navigateur. Pas de serveur de base de données, pas de droits administrateur, aucun risque pour vos données.
  • Du débutant à l'avancé : les bases pour une reconversion ou un métier qui interroge ses données, jusqu'aux CTE et fonctions de fenêtre pour les profils techniques.
  • ~5 h de pratique active, en sessions courtes, avec des retours précis qui répondent à la place du formateur aux questions de syntaxe.
La carte des Souterrains Chrome, avec les étoiles gagnées à chaque mission

Questions

Tout savoir sur Neon Query

Faut-il installer une base de données pour jouer ?
Non. Neon Query embarque SQLite, compilé en WebAssembly : la base tourne directement dans le navigateur. Aucun serveur, aucun logiciel, aucun compte administrateur. Chaque mission repart d'une copie propre des données de la ville.
Est-ce du vrai SQL ?
Oui. Le joueur écrit ses requêtes à la main, et elles sont exécutées par un vrai moteur SQLite. La syntaxe est celle qu'on retrouve dans PostgreSQL, MySQL ou SQL Server pour tout le tronc commun : SELECT, jointures, GROUP BY, sous-requêtes, CTE, fonctions de fenêtre…
Faut-il des bases pour commencer ?
Aucune. La première mission demande d'afficher une table avec SELECT * FROM runners. Chaque notion arrive avec une « puce » qui la résume, des mots-clés à toucher sous l'éditeur et un indice en trois paliers quand on bloque.
Jusqu'où va le jeu ?
Loin : des premiers filtres jusqu'aux jointures multiples, auto-jointures, sous-requêtes corrélées, CASE, UNION, CTE (WITH), INSERT / UPDATE / DELETE / CREATE TABLE et fonctions de fenêtre (RANK() OVER, PARTITION BY, cumuls). 39 niveaux au total.
Combien de temps faut-il pour finir Neon Query ?
Comptez environ 5 h pour les 39 niveaux. Chaque mission dure quelques minutes et la progression est sauvegardée : on peut jouer par sessions de 20 minutes.
Peut-on casser les données en se trompant ?
Non. Un UPDATE ou un DELETE qui touche trop de lignes est annulé automatiquement, avec une explication. Le bouton « Réinitialiser » restaure la base à tout moment.
Peut-on utiliser Neon Query en formation ?
Oui, c'est fait pour. Un formateur l'assigne à sa classe en un clic et suit la progression de chaque apprenant, mission par mission : qui avance, qui bloque, et sur quelle notion.
Le jeu fonctionne-t-il sur téléphone et en anglais ?
Oui aux deux. Sur téléphone, des mots-clés à toucher évitent de tout taper. Le jeu est en français et en anglais, on change de langue à tout moment.

La ville attend son runner

BIT est allumé, le deck est prêt, la première cible clignote dans le Marché Néon. Il ne manque plus que ta première requête.

Vos informations servent uniquement à vous recontacter. Confidentialité

On n'utilise que des cookies indispensables pour vous garder connecté. Pas de pub, pas de pistage.

En savoir plus