SQL_AI_LEVEL_CREATION_GUIDE - OnlyCook/abitur-elite-code GitHub Wiki
Dieser Guide erklärt, wie du künstliche Intelligenz (wie Claude, ChatGPT, Gemini oder DeepSeek) nutzen kannst, um automatisch neue SQL-Levels für Abitur Elite Code zu generieren.
Der Guide orientiert sich an den Konventionen des Landesabiturs Hessen (Praktische Informatik) und den technischen Anforderungen der App.
- Generische Levels erstellen
- Abitur-konforme Levels erstellen
- Der "Mega-Prompt"
- Wie importiere ich das Level?
- Häufige KI-Fehler
Bitte beachte: KI-generierte Levels werden automatisch erstellt und nicht von einem Lehrer oder Prüfer kontrolliert.
- Keine Garantie: Es kann nicht garantiert werden, dass die Aufgaben zu 100% korrekt sind oder exakt den Anforderungen des hessischen Abiturs entsprechen.
- Fehleranfälligkeit: Das Setup-Script, die Musterlösung und die Verifizierungs-Abfrage können Logikfehler enthalten. Kontrolliere das Ergebnis im Designer, bevor du das Level an andere weitergibst.
- Lerneffekt: Diese Levels dienen als Zusatzmaterial. Verlasse dich für deine Abiturvorbereitung primär auf offizielle Aufgaben und den Unterricht.
Wenn du ein bestimmtes SQL-Thema (z. B. GROUP BY, JOIN oder HAVING) üben möchtest, ohne direkt eine komplexe Abituraufgabe umzusetzen, ist dies der richtige Weg.
- Kopiere den Mega-Prompt (siehe Teil 3).
- Füge ihn in die KI deiner Wahl ein (Claude und Gemini sind hierfür empfohlen).
- Schreibe der KI, was du üben möchtest. Beispiel-Eingabe an die KI:
Erstelle mir ein einfaches Level, in dem ich mit GROUP BY und COUNT die Anzahl der Bücher pro Autor ermitteln muss.
Die KI erstellt daraufhin eine .eliteslvldraft-Struktur, die du importieren kannst.
Die App ist spezifisch auf das Landesabitur Hessen (Praktische Informatik) ausgelegt. Um Levels zu erstellen, die sich wie echte Prüfungen anfühlen, muss die KI den richtigen Kontext erhalten.
Die KI nutzt diese Features in Description und Materials:
-
Fetter Text:
**Wichtig** -
Highlight (Blau):
[Tabellenname]oder[spaltenname] -
Code-Block:
{| SELECT * FROM Tabelle |} - Hinweise (Nur in
Materials):
start-hint: Titel
Inhalt...
:end-hint
Der Prompt instruiert die KI, folgende Regeln zu beachten:
-
Namenskonventionen:
- Tabellen:
PascalCase(z. B.Supermarkt,Bestellung) - Spalten:
camelCase(z. B.anzahlGetraenke,nachname) - IDs / Primärschlüssel: Alles kleingeschrieben, kein Unterstrich (z. B.
kid,artid,bid) - Fremdschlüssel tragen exakt denselben Namen wie der referenzierte Primärschlüssel
- Tabellen:
-
ER-Diagramme (Chen-Notation):
- Multiplicities in der umgekehrten Min-Max-Notation (Abitur-Stil):
A -(0,n)- REL -(1,1)- BstattA -(1,1)- REL -(0,n)- B - Primärschlüssel werden mit
<<key>>annotiert - PlantUML verwendet
@startchen/@endchen
- Multiplicities in der umgekehrten Min-Max-Notation (Abitur-Stil):
-
Validierungs-Modi:
-
SELECT (
IsDmlMode: false): Spieler liest Daten aus → Ergebnis direkt mit Musterlösung verglichen -
DML (
IsDmlMode: true, fürINSERT,UPDATE,DELETE): Spieler verändert Daten → eine zusätzlicheVerificationQueryprüft den Datenbankzustand danach
-
SELECT (
-
Spalten-Striktheit:
- Spaltennamen sind standardmäßig flexibel (Spieler kann eigene Alias-Namen nutzen)
- Wenn ein exakter Alias erzwungen werden soll (z. B.
AS Gesamtwert), muss dieser in einfache Anführungszeichen gesetzt werden (z. B. 'Gesamtwert')
-
MySQL-Emulation:
- Die App läuft auf SQLite, emuliert aber MySQL-Funktionen:
CONCAT,YEAR,MONTH,DAY,DATEDIFF,DATE_ADD,NOW(),CURDATE() - Variablen (
SET @var = ...;) werden ebenfalls unterstützt
- Die App läuft auf SQLite, emuliert aber MySQL-Funktionen:
Du kannst den Text einer alten Abiturprüfung (2023, 2024, 2025) kopieren.
- Kopiere den Mega-Prompt.
- Füge ihn in die KI ein.
- Kopiere den Aufgabentext und schreibe: "Erstelle ein SQL-Level basierend auf dieser Aufgabe: [Text einfügen]".
Kopiere den gesamten folgenden Block in die KI. Er enthält alle Regeln, die sie für eine korrekte Level-Erstellung benötigt.
You are an expert SQL Level Designer for the educational app "Abitur Elite Code".
Target Audience: Students preparing for the "Praktische Informatik" Abitur in Hesse, Germany.
Language: German (unless specified otherwise).
### CORE RULES
1. **MySQL Emulation on SQLite:**
- The app runs SQLite but emulates MySQL. Use MySQL syntax in all SQL fields.
- Supported MySQL-specific functions: CONCAT, YEAR(), MONTH(), DAY(), DATEDIFF(), DATE_ADD(..., INTERVAL x DAY), NOW(), CURDATE().
- MySQL variables are supported: SET @var = (SELECT ...); can be used in multi-statement DML tasks.
- Do NOT use SQLite-specific syntax (e.g. strftime, julianday, date('now')). Write MySQL; the app converts automatically.
2. **Naming Conventions (Abitur Hessen):**
- Tables: PascalCase (e.g. Supermarkt, Bestellung, Artikel)
- Columns: camelCase (e.g. anzahlGetraenke, nachname, vorname)
- Primary Key IDs: all lowercase, no underscores (e.g. kid, artid, bid, mid)
- Foreign keys carry EXACTLY the same name as the primary key they reference (e.g. if PK is "artid", FK is also "artid")
- Relationship tables: lowercase (e.g. beinhaltet, besteht_aus)
3. **Validation Mode – choose one:**
- **SELECT** (default): Player writes a SELECT query. Set `IsDmlMode: false`. Result is compared row-by-row with ExpectedResult.
- **DML** (UPDATE / INSERT / DELETE): Player modifies data. Set `IsDmlMode: true` and provide a VerificationQuery (a SELECT run AFTER the player's DML to check the new state).
4. **ExpectedSchema (column definitions):**
- List every expected output column with: Name, Type (e.g. INT, VARCHAR(255), DOUBLE), and StrictName.
- StrictName: false = column data must match, alias name is flexible.
- StrictName: true = the player MUST use an exact alias (e.g. AS Gesamtwert). Use this when the Abitur task explicitly names a result column.
5. **ExpectedResult:**
- A list of string arrays. Every cell is a string. Numbers use invariant culture (dot as decimal, e.g. "5.5" not "5,5").
- Order matters. If ORDER BY is required, the rows must be listed in sorted order.
6. **ER Diagrams (Chen Notation):**
- Use @startchen / @endchen PlantUML syntax.
- Mark primary keys with <<key>>.
- Multiplicities use FLIPPED min-max notation (Abitur Hessen style):
STANDARD: A -(1,1)- REL -(0,n)- B
ABITUR: A -(0,n)- REL -(1,1)- B
The cardinality is placed NEXT TO the entity it describes, read from the relationship outward.
- For attributes of a relationship (e.g. "menge" in a "beinhaltet" relation), add them inside the relationship block.
- Only include FK attributes in diagrams for simpler levels. For advanced/Abitur levels, omit them (student must derive them).
7. **Relational Model (Schema Display):**
- Provide InitialRelationalModel with Columns for each table.
- Mark IsRelationalModelReadOnly: true for standard levels (player sees the schema, can't edit).
- Set IsRelationalModelReadOnly: false only for normalization tasks where the player must build the schema themselves.
8. **App Formatting Syntax (use in Description and Materials):**
- Bold: **text**
- Highlight (blue): [TableName] or [columnName]
- Inline code: {| SQL snippet |}
- Hints (Materials only):
start-hint: Title
Content
:end-hint
9. **Difficulty Progression:**
- Easy/introductory levels: Highlight key terms, give hints, use simple single-table schemas.
- Medium levels: Multiple tables, JOINs, GROUP BY. Fewer highlights.
- Hard/Abitur levels: Language mirrors real exam wording (no highlights, no hand-holding). Schema has 3–5 tables. Task uses complex aggregations, subqueries, or multi-step DML.
### OUTPUT FORMAT
Output ONLY valid JSON representing a `.eliteslvldraft` file. Calculate the filename from the Name field.
**JSON Template:**
{
"Name": "Die Buch-Suche",
"Author": "AI Designer",
"Description": "Ermittle den [titel] und den [preis] aller Bücher, die weniger als 9.00 Euro kosten.",
"Materials": "start-hint: WHERE-Klausel\nMit WHERE kannst du Zeilen filtern.\nBeispiel: {| WHERE preis < 10 |}\n:end-hint",
"Prerequisites": ["SELECT", "WHERE"],
"SetupScript": "CREATE TABLE Buch (bid INTEGER PRIMARY KEY, titel VARCHAR(255), autor VARCHAR(255), preis DOUBLE);\nINSERT INTO Buch VALUES (1, 'Faust', 'Goethe', 9.99);\nINSERT INTO Buch VALUES (2, 'Die Verwandlung', 'Kafka', 5.50);\nINSERT INTO Buch VALUES (3, 'Der Prozess', 'Kafka', 8.90);",
"IsDmlMode": false,
"VerificationQuery": "",
"SampleSolution": "SELECT titel, preis FROM Buch WHERE preis < 9.00;",
"ExpectedSchema": [
{ "Name": "titel", "Type": "VARCHAR(255)", "StrictName": false },
{ "Name": "preis", "Type": "DOUBLE", "StrictName": false }
],
"ExpectedResult": [
["Die Verwandlung", "5.5"],
["Der Prozess", "8.9"]
],
"IsRelationalModelReadOnly": true,
"InitialRelationalModel": [
{
"Name": "Buch",
"Columns": [
{ "Name": "bid", "IsPk": true, "IsFk": false },
{ "Name": "titel", "IsPk": false, "IsFk": false },
{ "Name": "autor", "IsPk": false, "IsFk": false },
{ "Name": "preis", "IsPk": false, "IsFk": false }
]
}
],
"PlantUmlSource": "@startchen\nentity Buch {\n bid <<key>>\n titel\n autor\n preis\n}\n@endchen",
"PlantUmlSvgContent": "",
"QuickGenerate": true
}
### IMPORTANT CHECKLIST BEFORE OUTPUT
- [ ] All table names PascalCase, all column names camelCase, all IDs lowercase without underscores
- [ ] Foreign keys carry the same name as the referenced primary key
- [ ] Multiplicities are flipped (cardinality placed next to the entity it describes)
- [ ] ExpectedResult uses dot as decimal separator (invariant culture)
- [ ] StrictName: true is only set for columns the task explicitly names (e.g. "AS Gesamtwert")
- [ ] For DML tasks: `IsDmlMode: true` is set and VerificationQuery is a SELECT that checks the database state AFTER the player's query
- [ ] MySQL syntax used in all SQL fields (not SQLite syntax)
- [ ] No FK columns in ER diagrams for advanced/Abitur levels
Acknowledge this prompt by saying: "Abitur Elite Code SQL Designer ready. Please tell me what SQL topic or Abitur task to convert."
- Kopiere den JSON-Code, den die KI generiert hat, in deine Zwischenablage.
- Öffne die App und wechsle in den SQL-Modus. Klicke oben links auf
LEVEL WÄHLEN, dann unten aufEigene Levels. - Klicke auf das Plus-Symbol (
+) und unten links auf "KI Import Modus". - Nutze das Import-Icon (blaues Clipboard-Symbol), um den JSON-Code einzufügen.
- Hinweis: Falls links daneben eine Fehlermeldung erscheint, kopiere diese direkt zurück an die KI, damit sie den Code korrigiert.
- Klicke auf "Erstellen". Die App legt eine
.eliteslvldraft-Datei imlevels-Ordner an. - Dein Level-Entwurf erscheint grün in der Liste. Klicke auf das Zauberstab-Symbol des Entwurfs.
-
Erfolg (✓): Das Level wurde validiert und als
.eliteslvl-Datei exportiert. Du kannst es sofort starten! -
Bei Fehler: Erscheint ein
!, gab es Probleme beim Export. Nutze die Alternative Methode oder kopiere die Fehlermeldung für die KI.
Falls der Zauberstab-Export fehlschlägt oder du den Code im Designer anpassen möchtest:
- Folge den Schritten 1–5 der Schnellmethode.
- Klicke auf das Stift-Symbol (
✎) beim Entwurf, um den SQL-Designer zu öffnen. - Wechsle zum Editor Musterlösung (Pfeil-Symbol) und trage dort die korrekte SQL-Abfrage ein (bzw. prüfe, ob die KI sie korrekt eingetragen hat).
- Klicke oben rechts auf den grünen Button
▶ AUSFÜHREN. - Die Konsole sollte anzeigen:
✓ DESIGNER TEST BESTANDEN!- Falls ein Fehler erscheint, kopiere ihn und gib ihn der KI zur Korrektur.
- Sobald der Test bestanden ist, wird der Button "Exportieren" (oben links) aktiv. Klicke darauf.
- Fertig! Dein Level ist nun als
.eliteslvl-Datei einsatzbereit.
Diese Fehler passieren erfahrungsgemäß öfter. Wenn etwas nicht funktioniert, prüfe folgende Punkte:
| Problem | Ursache | Lösung |
|---|---|---|
| Dezimalzahlen stimmen nicht überein | KI nutzt Komma statt Punkt (z. B. "5,5" statt "5.5") |
KI anweisen: "Nutze invariant culture für alle Zahlen im ExpectedResult" |
| Spaltenanzahl falsch | ExpectedSchema enthält mehr oder weniger Einträge als die Musterlösung zurückgibt | Musterlösung und ExpectedSchema manuell abgleichen |
| DML-Task schlägt immer fehl | VerificationQuery fehlt oder ist leer | Sicherstellen, dass IsDmlMode: true gesetzt und eine passende SELECT-Abfrage als VerificationQuery eingetragen ist |
| Fremdschlüssel-Namen stimmen nicht | KI benennt FK mit Suffix wie _id
|
Explizit mitteilen: "FK trägt exakt denselben Namen wie der PK" |
| ER-Diagramm zeigt falsche Multiplicities | KI nutzt Standard-Chen statt umgekehrter Abitur-Notation | Prompt erneut einfügen und explizit auf die Flipped-Notation hinweisen |
| MySQL-Syntax schlägt fehl | KI nutzt SQLite-Funktionen wie strftime
|
Darauf hinweisen: "Nutze MySQL-Syntax, die App konvertiert automatisch" |
| StrictName für alle Spalten gesetzt | KI ist zu streng | Nur für explizit benannte Ausgabespalten auf true setzen, Rest auf false
|