Abschnittsübersicht

    • Bearbeiten wir das Hauptproblem bei der Verwaltung von Daten in Tabellen, nämlich die Frage: Wie kommen wir gezielt an Informationen. Das Datenbankmanagementsystem verfügt dazu über eine mächtige Sprache: SQL - und die lernen wir nun (erstmal spielerisch). Auf geht es nach SQL Island!

    • Lösungen SQL-Island Datei
      Nicht verfügbar, außer: Sie sind in einer Gruppe
    • Lösungen SQL-Island (Video) Link/URL
      Nicht verfügbar, außer: Sie sind in einer Gruppe
    • CC BY SA 4.0, Dicklyon, https://commons.wikimedia.org/wiki/File:Don_Chamberlin.jpgDie Kommunikation mit dem Datenbanksystem erfolgt mithilfe der Programmiersprache SQL.

      Diese Sprache wurde in den 1970er Jahren von Donald D. Chamberlin (ACM Software System Award 1988) und Raymond F. Boyce basierend auf den Arbeiten von Edgar F. Codd (Turing Award 1981) bei IBM im Rahmen eines Forschungsprojektes entwickelt und 1987 international standardisiert. Im Gegensatz zu bisher im Unterricht behandelten Programmiersprachen die eine Schrittfolge zur Lösung eines Problems angeben (imperative Sprache), ist SQL eine beschreibende (= deklarative) Sprache.

      SQL-Befehle werden in verschiedene Klassen eingeteilt. Für den Informatikunterricht sind relevant:

      • DDL – Data Definition Language
        Befehle zur Definition von Tabellen und Sichten
      • DML – Data Manipulation Language
        Befehle zur Datenmanipulation und Datenabfrage

      Da wir fertige Datenbanksysteme nutzen wollen, ist zunächst nur die Datenabfrage interessant für uns.

      Bild: CC BY-SA 4.0, Dicklyon, https://commons.wikimedia.org/wiki/File:Don_Chamberlin.jpg

    • Hinweis: Parallel zur Erarbeitung der Operationen der Relationenalgebra erfolgt die Fortsetzung der Arbeit im SQL-Tutorial.

    • Operationen auf Tabellen – Selektion, Projektion, Join

      Der SQL-Select-Befehl ermöglicht das Filtern und Abfragen von Daten aus den Tabellen des relationalen Datenbanksystems. Grundlage des Befehls sind mathematische Operationen auf Tabellen, die als Relationenalgebra bezeichnet werden. Keine Panik - die Mathematik ist einfach!

    • Ergänzen Sie das Arbeitsblatt zu den Operationen der Relationenalgebra Selektion, Projektion und Join mithilfe des Lehrbuchs Schöningh Informatik II, Kapitel 7.3.

    • 02 AB Relationenalgebra Lösung Datei
      Nicht verfügbar, außer: Sie sind in einer Gruppe
    • Zusammenfassung der Operationen der Relationenalgebra

      Selektion: Bei der Selektion erfolgt eine Auswahl von Zeilen einer Tabelle, die bestimmten Eigenschaften genügen.

      Beispiel: Aus der Tabelle Schüler sollen alle Zeilen selektiert werden, für die das Attribut Name den Wert "Müller" hat.

      Schüler SName = 'Müller'(Schüler)
      SNr Vorname Name
      4711 Paul Müller
      0815 Erich Schmidt
      7472 Sven Lehmann
      1234 Olaf Müller
      2313 Jürgen Paulsen

      SNr Vorname Name
      4711 Paul Müller
      1234 Olaf Müller
       

      Projektion: Bei der Projektion erfolgt eine Auswahl von Spalten einer Tabelle mit Redundanzbeseitigung

      Beispiel: Aus der Tabelle Schüler soll das Attribut Name projiziert werden. 

      Schüler PName(Schüler)
      SNr Vorname Name
      4711 Paul Müller
      0815 Erich Schmidt
      7472 Sven Lehmann
      1234 Olaf Müller
      2313 Jürgen Paulsen

      Name
      Müller
      Schmidt
      Lehmann
      Paulsen

      Nacheinanderausführung von Projektion und Selektion

      Beispiel: Aus der Tabelle Schüler sollen die Vornamen aller Schüler angezeigt werden, deren Nachname Müller ist. 

      Schüler PVorname(SName = 'Müller'(Schüler))
      SNr Vorname Name
      4711 Paul Müller
      0815 Erich Schmidt
      7472 Sven Lehmann
      1234 Olaf Müller
      2313 Jürgen Paulsen

       →

      Vorname
      Paul
      Olaf
       
      Inner Join: Ein Join ist der Verbund zwei Relationen über ein verbindendes Attribut zu einer neuen Tabelle. Beim Inner Join werden genau die Datensätze zusammengeführt, bei denen in beiden Tabellen das verbindende Attribut den gleichen Wert besitzt.

      Beispiel: Aus den Tabellen Schüler und Kurse soll ein Inner Join gebildet werden. Das verbindende Attribut lautet SNr. 

      Schüler Kurse JSchüler.SNr = Kurs.SNr(Schüler, Kurs)
      SNr Vorname Name
      4711 Paul Müller
      0815 Erich Schmidt
      7472 Sven Lehmann
      1234 Olaf Müller
      2313 Jürgen Paulsen
      SNr KNr Fehlzeit Punkte
      0815 03 0 12
      4711 03 12 03
      4711 09 8 05
      1234 23 3 14

       

       →

      SNr Vorname Name KNr Fehlzeit Punkte
      4711 Paul Müller 03 12 03
      4711 Paul Müller 09 8 05
      0815 Erich Schmidt 03 0 12
      1234 Olaf Müller 23 3 14
       

      Da zu den SNr 7472 und 2314 der Tabelle Schüler keine "Gegenstücke" in der anderen Tabelle existieren, werden diese Datensätze nicht in der neuen Relation übernommen!

      Äußerer Verbund – Left Join, Right Join, Full Join (nur für den LK): Beim äußeren Verbund werden die Datensätze der beiden Tabellen zusammengeführt, auch wenn für das verbindende Attribut in einer der beiden Tabellen (LEFT/RIGHT) oder in beiden Tabellen (FULL) kein Attributwert vorliegt. In diesem Fall entstehen NULL-Werte. Die Abgabe LEFT bzw. RIGHT kennzeichnet dabei die Tabelle in der Reihenfolge der Notation des SQL-Befehls. 

      Beispiel: Für alle Schüler soll der Status der Spindvermietung angezeigt werden. Es ist also ein Verbund zwischen den Tabellen Schüler und Spind herzustellen wobei alle Schülerangaben angezeigt werden sollen. Es liegt also ein LEFT JOIN vor. Das verbindende Attribut lautet SNr. 

      Schüler Spind J(Left)Schüler.SNr = Spind.SNr(Schüler, Spind)
      SNr Vorname Name
      4711 Paul Müller
      0815 Erich Schmidt
      7472 Sven Lehmann
      1234 Olaf Müller
      2313 Jürgen Paulsen
      ID SNr Ort Beginn
      101   A2  
      102 4711 A1 2020-08-03
      103 4711 A1 2020-08-23
      104 1234 A2 2019-10-01
      105 A3

       

       →

      SNr Vorname Name ID Ort Beginn
      4711 Paul Müller 102 A1 2020-08-03
      4711 Paul Müller 103 A1 2020-08-23
      0815 Erich Schmidt      
      7472 Sven Lehmann
      1234 Olaf Müller 104 A2 2019-10-01
      2313 Jürgen Paulsen
       

    • Datenabfragen mit SQL

      Der SELECT-Befehl

      Die SQL-Abfrage erfolgt mit dem Befehl SELECT unter Angabe von bis zu sechs Komponenten. Die allgemeine Syntax hat die Gestalt:

      SELECT [ALL | DISTINCT] {spalten | *}
      FROM tabelle [alias] [tabelle [alias]] ...
      [WHERE {bedingung | unterabfrage}]
      [GROUP BY spalten [HAVING {bedingung | unterabfrage}]]
      [ORDER BY spalten [ASC | DESC]...];

      Die schwierige Syntax lässt sich wie folgt verstehen:

      Klausel Erläuterung
      SELECT [DISTINCT] Wähle die Werte aus der/den Spalte [mehrfache Datensätze nur einmal] ...
      FROM ... aus der Tabelle bzw. den Tabellen ...
      WHERE ... wobei die Bedingung(en) erfüllt sein soll(en) ...
      GROUP BY ... und gruppiere die Ausgabe von allen Zeilen mit gleichem Attributwert zu einer einzigen ...
      HAVING ... wobei darin folgende zusätzliche Bedingung(en) gelten müssen/muss ...
      ORDER BY [ASC/DESC] ... und sortiere nach den Spalten [auf- bzw. absteigend].
      Auswahl von Zeilen - Selektion

      Aus der Tabelle Schüler sollen alle Zeilen selektiert werden, in denen der Name "Müller" steht.
      (Die Selektion hat also die Form SName = 'Müller'(Schüler))

      Die Umsetzung in SQL lautet: 

      SELECT * 
      FROM Schüler
      WHERE Name = 'Müller';
      Schüler   Ergebnis
      SNr Vorname Name
      4711 Paul Müller
      0815 Erich Schmidt
      7472 Sven Lehmann
      1234 Olaf Müller
      2313 Jürgen Paulsen

      SNr Vorname Name
      4711 Paul Müller
      1234 Olaf Müller
       

      Die WHERE-Klausel liefert also die Selektion. Um zu zeigen, dass alle Spalten angezeigt werden sollen, wird das Stern-Symbol verwendet.

      Nun sollen aus der Tabelle Schüler sollen alle Zeilen selektiert werden, in denen der Name "Müller" steht und deren Vorname mit "O" beginnt. 
      (Die Selektion hat also die Form SName = 'Müller' UND Vorname beginnt mit 'O'(Schüler))

      Die Umsetzung in SQL lautet: 

      SELECT * 
      FROM Schüler
      WHERE Name = 'Müller' AND Vorname LIKE 'O%';
      Schüler   Ergebnis
      SNr Vorname Name
      4711 Paul Müller
      0815 Erich Schmidt
      7472 Sven Lehmann
      1234 Olaf Müller
      2313 Jürgen Paulsen

       →

      SNr Vorname Name
      1234 Olaf Müller
       

      Bedingungen lassen sich mit AND, OR und NOT verknüpfen. Das Prozentsymbol steht als Platzhalter für eine beliebige Folge von Zeichen. Soll ein einzelnes Zeichen ausgeblendet werden, so benutzt man den Unterstrich als Joker. LIKE wird verwendet im Sinne von "SO WIE". 

      Operator Erklärung
      = < <= >= > <> vergleicht ein Attributwert mit einem anderen bzw. Konstante auf 
      Gleichheit, kleiner als, kleiner gleich, größer gleich, größer, Ungleichheit
      BETWEEN ... AND ... vergleicht, ob der Attributwert zwischen zwei Grenzen liegt (incl. Grenzwerte)
      IN (..., ..., ...) vergleicht, ob der Attributwert ein Element der Menge ist
      LIKE vergleicht Zeichenketten anhand von Ähnlichkeitsoperatoren mit Unterscheidung auf Groß- und Kleinschreibung:
      %: Platzhalter für beliebige Zeichen
      _: Platzhalter für genau ein Zeichen
      IS (NOT) NULL prüft, ob ein Attributwert (nicht) undefiniert ist
      Auswahl von Spalten - Projektion

      Aus der Tabelle Schüler sollen alle Spalten mit dem Attribut "Name" projiziert werden.
      (Die Projektion hat also die Form PName(Schüler))

      Die Umsetzung in SQL lautet: 

      SELECT Name
      FROM Schüler; 
      Schüler   Ergebnis
      SNr Vorname Name
      4711 Paul Müller
      0815 Erich Schmidt
      7472 Sven Lehmann
      1234 Olaf Müller
      2313 Jürgen Paulsen

      Name
      Müller
      Schmidt
      Lehmann
         
      Paulsen

      Um Mehrfacheintragungen zu unterbinden, muss dem SELECT-Befehl das Schlüsselwort DISTINCT hinzugefügt werden.

      Die Umsetzung in SQL lautet: 

      SELECT DISTINCT Name 
      FROM Schüler; 
      Schüler   Ergebnis
      SNr Vorname Name
      4711 Paul Müller
      0815 Erich Schmidt
      7472 Sven Lehmann
      1234 Olaf Müller
      2313 Jürgen Paulsen

      Name
      Müller
      Schmidt
      Lehmann
      Paulsen

      Hintereinanderausführung von Projektion und Selektion

      Aus der Tabelle Schüler sollen die Vornamen aller Schüler angezeigt werden, deren Nachname Müller ist. 
      (Die Abfrage hat also die Form PVorname(SName = 'Müller'(Schüler)))

      Die Umsetzung in SQL lautet: 

      SELECT Vorname 
      FROM Schüler
      WHERE Name = 'Müller';
      Schüler   Ergebnis
      SNr Vorname Name
      4711 Paul Müller
      0815 Erich Schmidt
      7472 Sven Lehmann
      1234 Olaf Müller
      2313 Jürgen Paulsen

      Vorname
      Paul
      Olaf
       

      Die Abarbeitung des SQL-Befehls erfolgt also immer von innen nach außen, d. h. zuerst die Selektion, dann die Projektion. 

      Inner Join in SQL

      Aus den Tabellen Schüler und Kurse soll eine Tabelle gebildet werden. Das verbindende Attribut lautet SNr. 
      (Die Abfrage hat also die Form JSchüler.SNr = Kurs.SNr(Schüler, Kurse))

      Die Umsetzung in SQL lautet:

      SELECT * 
      FROM Schüler INNER JOIN Kurse
      ON Schüler.SNr = Kurse.SNr;
      Schüler Kurse   Ergebnis
      SNr Vorname Name
      4711 Paul Müller
      0815 Erich Schmidt
      7472 Sven Lehmann
      1234 Olaf Müller
      2313 Jürgen Paulsen
      SNr KNr Fehlzeit Punkte
      0815 03 0 12
      4711 03 12 03
      4711 09 8 05
      1234 23 3 14

       →

      SNr Vorname Name SNr KNr Fehlzeit Punkte
      4711 Paul Müller 4711 03 12 03
      4711 Paul Müller 4711 09 8 05
      0815 Erich Schmidt 0815 03 0 12
      1234 Olaf Müller 1234 23 3 14
       

      Das Ergebnis ist ein INNER JOIN, wobei die entstandene Tabelle Spalten mehrfach enthält. Ein solcher Ergebnis wird aber i. d. R. nicht gewünscht. Es genügen oft nur einige Spalten des Verbundes.

      Aus den Tabellen Schüler und Kurse sollen alle Schülernamen mit ihren Fehlzeiten aufgelistet werden. Der Befehl lautet:

      SELECT Schüler.Vorname, Schüler.Name, Kurse.KNr, Kurse.Fehlzeit 
      FROM Schüler INNER JOIN Kurse
      ON Schüler.SNr = Kurse.SNr 
      ORDER BY Kurse.Fehlzeit DESC;
      Ergebnis
      Vorname Name KNr Fehlzeit
      Paul Müller 03 12
      Olaf Müller 23 3
      Erich Schmidt 03 0
      Erich Schmidt 23 0
       

    • nur im LK: Outer Join in SQL

      Das im Kurs eingesetzte SQLite unterstützt als äußeren Verbund nur den LEFT JOIN. Ein RIGHT JOIN wird über die Änderung der Reihenfolge der Tabellen realisiert.

      Beispiel: Für alle Schüler soll der Status der Spindvermietung angezeigt werden. Es ist also ein Verbund zwischen den Tabellen Schüler und Spind herzustellen wobei alle Schüler angezeigt werden sollen. Es liegt also ein LEFT JOIN vor. Das verbindende Attribut lautet SNr. 

      Schüler Spind Ergebnis
      SNr Vorname Name
      4711 Paul Müller
      0815 Erich Schmidt
      7472 Sven Lehmann
      1234 Olaf Müller
      2313 Jürgen Paulsen
      ID SNr Ort Beginn
      101   A2  
      102 4711 A1 2020-08-03
      103 4711 A1 2020-08-23
      104 1234 A2 2019-10-01
      105 A3

       

       →

      SNr Vorname Name ID Ort Beginn
      4711 Paul Müller 102 A1 2020-08-03
      4711 Paul Müller 103 A1 2020-08-23
      0815 Erich Schmidt      
      7472 Sven Lehmann
      1234 Olaf Müller 104 A2 2019-10-01
      2313 Jürgen Paulsen
       

      Der SQL-Befehl lautet:

      SELECT * 
      FROM Schüler LEFT JOIN Spind
      ON Schüler.SNr = Spind.SNr;

      Ist eine Liste der Schüler erwünscht, die keine Spinde gemietet haben, so kann dies wie folgt abgefragt werden:

      SELECT Schüler.SNr 
      FROM Schüler LEFT JOIN Spind
      ON Schüler.SNr = Spind.SNr
      WHERE Spind.ID IS NULL;
    • nur für den LK: SQL-Befehle zum Einfügen, Löschen und Ändern von Daten

      Sowohl im SQL-Tutorial als auch auf SQL-Island sind uns weitere Befehle begegnet, die zum Einfügen, Löschen oder Ändern von Daten verwendet wurden.
      Fassen wir diese hier kurz zusammen:

      Einfügen eines vollständigen Datensatzes in der Reihenfolge der Attribute gemäß Relationenschema
      INSERT INTO tabelle
      VALUES (wert1, wert2, ...)
      Einfügen eines Datensatzes mit Angabe der Attribute, die die Werte erhalten sollen
      INSERT INTO tabelle (attribut1, attibut2, ...)
      VALUES (wert1, wert2, ...)
      Löschen von Datensätzen, die eine Bedingung erfüllen
      DELETE FROM tabelle
      WHERE bedingung
      Ändern von Daten, die eine Bedingung erfüllen
      UPDATE tabelle
      SET attribut1 = wert1, attribut2 = wert2, ...
      WHERE bedingung
    • Übungen

    • 01 Uni-Aufgabe 1 Lösungen Datei
      Nicht verfügbar, außer: Sie sind in einer Gruppe
    • 01 Aufgabe Teil 2 Lösung modifiziert (LK) Datei
      Nicht verfügbar, außer: Sie sind in einer Gruppe
    • 02 Übungen zur Relationenalgebra Lösung Datei
      Nicht verfügbar, außer: Sie sind in einer Gruppe
    • 03 Lösungen DB-Lehrbuch S. 64/2 Datei
      Nicht verfügbar, außer: Sie sind in einer Gruppe