🇮🇹 Italiano · 🇬🇧 English
▶ Provalo online: https://manzolo.github.io/SqlSimulator/?lang=it
Un percorso didattico interattivo, in stile
learngitbranching.js.org, per capire come
viene eseguita davvero una query SQL. Scrivi una query; un motore scritto a
mano — niente SQLite, niente sql.js, nessuna dipendenza — la esegue su un
database giocattolo in memoria e anima ogni passo: le tabelle si illuminano
mentre le righe vengono scansionate, le righe che passano il WHERE si accendono
e quelle scartate si spengono, i JOIN disegnano archi tra le righe accoppiate,
il GROUP BY colora i gruppi, ORDER BY/LIMIT riordinano e tagliano — e una
pipeline delle fasi si illumina nell'ordine logico reale di SQL, la cosa più
fraintesa del linguaggio.
È il quarto gemello della collana EDU-*, insieme a EDU-16 ASM Playground, EDU-NET e EDU-REGEX.
Possedere il motore è tutto il punto: l'esecutore emette un flusso di eventi
neutri rispetto alla lingua (source-row, row-eval, join-pair, group-form,
aggregate-step, result-row, …) a cui la UI si sottoscrive. Una libreria
nasconderebbe proprio l'esecuzione riga-per-riga e fase-per-fase che vogliamo
insegnare. Il motore è una vera pipeline:
tokenizer → parser → AST → planner → esecutore a fasi.
L'ordine logico di esecuzione è l'elemento firma:
FROM → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT.
Ecco perché il WHERE non vede gli aggregati (non esistono ancora) e l'ORDER BY
può usare un alias del SELECT (viene dopo).
Sottoinsieme supportato: SELECT [DISTINCT], FROM, INNER/LEFT JOIN … ON,
WHERE (= <> < <= > >= AND OR NOT IN LIKE IS [NOT] NULL BETWEEN), GROUP BY,
HAVING, aggregati (COUNT/SUM/AVG/MIN/MAX, incl. COUNT(*)), ORDER BY
(multi-chiave, ASC/DESC), LIMIT/OFFSET, e sottoquery scalari e IN
(anche correlate). Logica dei NULL a tre valori completa. Niente DDL/DML.
Non serve alcun prerequisito: alla prima visita si apre una guida
introduttiva ("Basi") che spiega da zero — con analogie e un esempio pratico —
cos'è un database, una tabella (righe e colonne), una query (SELECT / FROM /
WHERE) e l'ordine logico di esecuzione, più un piccolo glossario. Resta sempre
raggiungibile dal bottone in alto.
14 livelli guidati + una sandbox libera: SELECT · WHERE · AND/OR/NOT ·
ORDER BY/LIMIT · DISTINCT · funzioni aggregate · GROUP BY · HAVING ·
INNER JOIN · LEFT JOIN e NULL · sottoquery · l'ordine logico di esecuzione ·
indici vs. scansione completa · un report reale multi-tabella (capstone).
Ogni livello verifica il tuo risultato su più dataset — alcuni mostrati, altri nascosti e popolati diversamente — così una query con valori cablati sulle righe visibili fallisce (anti-trucco).
Sito statico puro, moduli ES, zero build, zero dipendenze. Servi la cartella
con un qualsiasi server statico (i moduli ES non funzionano via file://):
npm run serve # python3 -m http.server 8000
# apri http://localhost:8000
Deploy su GitHub Pages da main/root così com'è (.nojekyll, percorsi relativi).
npm test # node --test — parser, motore, event-stream, tutti i 14 livelli
npm run e2e # smoke test headless su Chrome (avvia la UI, esegue e verifica un livello)
Il core (js/core/) è completamente DOM-free e deterministico, quindi testabile
headless: lo stesso motore anima l'esecuzione e corregge la tua risposta.
MIT © Andrea Manzi (manzolo)