Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
| planung:datenbanken [2023/05/22 21:16] – marroc | planung:datenbanken [2023/06/05 22:16] (aktuell) – marroc | ||
|---|---|---|---|
| Zeile 114: | Zeile 114: | ||
| <WRAP nicebox green> | <WRAP nicebox green> | ||
| - | Betrachte | + | **Aufgabe** |
| + | Betrachten Sie die unten abgebildeten drei zusätzlichen Zeilen in der Tabelle ** Kommentare **. Was kannst du aus diesen drei Zeilen ablesen? Wer hat das Foto gepostet, wer hat kommentiert und um welches Foto handelte es sich? | ||
| {{: | {{: | ||
| - | <color # | + | |
| Zeile 163: | Zeile 164: | ||
| Die Assoziationen (teilweise auch Kardinalität genannt) gibt es verschiedene Typen. | Die Assoziationen (teilweise auch Kardinalität genannt) gibt es verschiedene Typen. | ||
| - | * **Einfache Assoziation: | + | * **Einfache Assoziation: |
| * **Konditionelle Assoziation**: | * **Konditionelle Assoziation**: | ||
| * **Mehrfache Assoziation**: | * **Mehrfache Assoziation**: | ||
| Zeile 182: | Zeile 183: | ||
| <WRAP nicebox green> | <WRAP nicebox green> | ||
| - | **Kurzer Auftrag: | + | **Kurzer Auftrag |
| Identifizieren Sie im obigen Model die Primär- und die Fremdschlüssel und bestimmen Sie die restlichen nicht abgebildeten Attribute. Ihr Instahub oder die früheren Tabellen können helfen. | Identifizieren Sie im obigen Model die Primär- und die Fremdschlüssel und bestimmen Sie die restlichen nicht abgebildeten Attribute. Ihr Instahub oder die früheren Tabellen können helfen. | ||
| </ | </ | ||
| - | < | + | < |
| - | + | ** ERM - Aufgabe ** \\ | |
| - | Erstellen Sie ein ERM zum folgenden Szenario. Dies wird sicher am einfachsten auf Papier erstellt. Achtung, vermutlich braucht dies auch etwas Platz! | + | Erstellen Sie ein ERM zum folgenden Szenario. Dies wird sicher am einfachsten auf Papier erstellt. Indentifizieren Sie die Primär- und Fremdschlüssel, |
| **Szenario: | **Szenario: | ||
| Sie entwickeln für einen Zoo eine kleine Datenbank. Es geht darum, Tiere, Gehege und Pflegerinnen und Pfleger in die Datenbank aufzunehmen. dabei gelten die folgenden Beziehungen. | Sie entwickeln für einen Zoo eine kleine Datenbank. Es geht darum, Tiere, Gehege und Pflegerinnen und Pfleger in die Datenbank aufzunehmen. dabei gelten die folgenden Beziehungen. | ||
| - | * **Tiere:**\\ | + | ^^Tiere:^ ^ |
| - | Jedes Tier lebt in einem bestimmten Gehege und kann von mehreren Pflegerinnen oder Pflegern gepflegt werden. | + | | |Jedes Tier lebt in einem bestimmten Gehege und kann von mehreren Pflegerinnen oder Pflegern gepflegt werden.Über jedes Tier sollen die verschiedenen Attribute abgespeichert werden: |
| - | Über jedes Tier sollen die verschiedenen Attribute abgespeichert werden: | + | ^Gehege:^ ^ |
| - | * Name des Tiers (Primärschlüssel) | + | | |Jedes Tier gehört wie schon erwähnt zu genau einem Gehege. In einem Gehege können aber mehrere Tiere gleichzeitig leben! Für jedes Gehege |
| - | * Tier-Art | + | ^Tierpfleger oder -pflegerin ^ ^ |
| - | * Ernährung | + | | |Ein Pfleger oder Pflegerin pflegt mehrere verschiedene Tiere. Die / der PflegerIn kann für mehrere Gehege hauptverantwortlich sein. Über jede Pflegerin und jeden Pfleger sollen die folgenden Attribute abgespeichert werden: |
| - | * Geburtsdatum | + | |
| - | * Grösse | + | |
| - | * Gewicht | + | |
| - | * Geschlecht | + | |
| - | + | ||
| - | * **Gehege:**\\ | + | |
| - | Jedes Tier gehört wie schon erwähnt zu genau einem Gehege. In einem Gehege können aber mehrere Tiere gleichzeitig leben! Für jedes Gehege | + | |
| - | Über jedes Gehege wollen wir die folgenden Attribute abspeichern: | + | |
| - | * Gehegename | + | |
| - | * Grösse | + | |
| - | * Gehegetyp (Wüste, Wald, Tropisch, Wasser oder Aquarium) | + | |
| - | + | ||
| - | * **PflegerIn: | + | |
| - | Ein Pfleger oder Pflegerin pflegt mehrere verschiedene Tiere. Die / der PflegerIn kann für mehrere Gehege hauptverantwortlich sein. | + | |
| - | Über jede Pflegerin und jeden Pfleger sollen die folgenden Attribute abgespeichert werden: | + | |
| - | * P_ID (Primärschlüssel) | + | |
| - | * Vornamen | + | |
| - | * Nachnamen | + | |
| - | * Geburtsdatum | + | |
| - | * Telefonnummer | + | |
| </ | </ | ||
| - | ===== Abbildungsregeln für die drei Beziehungstypen | + | ==== Abbildungsregeln für die drei Beziehungstypen ==== |
| - | ==== Abbildungsregel für 1:1 Beziehungen - KANN-Regel ==== | + | Eine relationale Datenbank besteht somit aus mehreren untereinander in Beziehung |
| - | <WRAP center round info 100%> | + | |
| - | Die **KANN-Regel** bedeutet, dass man bei einer einfach-zu-einfach | + | |
| - | + | ||
| - | Alternativ ist es hier aber auch möglich, nur 1 Tabelle | + | |
| - | </ | + | |
| - | Entsprechend ergeben sich beim Beispiel er 1:1 Beziehung | + | |
| - | === Lösung 1 === | + | |
| - | {{: | + | |
| - | === Lösung 2 === | + | |
| - | {{: | + | |
| - | === Lösung 3 === | + | |
| - | {{: | + | |
| + | === Abbildungsregel für 1:1 Beziehungen - KANN-Regel === | ||
| + | Die **KANN-Regel** bedeutet, dass man bei einer einfach-zu-einfach Beziehung zwei Tabellen erstellen kann, aber nicht miss. Es spielt keine Rolle, ob man (im Beispiel Land-Hauptstadt bei der Land-Tabelle die Hauptstadt als Fremdschlüssel definiert oder umgekehrt bei der Hauptstadt-Tabelle das Land als Fremdschlüssel definiert). \\ | ||
| + | Alternativ ist es hier aber auch möglich, nur 1 Tabelle zu erstellen, die alle Länder und Hauptstädte enthält. Natürlich braucht es in diesem Fall keinen Fremdschlüssel mehr, jedoch nach wie vor einen Primärschlüssel. | ||
| + | ---- | ||
| === Abbildungsregel - MUSS-Regel für einfach-mehrfache Beziehungen === | === Abbildungsregel - MUSS-Regel für einfach-mehrfache Beziehungen === | ||
| - | <WRAP center round info 100%> | ||
| - | Die **MUSS-Regel für einfach-mehrfache Beziehungen** bedeutet, dass man bei einer einfach-mehrfachen Beziehung immer zwei Tabellen benötigt und auch die Position des Fremdschlüssels klar definiert ist. Im obigen Beispiel muss Der/die RegisseurIn in der Tabelle Filme definiert werden (und nicht umgekehrt), weil jeder Film genau einen oder eine RegisseurIn hat und umgekehrt jeder/jede RegisseurIn in mehreren Filmen Regie führen kann. Würde man also Film bei der Tabelle RegisseurIn als Fremdschlüssel hinzufügen, | ||
| - | </ | ||
| - | Entsprechend ergibt sich bei beim Beispiel der Beziehung Film-Regisseur(in) die folgende Lösung für die Tabellen: | ||
| - | === Lösung === | ||
| - | {{: | ||
| - | === Weiteres Beispiel einer einfach-zu-mehrfachen-Beziehung === | ||
| - | * Jeder Auftrag (zum Beispiel Bestellung) gehört zu genau 1 Kunden, während jeder Kunde mehrere Aufträge tätigen kann | ||
| - | {{: | ||
| - | === Abbildungsregeln - MUSS-Regel für komplexe | + | Die **MUSS-Regel für einfach-mehrfache |
| - | <WRAP center round info 100%> | + | **Beispiel einer einfach-zu-mehrfachen-Beziehung**\\ |
| - | Die **MUSS-Regel für komplexe Beziehungen** bedeutet, dass man bei komplexen (mehrfach-zu-mehrfach, also n:m) Beziehungen für jede der beiden Entitäten eine Tabelle braucht und __zusätzlich__ für die Beziehung | + | Jeder Auftrag |
| - | </ | + | ---- |
| - | Entsprechend ergibt sich zum Beispiel | + | |
| - | === Lösung === | + | |
| - | {{: | + | |
| - | Beachten Sie die letzte Tabelle, die einen aus 2 Fremdschlüsseln (F_ID & S_ID) zusammengesetzten Primärschlüssel hat. Hier wird lediglich eingetragen, | + | |
| - | <WRAP center round todo 100%> | + | === Abbildungsregeln - MUSS-Regel für komplexe Beziehungen === |
| - | **Aufgabe 3) Tabellen Abbilden**\\ | + | |
| - | * Sie sollen nun zu zu Ihrem in Aufgabe 2 ertsellten ERM: | + | |
| - | - Die entsprechenden Tabellen mit Hilfe der Abbildungsregeln | + | |
| - | | + | |
| - | | + | |
| - | **Hier finden Sie die Musterlösung des ERM aus Aufgabe 2:**\\ | + | Die **MUSS-Regel für komplexe Beziehungen** bedeutet, dass man bei komplexen (mehrfach-zu-mehrfach, |
| - | < | + | Hier kann unser Beispiel vom Anfang mit den Instahub User - Photos - Kommentaren genannt werden. |
| - | <panel type=" | + | |
| - | {{: | + | |
| - | </ | + | ---- |
| - | </accordion> | + | <WRAP nicebox green> |
| - | + | **Auftrag ERM und die Regeln | |
| - | **Szenario:**\\ | + | - Besprechen |
| - | Sie entwickeln | + | |
| - | * **Tiere: | + | |
| - | Jedes Tier lebt in einem bestimmten Gehege und kann von mehreren Pflegerinnen oder Pflegern gepflegt werden. | + | |
| - | Über jedes Tier sollen die verschiedenen Attribute abgespeichert werden: | + | |
| - | * Tier-Art | + | |
| - | * Name des Tiers | + | |
| - | * Ernährung | + | |
| - | * Geburtsdatum | + | |
| - | * Grösse | + | |
| - | * Gewicht | + | |
| - | * Geschlecht | + | |
| - | + | ||
| - | * **Gehege: | + | |
| - | Jedes Tier gehört wie schon erwähnt zu genau einem Gehege. In einem Gehege können aber mehrere Tiere gleichzeitig leben! Für jedes Gehege ist genau 1 Pfleger oder Pflegerin Hauptverantwortlich. | + | |
| - | Über jedes Gehege wollen wir die folgenden Attribute abspeichern: | + | |
| - | * Gehegename (Primärschlüssel) | + | |
| - | | + | |
| - | * Gehegetyp (Wüste, Wald, Tropisch, Wasser oder Aquarium) | + | |
| - | + | ||
| - | * **PflegerIn: | + | |
| - | Ein Pfleger oder Pflegerin pflegt mehrere verschiedene Tiere. Die / der PflegerIn kann für mehrere Gehege hauptverantwortlich sein. | + | |
| - | Über jede Pflegerin und jeden Pfleger sollen | + | |
| - | * P_ID (Primärschlüssel) | + | |
| - | * Vornamen | + | |
| - | * Nachnamen | + | |
| - | * Geburtsdatum | + | |
| - | * Telefonnummer | + | |
| - | + | ||
| - | **Daten: | + | |
| - | Pflegerinnen und Pfleger: | + | |
| - | * Mathilda Schnell, 12.1.2001 pflegt alle Tiger und Löwen und ist für das Gehege Savanna hauptverantwortlich | + | |
| - | * Kurt Dotale, 13.9.1997 pflegt alle Pandabären | + | |
| - | * Micheline Maire, 1.7.1989 pflegt alle Fische und ist für das Gehege Aquarium und Aussengehege verantwortlich | + | |
| - | * Claire Nussbaumer, 1.7.1999, pflegt auch alle Tiger und Löwen und ist für kein Gehege hauptverantwortlich | + | |
| - | * Donald Braun, 1.9.1982 pflegt alle Vögel und ist für für die Tropen und den Nordwald hauptverantwortlich | + | |
| - | + | ||
| - | Tiere: | + | |
| - | * Panda Xiang, hat ein Gewicht von 130 kg und eine Grösse von 125 cm, ist weiblich und lebt im Gehege Tropen. Xiang wurde am 13.1.2009 geboren. | + | |
| - | * Panda Meng, hat ein Gewicht von 145 kg, eine Grösse von 130 cm, ist männlich und lebt im Gehege | + | |
| - | * Löwe Sama, hat ein Gewicht von 190 kg und eine Grösse von 190 cm, ist männlich und lebt im Gehege | + | |
| - | * Löwin Bela, hat ein Gewicht von 155 kg und eine Grösse von 182 cm, ist weiblichund lebt im Gehege der Savanna. Bela ist am 14.4.2007 zur Welt gekommen | + | |
| - | * Ara Kurt, hat ein Gewicht von 1.3 kg und eine Grösse von 35 cm. Der Papagei lebt im Gehege Exotik 1 | + | |
| - | * ... | + | |
| - | + | ||
| - | Gehege: | + | |
| - | * Exotik 1 hat eine Grösse von 400 m^2 und hat den Gehegetypen tropisch | + | |
| - | * Exotik 2 hat eine Grösse von 350 m^2 und hat den Gehegetypen tropisch | + | |
| - | * Tropen hat eine Grösse von 750m^2 und hat den Gehegetypen tropisch | + | |
| - | * Savanna hat eine Grösse von 700 m^2 und ist vom Gehegetypen Savanna | + | |
| - | * Aquarium hat eine Grösse von 30 m^3 und ist vom Gehegetypen Aquarium | + | |
| - | * Nordwald hat eine Grösse von 750 m^2 und ist vom Gehegetypen Wald | + | |
| - | + | ||
| - | **Musterlösung: | + | |
| - | < | + | |
| - | <panel type=" | + | |
| - | {{: | + | |
| - | + | ||
| - | </ | + | |
| - | </ | + | |
| </ | </ | ||
| - | + | ====== Einführung in SQL ====== | |
| - | ====== | + | |
| Stuctured Quere Language (SQL) ist eine standardisierte Abfrage-Sprache um Daten in Datenbanken zu speichern, zu manipulieren und herauszufiltern (zu erhalten). \\ | Stuctured Quere Language (SQL) ist eine standardisierte Abfrage-Sprache um Daten in Datenbanken zu speichern, zu manipulieren und herauszufiltern (zu erhalten). \\ | ||
| - | In diesem Kapitel | + | Im folgenden |
| + | Einige wichtige Befehle sind im Folgenden erklärt: | ||
| ^SQL-Klausel ^Zweck ^Erklärung ^ | ^SQL-Klausel ^Zweck ^Erklärung ^ | ||
| |SELECT |Gibt die Felder mit den gewünschten Daten an |Hiermit | |SELECT |Gibt die Felder mit den gewünschten Daten an |Hiermit | ||
| |FROM |Enthält die Tabellen mit den Feldern, die in der SELECT-Klausel angegeben sind |In welchen Tabellen liegen die Felder (Spalten), die wir erhalten wollen? | | |FROM |Enthält die Tabellen mit den Feldern, die in der SELECT-Klausel angegeben sind |In welchen Tabellen liegen die Felder (Spalten), die wir erhalten wollen? | | ||
| |WHERE |Gibt Feldkriterien an, die jeder Datensatz erfüllen muss, um in die Ergebnisse einbezogen zu werden|Hier lassen sich Datensätze herausfiltern (z.B. wenn wir nur gewisse Daten einer Tabelle anzeigen wollen). | | |WHERE |Gibt Feldkriterien an, die jeder Datensatz erfüllen muss, um in die Ergebnisse einbezogen zu werden|Hier lassen sich Datensätze herausfiltern (z.B. wenn wir nur gewisse Daten einer Tabelle anzeigen wollen). | | ||
| - | |||
| - | |||
| - | |||
| - | <WRAP center round todo 100%> | ||
| - | **Übung 1: Tutorial durcharbeiten**\\ | ||
| - | Öffnen Sie [[https:// | ||
| - | Probieren Sie bitte alle Abfragen selber aus und studieren Sie die Erklärungen dazu! | ||
| - | </ | ||
| - | |||
| - | ====== Tutorial ====== | ||
| - | ===== Beispiel: Datenbank über Studentinnen und Studenten ===== | ||
| - | Nehmen wir einmal an, wir hätten eine Datenbank mit einer Tabelle namens **Students**, | ||
| - | {{: | ||
| - | |||
| - | ==== SHOW TABLES ==== | ||
| - | Zunächst mal würden wir gerne herausfinden, | ||
| - | Tippen Sie hierfür den folgenden Befehl ein und klicken Sie auf " | ||
| - | <file SQL> | ||
| - | SHOW TABLES; | ||
| - | </ | ||
| - | === Resultat === | ||
| - | Wir sehen nun, dass diese Datenbank aus nur 1 Tabelle besteht, die sich " | ||
| - | {{: | ||
| - | |||
| - | |||
| - | ==== SELECT & FROM ==== | ||
| - | Wir würden nun gerne eine Tabelle erhalten, bei der wir nur die Nachnamen und Vornamen aller Studentinnen und Studenten haben, also ohne die anderen Felder (wie S_ID, Geburtsdatum, | ||
| - | Wenn wir das Deutsch ansprechen würde, dann würden wir sagen "NIMM die Vornamen und Nachnamen VON der Tabelle Students!\\ | ||
| - | Im folgenden Beispiel machen wir genau das, aber mit der Sprache SQL ausgedrückt. Also SELECT Nachname, Vorname FROM Students. \\ | ||
| - | Beachten Sie, dass jedes SQL-Statement mit einem Semikolon ; abgeschlossen werden muss! | ||
| - | === Abfrage === | ||
| - | <file SQL> | ||
| - | SELECT Nachname, Vorname | ||
| - | FROM Students; | ||
| - | </ | ||
| - | === Resultat === | ||
| - | {{: | ||
| - | |||
| - | Beim obigen Beispiel sehen wir schön, wie wir mit Hilfe der SELECT-Klausel die anzuzeigenden Felder anwählen können. Wir können also die Tabelle sozusagen vertikal (von oben nach unten) filtern.\\ | ||
| - | Wenn wir nun jedoch die Tabelle stattdessen horizontal (von links nach rechts) filtern wollen, also nur gewisse Datensätze erhalten wollen, macht man dies mit Hilfe der WHERE-Klausel. Studieren Sie hierzu das folgende Beispiel! | ||
| - | |||
| - | ==== SELECT DISTINCT==== | ||
| - | Probieren Sie die folgenden beiden Abfragen. Inwiefern unterscheiden sich diese? | ||
| - | <file SQL> | ||
| - | SELECT Nationalität | ||
| - | FROM Students; | ||
| - | </ | ||
| - | |||
| - | <file SQL> | ||
| - | SELECT distinct Nationalität | ||
| - | FROM Students; | ||
| - | </ | ||
| - | ==== WHERE ==== | ||
| - | Probieren Sie das folgende Beispiel aus:\\ | ||
| - | <file SQL> | ||
| - | SELECT Nachname, Vorname, Nationalität | ||
| - | FROM Students | ||
| - | WHERE Nationalität=" | ||
| - | </ | ||
| - | {{: | ||
| - | |||
| === Vergleichsoperatoren === | === Vergleichsoperatoren === | ||
| ^Zeichen ^Bedeutung ^ | ^Zeichen ^Bedeutung ^ | ||
| Zeile 416: | Zeile 249: | ||
| |BETWEEN a AND b |Zwischen a und b | | |BETWEEN a AND b |Zwischen a und b | | ||
| - | Wenn wir nun zum Beispiel | + | Beispiel |
| - | <file SQL> | + | //Suchen Sie alle Usernamen |
| - | SELECT | + | Hier kann über die Suche auch die SQL-Abfrage angezeigt werden.{{ : |
| - | FROM Students | + | Die SQL-Abfrage ist somit: |
| - | WHERE Geburtsdatum<"2000-01-01"; | + | <code SQL> |
| - | </file> | + | SELECT |
| + | FROM users | ||
| + | WHERE gender = " | ||
| + | </ | ||
| + | |||
| + | <WRAP nicebox green> | ||
| + | Bearbeiten Sie die folgenden kurzen Aufträge mit Hilfe Ihres Insthubs. Dabei nutzen Sie wieder die Datenbank-Suche oben rechts in Instahub. Notieren Sie anschliessend die SQL-Abfragen. Ziel ist es, in einem zweiten Schritt nicht mehr über die Suche sondern direkt SQL-Abfragen formulieren zu können. | ||
| + | - Alle Benutzer: | ||
| + | - Alle Usernamen der männlichen Benutzer. | ||
| + | - Die Benutzer: | ||
| + | - Die Benutzer, die noch nicht 18 Jahre alt sind. | ||
| + | - Die Benutzerinnen, | ||
| + | - Die Benutzer, die kleiner als 1.65m und die Benutzerinnen, | ||
| + | - Formulieren Sie weitere Abfragen, die Sie sich gegenseitig als Aufgaben stellen. | ||
| + | </ | ||
| + | |||
| + | |||
| + | < | ||
| + | <panel title = ' | ||
| + | 1. Aufgabe | ||
| + | <code SLQ> | ||
| + | SELECT username | ||
| + | FROM users | ||
| + | WHERE username LIKE " | ||
| + | </code> | ||
| + | |||
| + | 2. Aufgabe | ||
| + | <code SLQ> | ||
| + | SELECT username | ||
| + | FROM users | ||
| + | WHERE gender = "male" | ||
| + | </code> | ||
| + | |||
| + | 3. Aufgabe | ||
| + | <code SLQ> | ||
| + | |||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| ==== AND und OR ==== | ==== AND und OR ==== | ||
| Die WHERE-Klausel lässt sich beliebig mit den Ausrücken AND und OR erweitern. Falls wir zum Beispiel alle Studentinnen und Studenten finden wolle, die entweder aus der Schweiz oder (**OR**) aus Deutschland stammen, würden wir das folgende Query eingeben:\\ | Die WHERE-Klausel lässt sich beliebig mit den Ausrücken AND und OR erweitern. Falls wir zum Beispiel alle Studentinnen und Studenten finden wolle, die entweder aus der Schweiz oder (**OR**) aus Deutschland stammen, würden wir das folgende Query eingeben:\\ | ||