Beantwortet die Abfrage des Modells die Frage?
SQL eines Modells zu lesen heißt, die Abfrage mit der Frage abzugleichen, bevor Sie ihr vertrauen. Eine Abfrage kann fehlerfrei laufen und trotzdem eine andere Frage beantworten.
Modul 4 lehrt Joins und Gruppierung. Diese Lektion liest SQL, das ein Modell für eine Frage geschrieben hat, und sucht die drei Fehler, die Modelle am häufigsten machen.
Am Ende dieser Lektion
Notiz
Ich kann die Abfrage eines Modells lesen und sagen, ob sie die gestellte Frage beantwortet.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Klausel | ein Teil einer Abfrage, etwa WHERE | |
| Filter | eine Bedingung, die nur manche Zeilen behält | zurueck = 0 |
| Duplikat | derselbe Wert, mehr als einmal gezählt | |
| DISTINCT | behält jeden Wert nur einmal | COUNT(DISTINCT mitglied_id) |
| Join-Spalte | die Spalte, über die zwei Tabellen verbunden werden |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Lesen Sie die Frage vor der Abfrage
Listen Sie zuerst auf, was die Frage verlangt. Welche Zeilen zählen? Ist es eine Zahl, eine Liste oder ein einzelner Wert? Muss jedes Ding einmal gezählt werden?
Lesen Sie dann die Abfrage Klausel für Klausel. FROM und JOIN sagen, woher die Zeilen kommen, WHERE behält einige davon, und SELECT sagt, was zurückkommt.
Beispiel: Teile der Frage und Klauseln
| Die Frage sagt | Die Abfrage braucht | Klausel |
|---|---|---|
| im Monat 3 | monat = 3 | WHERE |
| verschiedene Mitglieder | DISTINCT mitglied_id | SELECT |
| wie viele | COUNT | SELECT |
| Titel | einen Join von ausleihen zu buecher über buch_id | FROM und JOIN |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Drei Fehler, die ein Modell oft macht
Duplikate zählen: COUNT(mitglied_id) zählt Anke doppelt, wenn sie zweimal geliehen hat. Ein fehlender Filter: Die Abfrage zählt jede Ausleihe, nicht nur die noch offenen.
Der falsche Join: ausleihen.id = buecher.id ordnet Ausleihe 3 dem Buch 3 nur zu, weil beide die Nummer 3 tragen. Der Join muss ausleihen.buch_id nutzen.
Beispiel: falsch und richtig
| Frage | Falscher Teil | Richtiger Teil |
|---|---|---|
| Verschiedene Mitglieder im Monat 3 | COUNT(mitglied_id) | COUNT(DISTINCT mitglied_id) |
| Noch ausgeliehene Bücher | Kein WHERE | WHERE zurueck = 0 |
| Titel, die Mitglied 2 geliehen hat | ON a.id = b.id | ON a.buch_id = b.id |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein häufiger Fehler
Warnung
Viele denken, eine Abfrage ohne Fehlermeldung beantworte die Frage. Ein Fehler heißt nur, dass das SQL kaputt ist. Ein falscher Join oder ein fehlender Filter läuft sauber durch und liefert eine falsche Antwort.
Die Modellhilfe schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const basis = process.env.AI_URL || \"http://ai:4000\";' '// Die Token einer Antwort oder null, wenn sie keine nennt.' 'function zaehlen(daten, name) {' ' return daten.usage && typeof daten.usage[name] === \"number\" ? daten.usage[name] : null;' '}' '// Eine Antwort kann die Abfrage in einen umzäunten Block setzen: Wir behalten das Innere.' 'function sqlVon(text) {' ' const teile = text.split(String.fromCharCode(96).repeat(3));' ' const innen = (teile.length > 2 ? teile[1] : text).trim();' ' return innen.toLowerCase().startsWith(\"sql\") ? innen.slice(3).trim() : innen;' '}' > model.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Modellhilfe schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function fragen(nachrichten, probe, max) {' ' try {' ' const res = await fetch(basis + \"/v1/chat/completions\", {' ' method: \"POST\",' ' headers: { \"content-type\": \"application/json\", authorization: \"Bearer lab\" },' ' body: JSON.stringify({ model: \"lab\", messages: nachrichten, max_tokens: max || 100 }),' ' signal: AbortSignal.timeout(30000),' ' });' ' if (res.ok === false) throw new Error(\"Status \" + res.status);' ' const d = await res.json();' ' return { text: d.choices[0].message.content, eingabe: zaehlen(d, \"prompt_tokens\"), ausgabe: zaehlen(d, \"completion_tokens\"), aufgezeichnet: false };' ' } catch (fehler) {' ' console.log(\"Aufgezeichnete Probe: Kein Modell hat geantwortet (\" + fehler.message + \").\");' ' return { text: probe, eingabe: null, ausgabe: null, aufgezeichnet: true };' ' }' '}' 'module.exports = { fragen, sqlVon };' >> model.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Checkliste zum Lesen schreiben, Teil 1
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'const { fragen, sqlVon } = require(\"./model\");' 'const fragenliste = [' ' { f: \"Wie viele verschiedene Mitglieder haben im Monat 3 ein Buch geliehen?\", braucht: [\"DISTINCT\", \"monat = 3\"],' ' a: \"SELECT COUNT(mitglied_id) FROM ausleihen WHERE monat = 3\",' ' b: \"SELECT COUNT(DISTINCT mitglied_id) FROM ausleihen WHERE monat = 3\" },' ' { f: \"Wie viele Bücher sind noch ausgeliehen?\", braucht: [\"zurueck = 0\"],' ' a: \"SELECT COUNT(*) FROM ausleihen\",' ' b: \"SELECT COUNT(*) FROM ausleihen WHERE zurueck = 0\" },' ' { f: \"Welche Titel hat Mitglied 2 geliehen?\", braucht: [\"buch_id\", \"mitglied_id = 2\"],' ' a: \"SELECT b.titel FROM ausleihen a JOIN buecher b ON a.id = b.id WHERE a.mitglied_id = 2\",' ' b: \"SELECT b.titel FROM ausleihen a JOIN buecher b ON a.buch_id = b.id WHERE a.mitglied_id = 2\" },' '];' > lesen.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Checkliste zum Lesen schreiben, Teil 2
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'function stauchen(sql) { return sql.toUpperCase().split(/\s+/).join(\" \").trim(); }' 'function pruefen(sql, braucht) {' ' const text = stauchen(sql);' ' const probleme = braucht.filter(function (n) { return text.indexOf(stauchen(n)) < 0; })' ' .map(function (n) { return \"fehlt \" + n; });' ' if (/ON \w+\.ID = \w+\.ID\b/.test(text)) probleme.push(\"verbindet id mit id\");' ' return probleme.length ? probleme.join(\", \") : \"sieht richtig aus\";' '}' >> lesen.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Checkliste zum Lesen schreiben, Teil 3
docker exec -w /home/node/project agent sh -c "printf '%s\n' 'async function main() {' ' fragenliste.forEach(function (x, i) {' ' console.log((i + 1) + \" \" + x.f);' ' console.log(\" A: \" + pruefen(x.a, x.braucht));' ' console.log(\" B: \" + pruefen(x.b, x.braucht));' ' });' ' const schema = \"ausleihen(id, buch_id, mitglied_id, monat, zurueck)\nmitglieder(id, name)\nausleihen.mitglied_id -> mitglieder.id\";' ' const system = \"Antworten Sie mit genau einer SQLite-SELECT-Abfrage und sonst nichts.\";' ' const probe = \"SELECT COUNT(DISTINCT mitglied_id) FROM ausleihen WHERE monat = 3;\";' ' const antwort = await fragen([{ role: \"system\", content: system },' ' { role: \"user\", content: schema + \"\nFrage: \" + fragenliste[0].f }], probe, 120);' ' const sql = sqlVon(antwort.text);' ' console.log(\"Das Modell schrieb: \" + sql);' ' console.log(\" Leseprüfung: \" + pruefen(sql, fragenliste[0].braucht));' '}' 'main();' >> lesen.js"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Checkliste zum Lesen ausführen
docker exec -w /home/node/project agent node lesen.jsHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Was der Run ausgibt
| Zeile | Was sie zeigt |
|---|---|
| A: fehlt DISTINCT | Frage 1, Kandidat A zählt Duplikate |
| A: fehlt zurueck = 0 | Frage 2, Kandidat A hat keinen Filter |
| A: fehlt buch_id, verbindet id mit id | Frage 3, Kandidat A verbindet über die falsche Spalte |
| B: sieht richtig aus | Jeder Kandidat B besteht die Leseprüfung |
| Das Modell schrieb: ... | Die Abfrage des Modells für Frage 1, genauso gelesen, oder eine Aufgezeichnete Probe |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.