layout | title | dbFile |
---|---|---|
tutorial_de |
Das Zaubereiministerium |
data/harrypotter_de.db |
Willkommen in der magischen Welt von Harry Potter! Du wurdest als Detektivin und Informatikspezialistin im großen Zaubereiministerium eingestellt. Um dir bei deinen Aufgaben zu helfen, hast du Zugriff auf das Magieregister, eine Datenbank, die alle bekannten Informationen über die Welt der Zauberer und Hexen auflistet.
Deine Chefin, Professor McGonagall, zeigt dir, wie das System funktioniert. Du hast Zugriff auf die Datenbank über eine Befehlszeile in einem Codeblock wie unten. Gib einfach einen gültigen Befehl ein und klicke auf RUN⬇️, um das Ergebnis zu sehen. Da dies das erste Mal ist, dass du dieses System verwendest, zeigt Professor McGonagall dir ein Beispiel um die Namen von 3 Personen in der Datenbank zu zeigen.
Du kannst sehen, dass ein SQL-Befehl oder eine Abfrage ein wenig wie ein Satz aussieht. Die in Großbuchstaben geschriebenen Wörter sind englische Schlüsselwörter, und die in Kleinbuchstaben geschriebenen Wörter geben an, wonach du suchen möchtest. SELECT
bedeutet "Wähle", FROM
bedeutet "von" oder "aus", und LIMIT
bedeutet "Begrenzung". Wenn wir die Codezeile übersetzen, erhalten wir: "WÄHLE
Name VON
Charaktere BEGRENZUNG
3".
Du hast gerade gelernt, wie man den Namen von Zauberern und Hexen anzeigt. Der Name ist ein Attribut (Eigenschaft). Bei jeder Abfrage wählt man eine bestimmte Anzahl von Atributen wie Name, Geschlecht, Geburtsjahr usw. aus. Aber es wäre nützlich zu wissen, welche anderen Attribute zu jedem Charakter existieren.
Um alle Attribute eines Charakters auszuwählen, muss *
verwendet werden.
Alles zwischen /*
und */
ist ein Kommentar und wird nicht ausgeführt, wenn du auf Run druckst.
Es scheint viele Zauberer und Hexen in dieser Datenbank zu geben. Aber wie viele genau? Dank SQL ist es auch möglich, die Anzahl der angezeigten Zeilen zu zählen. Um die Anzahl der Charaktere in der Datenbank zu finden, würden wir sagen:
Wähle die Anzahl aller Elemente in der Tabelle Charaktere aus.
Das wird also zu:
WÄHLE ZÄHLE(*) VON Charaktere
ZÄHLE() entspricht den SQL Befehl COUNT()
. Wir geben in Klammern an, was wir zählen möchten.
Gestern hat Bathilda Bagshot dem Ministerium gemeldet, dass eine junge Frau sie gegen Rowdys verteidigt hat, die versucht haben, ihr den Besen zu stehlen. Frau Bagshot möchte ihren Namen herausfinden, um ihr zu danken, denn das Mädchen musste nach der Rettung schnell verschwinden. Hier ist ihr Phantombild1, rekonstruiert nach den sehr genauen Beschreibungen der alten Dame:
Du müsstest also nach weiblichen Charakteren suchen, die silbergraue Augen haben und deren Patronus (Schutzgeist) ein Hase ist. Versuchen wir zunächst, alle weiblichen Charaktere zu finden. Dafür benötigen wir einen Befehl, der sagt:
Wähle alle Informationen der Charaktere aus, die Frauen sind.
Indem wir das ein wenig vereinfachen, erhalten wir:
WÄHLE * VON Charaktere WO Geschlecht='Weiblich'
Wir benötigen also einen Befehl wie WO, der eine Bedingung filtern kann. Für jeden Charakter ist die Bedingung entweder wahr (zum Beispiel: Geschlecht='Weiblich'), und die Zeile des Charakters wird angezeigt, oder die Bedingung ist falsch, und die Zeile wird ignoriert. Wenn wir dies ins Englische übersetzen:
Man verwendet WHERE
(WO auf Deutsch) um die Ergebnisse deiner Suchanfragen zu filtern.
-
FROM Charaktere
-
WHERE Geschlecht='Weiblich'
-
SELECT *
<sql-exercise
data-question="4. Schreibe die drei Code schnipsel in der richtigen Reihenfolge um alle weiblichen Charaktere mit WHERE
anzuzeigen."
data-comment=""
data-default-text="SELECT ..."
data-solution="
SELECT *
FROM Charaktere
WHERE Geschlecht='Weiblich' "
Gut, aber das sind immer noch zu viele Zeilen zum Durchgehen, und du müsstest deine Suche verfeinern. Dazu können wir die Bedingung hinzufügen, dass das Mädchen silbergraue Augen hat. Auf Deutsch würde man sagen:
Wähle alle Informationen der Charaktere aus, die Frauen sind und silbergraue Augen haben.
Wie vorhin übersetzt:
WÄHLE * VON Charaktere WO Geschlecht='Weiblich' UND Augen='Silbergrau'
Im Englischen sagt man "und" mit "and". Wir können also AND
verwenden, um Bedingungen zu kombinieren und sicherzustellen, dass der Charakter alle Bedingungen erfüllt.
<sql-exercise data-question="5. Übersetze die Anfrage ins Englische, indem du das bisher Gelernte verwendest." data-default-text="SELECT ... FROM ... WHERE ... AND ..." data-solution=" SELECT * FROM Charaktere WHERE Geschlecht='Weiblich' AND Augen='Silbergrau'"
Immer noch zu viele Personen... Versuche, die Bedingung des Patronus Hase hinzuzufügen.
<sql-exercise data-question="6. Ändere die vorherige Anfrage um die Bedingung des Patronus Hase hinzuzufügen." data-comment="Versuche, die Lösung nicht zu verwenden, und frage einen Assistenten um Hilfe, wenn du Hilfe brauchst." data-default-text="SELECT ..." data-solution=" SELECT * FROM Charaktere WHERE Geschlecht='Weiblich' AND Augen='Silbergrau' AND Patronus='Hase'"
Hast du sie jetzt gefunden?
Erinnerst du dich, wie man zählt? Nun, jetzt, da du filtern kannst mir WHERE
, kannst du auch etwas spezifischere Dinge zählen.
<sql-exercise data-question="7. Versuche die Anzahl der männlichen Zauberer mit schwarzen, roten oder braunen Haaren zu zählen, indem du die Lücken ausfüllst." data-comment="Fülle die fehlenden Lücken aus." data-default-text="SELECT COUNT() FROM Charaktere WHERE ... = 'Männlich' AND (... = 'Schwarz' OR Haare = ... OR Haare = ...)" data-solution=" SELECT COUNT() FROM Charaktere WHERE Geschlecht = 'Männlich' AND (Haare='Schwarz' OR Haare='Rot' OR Haare='Braun')" success-message="Richtig!"
Du hast sicherlich bemerkt, dass wir OR
verwenden, um oder auszudrücken. Was ist der Unterschied zwischen OR
und AND
?
Aber wir können es noch besser machen! Anstatt jedes Mal Haare=...
zu wiederholen, ist es einfacher, etwas zu schreiben, wie "die Haare müssen in der Liste: {'Schwarz', 'Rot', 'Braun'} sein".
Wir können IN
verwenden, um die Möglichkeiten aufzulisten.
<sql-exercise data-question="8. Vervollständige die folgende Abfrage." data-comment="Vergleiche diese Abfrage mit die Abfrage davor. Geben sie das gleiche Ergebnis? Du kannst auch versuchen, andere Dinge in der Tabelle zu zählen, wenn du möchtest." success-message="Tip top!" data-default-text="SELECT COUNT() FROM ... WHERE Geschlecht = 'Männlich' AND Haare IN ('Schwarz','Rot',...)" data-solution=" SELECT COUNT() FROM Charaktere WHERE Geschlecht = 'Männlich' AND Haare IN ('Schwarz','Rot','Braun')"
Versuche jetzt ein ganze Abfrage selber zu schreiben. <sql-exercise data-question="9. Wie viele Zauberer und Hexen sind in den Jahren 1979, 1980, 1981 oder 1982 geboren?" data-comment="Verwende COUNT(). Es gibt mehrere Möglichkeiten, diese Aufgabe zu lösen." data-default-text="" success-message="Genau!" data-hint=" SELECT COUNT() FROM Charaktere WHERE Geburt IN ..." data-solution=" SELECT COUNT() FROM Charaktere WHERE Geburt IN (1979,1980,1981,1982) / SELECT COUNT(*) FROM Charaktere WHERE Geburt > 1978 AND Geburt < 1983 */"
Die Zeichen <
und >
zwischen zwei Zahlen stehen für "ist kleiner als" respektiv "ist grösser als". Zum beispiel: 1 < 2 und 2 > 1.
Bisher haben wir immer auf die Tabelle Charaktere zugegriffen, in dem wir FROM Charaktere
geschrieben haben. Bevor du dich dem finalen Rätsel stellst, sagt Professor McGonagall, dass es zusätzlich zu der Tabelle Charaktere zwei weitere Tabellen in der Datenbank gibt, die nützlich sein werden:
- Verwandte, die alle Verwandtschaftsbeziehungen zwischen den Charakteren auflistet.
- Kreaturen, die alle magischen Kreaturen auflistet.
Es ist immer praktisch, einen Überblick über die Datenbank des Zaubereiministeriums in Form eines Schemas zu haben:
Struktur der Datenbank. Eine Tabelle wird durch eine Kasten dargestellt. Jede Zeile in den Kasten entspricht einem Attribut der Tabelle.Wir werden uns die Tabelle kreaturen später ansehen. Im Moment ist in der Tabelle Verwandte der erste_Name der/die verwandtschaft des zweite_Name. Zum Beispiel ist in der folgenden Tabelle Lily die Mutter von Harry und Harry ist der Sohn von James.
erster_Name | zweiter_Name | Verwandtschaft |
---|---|---|
Lily Potter | Harry Potter | Mutter |
Harry Potter | James Potter | Sohn |
... | ... | ... |
<sql-exercise data-question="10. Liste alle Attribute der Personen, die einen Bruder haben." data-default-text="" success-message="Genau! Das sind große Familien!" failure-message="" data-hint="Probiere etwas wie SELECT * FROM Verwandte WHERE Verwandtschaft = ..." data-solution=" SELECT * FROM Verwandte WHERE Verwandtschaft = 'Bruder'"
<sql-exercise data-question="11. Wie heißt die Grossmutter von Neville Longbottom?" data-default-text="" success-message="Das ist sie! Gut gemacht." failure-message="Das ist noch nicht die richtige Person..." data-hint="Probiere etwas wie SELECT erster_Name FROM ... WHERE zweiter_Name = ... AND ... = 'Grossmutter'" data-solution=" SELECT erster_Name FROM Verwandte WHERE zweiter_Name = 'Neville Longbottom' AND verwandtschaft = 'Grossmutter'"
Schließlich kannst du dank dieser neuen Tabellen auch Informationen miteinander verknüpfen. Zum Beispiel, wenn du wissen möchtest, welche Zauberer eine Tochter haben und blaue Augen haben, benötigst du Informationen aus zwei verschiedenen Tabellen. Du müsstest also versuchen, sie miteinander zu verbinden. Schauen wir uns erst einmal an, wie man die beiden Informationen getrennt findet.
- Zuerst, um die Namen der Zauberer und Hexen zu finden, die eine Tochter haben, wählen wir die Tabelle Verwandte aus und filtern die Ergebnisse, wenn die Verwandtschaft gleich "Tochter" ist.
<sql-exercise data-question="12. Die Namen der Zauberer, die eine Tochter haben" data-comment="Du kannst es alleine versuchen, aber zögere nicht, auf Hinweis zu drucken." data-default-text="" data-hint="Fülle die Lücken aus SELECT ... FROM ... WHERE ...='Tochter'" data-solution=" SELECT erster_Name FROM Verwandte WHERE verwandtschaft='Tochter'"
- Dann möchten wir den Namen der Zauberer finden, die blaue Augen haben.
<sql-exercise data-question="13. Die Namen der Zauberer, die blaue Augen haben" data-comment="" data-default-text="" data-hint="Fülle die Lücken aus SELECT Name FROM Charaktere WHERE ...=..." data-solution=" SELECT Name FROM Charaktere WHERE Augen='Blau'"
- Wir setzen die beiden Bedingungen zusammen und kombinieren die vorherigen Antworten in einem einzigen Befehl.
<sql-exercise data-question="14. Die Namen der Zauberer und Hexen, die blaue Augen und eine Tochter haben" data-comment="Zögere nicht, es so zu machen wie zuvor: zuerst einen Satz, dann einen vereinfachten Satz und übersetze ihn in Code. Füge die Lösungen der beiden vorherigen Punkte ein." success-message="Juhu!!! Du hast Informationen aus zwei verschiedenen Tabellen miteinander verknüpft, du bist eine wahre Expertin!" data-default-text="SELECT Name FROM Charaktere WHERE Name IN (/Die Namen der Zauberer und Hexen, die eine Tochter haben/) AND /die Augen sind blau/" data-hint="Hinweis: Du musst verwenden, was wir zuvor gelernt haben.
- Die Namen der Zauberer und Hexen, die eine Tochter haben: SELECT erster_Name FROM Verwandte WHERE verwandtschaft='Tochter'
- Die Zauberer, die blaue Augen haben: WHERE Augen = 'Blau'" data-solution=" SELECT Name FROM Charaktere WHERE Name IN (SELECT erster_Name FROM Verwandte WHERE verwandtschaft='Tochter') AND Augen='Blau'"
Du kannst also mehrere SQL-Befehle ineinander verschachteln.
Du hast jetzt alle Werkzeuge, um dich der großen Untersuchung des Diebstahls des Feuerkelchs zu stellen! Wenn du dich bereit fühlst, die Herausforderung anzunehmen, gehe zur nächsten Seite.
Footnotes
-
Quelle wallpaperaccess.com ↩