<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<game>
    <head>
        <title>SQL Jungle</title>
        <teaser>In SQL-Jungle lernt man spielerisch den Umgang mit SQL. Der Protagonist ist mit seinem Flugzeug im Jungle abgest&#xFC;rzt und braucht Hilfe von dessen Bewohnern, um wieder nach Hause zu kommen.</teaser>
        <copyright>&#xA9; 2023 Lily M. und Mich&#xE8;le B.</copyright>
    </head>
    <scenes>
        <text-scene>
            <text>In SQL-Jungle lernt man spielerisch den Umgang mit SQL. Der Protagonist ist mit seinem Flugzeug im Jungle abgest&#xFC;rzt und braucht Hilfe von dessen Bewohnern, um wieder nach Hause zu kommen.</text>
        </text-scene>
        <text-scene>
            <text>Der Protagonist bekommt eine kurze Erkl&#xE4;rung von Affe Andy daf&#xFC;r, was passiert ist und wie er den Jungle wieder verlassen kann. Es muss daf&#xFC;r im Gegenzug irgendwie den Ureinwohnern helfen.</text>
        </text-scene>
        <select-scene is-row-order-relevant="false" is-col-order-relevant="false" are-col-names-relevant="false">
            <text>Andy sagt dem Protagonisten, er solle erst einmal nachsehen, wie die Dorfbewohner hei&#xDF;en, welche Stellung und W&#xFC;nsche sie haben. Als Tipp gibt er ihm: &#x201E;Benutze hierzu SELECT * und gib bei FROM den Namen der Relation an, welche du einsehen m&#xF6;chtest.&#x201C;</text>
            <sql-solution>SELECT * FROM person</sql-solution>
            <sql-placeholder></sql-placeholder>
        </select-scene>
        <select-scene is-row-order-relevant="false" is-col-order-relevant="false" are-col-names-relevant="false">
            <text>Um einen &#xDC;berblick zu bekommen, wie lange es dauern wird, bis der Protagonist den Jungle wieder verlassen kann, muss er die Bewohner z&#xE4;hlen. Tipp: &#x201E;Nutze COUNT(*) in der SELECT-Klausel!&#x201C;</text>
            <sql-solution>SELECT COUNT(*) FROM person</sql-solution>
            <sql-placeholder></sql-placeholder>
        </select-scene>
        <text-scene>
            <text>Andy erkl&#xE4;rt, dass der Protagonist die W&#xFC;nsche der Ureinwohner am besten in einer bestimmten Reihenfolge erf&#xFC;llen sollte, damit er am Ende dem H&#xE4;uptling helfen kann, der wiederum ihm aus dem Jungle helfen wird. Au&#xDF;erdem erw&#xE4;hnt er, dass auch Tiere ihm in einigen Situationen weiterhelfen k&#xF6;nnen.</text>
        </text-scene>
        <select-scene is-row-order-relevant="false" is-col-order-relevant="false" are-col-names-relevant="false">
            <text>Der Affe Andy sagt, dass er mit Susis Wunsch Beginnen sollte. Um diesen zu erf&#xFC;llen, muss er alles &#xFC;ber sie herausfinden. Daf&#xFC;r erkl&#xE4;rt Andy au&#xDF;erdem: &#x201E;Hierf&#xFC;r kommt zu SELECT und FROM auch noch die WHERE-Klausel. Dort gibst du einfach die Bedingungen ein, die gebraucht sind. Hier w&#xE4;re dies &#x60;name = &#x27;Susi&#x27;&#x60;.</text>
            <sql-solution>SELECT * FROM person WHERE name = &#x27;Susi&#x27;</sql-solution>
            <sql-placeholder></sql-placeholder>
        </select-scene>
        <select-scene is-row-order-relevant="false" is-col-order-relevant="false" are-col-names-relevant="false">
            <text>Jetzt, wo der Protagonist den Wunsch von Susi wei&#xDF;, muss er den derzeitigen Besitzer der N&#xFC;sse herausfinden. Hier erkl&#xE4;rt Affe Andy: &#x201E;Benutze einen Join, indem du zwei Relationen in die FROM  Zeile eingibst. Au&#xDF;erdem musst du, da die Namen der Attribute in beiden Relationen vorkommen, die Bedingungen in der WHERE-Klausel deutlich formulieren, z.B. &#x60;person.wunsch = objekt.name&#x60;. Damit h&#xE4;ttest du schon die Join-Bedingung, allerdings musst du in diesem Fall zwei Bedingungen in der WHERE-Klausel verwenden. Nutze hierzu AND.&#x201C;</text>
            <sql-solution>SELECT *
FROM   person, objekt
WHERE  person.wunsch = objekt.name
       AND objekt.name = &#x27;N&#xFC;sse&#x27;</sql-solution>
            <sql-placeholder></sql-placeholder>
        </select-scene>
        <manipulate-scene>
            <text>Danach muss der Protagonist den momentanen Besitzer der N&#xFC;sse davon &#xFC;berzeugen, die N&#xFC;sse an Susi abzugeben. Daf&#xFC;r &#xE4;ndern wir den jetzigen Besitzer zu &#x27;Susi&#x27;. Andy sagt: &#x201E;Da dies etwas schwerer ist gebe ich dir einen Tipp: Gib UPDATE objekt SET besitzer = &#x27;sus&#x27; WHERE besitzer = &#x27;aaffe&#x27; ein.&#x201C;</text>
            <sql-solution>UPDATE objekt SET besitzer=&#x27;sus&#x27; WHERE besitzer=&#x27;aaffe&#x27;</sql-solution>
            <sql-check>SELECT * FROM objekt</sql-check>
            <sql-placeholder></sql-placeholder>
        </manipulate-scene>
        <manipulate-scene>
            <text>Nun muss der Protagonist noch die restlichen W&#xFC;nsche zu erf&#xFC;llen. Dies muss er in der Reihenfolge Kristi, dann Kevin und zuletzt Hempter machen. Wiederhole also den Vorgang von gerade, mit den richtigen Daten, f&#xFC;r die jeweiligen Personen bis du den letzten Wunsch erf&#xFC;llt hast. Beginne nun mit Kristi und formuliere anschlie&#xDF;end die passende UPDATE-Anfrage.</text>
            <sql-solution>UPDATE objekt
SET    besitzer = &#x27;heilerk&#x27;
WHERE  besitzer = &#x27;ziegenberg&#x27;</sql-solution>
            <sql-check>SELECT * FROM objekt</sql-check>
            <sql-placeholder></sql-placeholder>
        </manipulate-scene>
        <manipulate-scene>
            <text>Weiter geht es mit Kevin. Wiederhole also den Vorgang von gerade und formuliere anschlie&#xDF;end die passende UPDATE-Anfrage.</text>
            <sql-solution>UPDATE objekt
SET    besitzer = &#x27;kevderboss&#x27;
WHERE  name=&#x27;Blume&#x27;</sql-solution>
            <sql-check>SELECT * FROM objekt</sql-check>
            <sql-placeholder></sql-placeholder>
        </manipulate-scene>
        <manipulate-scene>
            <text>Abschlie&#xDF;end noch Hempter. Wiederhole also den Vorgang von gerade und formuliere anschlie&#xDF;end die passende UPDATE-Anfrage.</text>
            <sql-solution>UPDATE objekt
SET    besitzer=&#x27;haeuptlingh&#x27;
WHERE  besitzer=&#x27;ssschlange&#x27;</sql-solution>
            <sql-check>SELECT * FROM objekt</sql-check>
            <sql-placeholder></sql-placeholder>
        </manipulate-scene>
        <text-scene>
            <text>Nun steht der Protagonist vor dem H&#xE4;uptling, der ihm nun aus Dankbarkeit, dass er alle W&#xFC;nsche erf&#xFC;llt hat, den Weg aus dem Jungle erkl&#xE4;rt.</text>
        </text-scene>
        <text-scene>
            <text>Mit dem (hoffentlich) erfolgreichen Beenden des SQL-Jungle-Spiels bist du mit den Basics der Abfragespache SQL vertraut und hast auch gelernt, wie man Joins und Aggregationen verwendet. Als Zusatz wei&#xDF;t du auch, wie man Datens&#xE4;tze &#xE4;ndern kann.</text>
        </text-scene>
    </scenes>
    <initial-sql-script>CREATE TABLE IF NOT EXISTS tier (
&#x9;kuerzel&#x9;TEXT,
&#x9;name&#x9;TEXT,
&#x9;art&#x9;TEXT,
&#x9;PRIMARY KEY(kuerzel)
);
INSERT INTO tier VALUES (&#x27;aaffe&#x27;,&#x27;Andy&#x27;,&#x27;Affe&#x27;);
INSERT INTO tier VALUES (&#x27;ziegenberg&#x27;,&#x27;Berta&#x27;,&#x27;Bergziege&#x27;);
INSERT INTO tier VALUES (&#x27;ssschlange&#x27;,&#x27;Siegfried&#x27;,&#x27;Schlange&#x27;);
CREATE TABLE IF NOT EXISTS person (
&#x9;kuerzel&#x9;TEXT,
&#x9;name&#x9;TEXT,
&#x9;stellung&#x9;TEXT,
&#x9;wunsch&#x9;TEXT,
&#x9;PRIMARY KEY(kuerzel)
);
INSERT INTO person VALUES (&#x27;heilerk&#x27;,&#x27;Kristi&#x27;,&#x27;Heiler&#x27;,&#x27;Kamille&#x27;);
INSERT INTO person VALUES (&#x27;haeuptlingh&#x27;,&#x27;Hempter&#x27;,&#x27;H&#xE4;uptling&#x27;,&#x27;Speer&#x27;);
INSERT INTO person VALUES (&#x27;sus&#x27;,&#x27;Susi&#x27;,&#x27;Kind&#x27;,&#x27;N&#xFC;sse&#x27;);
INSERT INTO person VALUES (&#x27;kevderboss&#x27;,&#x27;Kevin&#x27;,&#x27;Kind&#x27;,&#x27;Blume&#x27;);
CREATE TABLE IF NOT EXISTS objekt (
&#x9;name&#x9;TEXT,
&#x9;besitzer&#x9;TEXT,
&#x9;PRIMARY KEY(name)
);
INSERT INTO objekt VALUES (&#x27;Kamille&#x27;,&#x27;ziegenberg&#x27;);
INSERT INTO objekt VALUES (&#x27;Blume&#x27;,&#x27;heilerk&#x27;);
INSERT INTO objekt VALUES (&#x27;Speer&#x27;,&#x27;ssschlange&#x27;);
INSERT INTO objekt VALUES (&#x27;N&#xFC;sse&#x27;,&#x27;aaffe&#x27;);</initial-sql-script>
</game>