Springe zum Inhalt oder Footer
SerloDie freie Lernplattform

Kurs

Abfragen über mehrere Tabellen

1 Übersicht

Bei einer ordentlichen Modellierung sind relevante Daten häufig über mehrere Tabellen verteilt. Um diese Daten zusammenzutragen und weiterzuverarbeiten, muss man die Tabellen geeignet miteinander kombinieren. Wie das geht, lernst du in diesem Kurs.

Vorwissen:

Danach kannst du:

  • Abfragen in SQL schreiben, die über mehrere Tabellen hinweg gehen

  • Den Unterschied zwischen einem natürlichen Verbund und einem kartesischen Produkt erklären

Kursdauer: 90 Min

2 Andere Nutzer schauten auch...

Ein Streaminganbieter sammelt und analysiert das Filmschau-Verhalten seiner Kunden, um ihm und anderen Kunden geeignete Vorschläge zu machen. Dazu erfasst es alle Filme, die ein Nutzer ansieht und erstellt mithilfe eines Algorithmus Empfehlungen.

Damit Familien, die ihren Account zusammen nutzen, individuelle Vorschläge bekommen können, sind die Zahlungsdaten von den Nutzerinformationen getrennt.

Das vereinfachte Klassendiagramm sieht so aus:

Datenbank eines Streamingdienstes

3 Ein Blick in die Datenbank

Wenn du nochmal üben möchtest, wie man ausgehend vom Klassendiagramm zu einem Datenbankschema kommt und wie die Beziehungen zwischen den Klassen übertragen werden, kannst du diese Aufgabe bearbeiten:

Laden

4 Vielschauer oder Schummler?

Die Finanzabteilung stellt die Vermutung auf, dass der Großteil der Nutzer, die mehr als 2000 Stunden gestreamt haben, in ihren Zahlungsdaten das Preismodell "Single" haben. Die hohen Nutzungswerte kommen davon, dass mehrere Leute sich über einen Nutzeraccount einloggen, um Geld zu sparen.

Der Datenbankadministrator soll diese Vermutung überprüfen. Er öffnet die Tabelle mit allen Nutzern.

Laden

5 Der Schlüssel zum Sucherfolg

Die Ergebnistabelle nach der Abfrage präsentiert so einige Informationen, aber nicht das Zahlungsmodell, wie du in diesem Ausschnitt sehen kannst:

Ausschnitt aus der Streamingdatenbank

Jetzt ist es an der Zeit, die Fremdschlüssel-Eigenschaft auszunutzen, die bei der Übertragung ins Datenbankschema zwischen NUTZER und ZAHLUNGSDATEN angelegt wurde:

Der Attributwert, der in NUTZER in der Spalte ZAHLUNGSDATEN_KundenID liegt, kann dazu genutzt werden, um in der Tabelle ZAHLUNGSDATEN den Accountbesitzer eindeutig zu identifizieren! Schau es dir auf der nächsten Seite an.

6 Die große Suche

Durch die Fremdschlüsselbeziehung kann man die beiden Tabellen NUTZER und ZAHLUNGSDATEN nebeneinander legen und die passenden Paare finden:

Fremdschlüssel und Schlüssel

Eine gleiche Farbe bedeutet, dass der Schlüssel von ZAHLUNGSDATEN und der Fremdschlüssel in NUTZER übereinstimmen und somit der Nutzer, der mehr als 2000 Nutzungsstunden hat, den Zahlungsdaten und dem Preismodell zugeordnet werden kann.

Für kleine Tabellen ist es vielleicht noch machbar, sich die Datensätze händisch zusammenzusuchen, doch in großen Datenbanken, wie denen von Streaminganbietern, ist das keine Option. Deshalb muss mit SQL Abfragen eine Verbindung zwischen den Tabellen hergestellt werden!

7 Der erste Versuch

Laden

8 Das kartesische Produkt

Wenn du die Aufgabe auf der vorherigen Seite bearbeitet oder zumindest die Lösung durchgelesen hast, ist dir das kartesische Produkt schon ein Begriff:

Möchte man die Daten aus mehreren Tabellen mithilfe einer SQL-Anfrage in einer Ergebnisrelation zusammenfassen, so kann man dies mit

SELECT *
FROM Tabelle1, Tabelle2, ..., Tabelle x;

erreichen. Werden keine weiteren Angaben gemacht, so erhält man als Ergebnis das kartesische Produkt dieser Tabellen.

Bildet man das kartesische Produkt aus zwei Tabellen Tabelle1 und Tabelle2, so kombiniert man jeden Datensatz der ersten Tabelle mit jedem Datensatz der zweiten Tabelle. Die Anzahl der Einträge ist dann:

Anzahl Eintra¨ge im kartesischen Produkt=Anzahl Eintra¨ge Tabelle1Anzahl Eintra¨ge Tabelle2\displaystyle \text{Anzahl Einträge im kartesischen Produkt}= \\ \text{Anzahl Einträge Tabelle1}\cdot\text{Anzahl Einträge Tabelle2}

Das kartesische Produkt ist selten das, was du mit einer Abfrage erhalten willst. Trotzdem ist es nützlich, es zu kennen.

9 Übungen zum kartesischen Produkt

Laden

10 Die KundenID muss passen

Laden

11 Der natürliche Verbund

Die Angabe der Bedingung hatte gar nicht so viel Neues!

Mit der Abfrage

SELECT *
FROM NUTZER, ZAHLUNGSDATEN
WHERE NUTZER.ZAHLUNGSDATEN_KundenID = ZAHLUNGSDATEN.KundenID;

bekommst du die Zuordnung der Kundendaten zu den Nutzern:

natural join in der Streamingdatenbank

Verwendest du zum Verbinden der Tabellen die Schlüssel bzw. Fremdschlüssel, um die passenden Paare zu finden, so bildest du den natürlichen Verbund.

12 Endlich eine Antwort

Mit diesem Wissen kannst du die SQL-Abfrage formulieren, die die Daten für die Finanzabteilung liefern:

Laden

13 Aufgaben zu 1:n-Beziehungen

Wenn du noch weiter üben möchtest, kannst du diese Aufgabe bearbeiten:

Laden

14 Süchtig nach Superhelden

Auch das Marketing-Team hat eine Hypothese, die mit der Datenbank getestet werden soll. Sie behauptet, dass Nutzer, die Superhelden-Franchise wie zum Beispiel Marvel oder DC schauen, sehr hohe Nutzungsstunden haben. Diese Filme würden laut dem neuen Praktikanten "süchtig machen" und zu Filmmarathons und Binge-Watching verleiten.

Als konkrete Anfrage will das Team wissen, wie hoch die Nutzungsstunden der Nutzer sind, die den Film "Captain America" gesehen haben, den ersten Film der Reihe.

15 Erinnerung: m:n-Beziehungen

Ein Blick auf das Datenbankschema verrät, dass man, um vom Filmtitel auf die Nutzungsdauer zu kommen, drei Tabellen braucht: Über FILM zu angeschaut und dann zu NUTZER.

Datenschema Streaming Datenbank

Das liegt daran, dass es sich bei "Nutzer schaut Film an" um eine m:n-Beziehung handelt:

Ein Nutzer kann viele Filme ansehen und ein Film kann von vielen Nutzern angesehen werden.

In der Tabelle angeschaut gibt es, um diese Beziehung darzustellen, nur die zwei Fremdschlüssel als Attribute: einen zur Tabelle FILM und einen zur TabelleNUTZER.

16 Der Datenbank-Dreisprung

Laden

17 Abfragen bei m:n-Beziehungen

Bei guter Datenbankmodellierung gibt es für m:n-Beziehungen eine extra Beziehungstabelle mit den Schlüsseln der beiden anderen Tabellen als Fremdschlüssel. Um Daten aus diesen beiden Tabellen zu verknüpfen, muss man diese Beziehungstabelle in den natürlichen Verbund mit einbeziehen:

SELECT *
FROM Tabelle_1, Tabelle_2, Beziehungstabelle
WHERE Tabelle_1.Schlüssel = Beziehungstabelle.Schlüssel_1
AND Tabelle_2.Schlüssel = Beziehungstabelle.Schlüssel_2;

Diese Abfrage wirkt auf den ersten Blick etwas sperrig, hat aber nicht wirklich etwas Neues im Vergleich zu den 1:n-Beziehungen.

Am besten übst du einfach mal ein wenig die Abfragen auf der nächsten Seite und dann hast du auch schon alles Wichtige gelernt!

Hinweis: Natürlich lassen sich beliebig viele Tabellen miteinander verknüpfen. Das Schema funktioniert dabei immer gleich.

18 Übungsaufgaben zu m:n-Beziehungen

Laden

19 Zusammenfassung

Häufig muss man Daten aus mehreren Tabellen mit SQL-Abfragen zusammentragen.

Hierfür kann man im FROM-Teil der Abfrage mehrere Tabellen durch ein Komma getrennt angeben:

SELECT *
FROM NUTZER, FILM, angeschaut;

kartesisches Produkt

Ohne weitere Einschränkungen bildet die Abfrage oben das kartesische Produkt aus den Tabellen und kombiniert jeden Eintrag jeder Tabelle mit jedem Eintrag der anderen.

Die Anzahl der Elemente im kartesischen Produkt ist deshalb das Produkt der Anzahlen der Datensätze in den beteiligten Tabellen:

Nutzer: 55 Einträge,

Film: 1010 Einträge,

kartesisches Produkt der beiden: 510 =505\cdot10\ =50 Einträge

natürlicher Verbund

Wichtiger für den Alltag ist der natürliche Verbund. Hier werden Fremdschlüssel genutzt, um Paare in den beiden Tabellen zu finden und zusammen zu setzen:

SELECT *
FROM NUTZER, ZAHLUNGSDATEN
WHERE NUTZER.KundenID = ZAHLUNGSDATEN.KundenID

1:n und m:n Beziehungen abfragen

Der einzige Unterschied zwischen den Abfragen für 1:n und m:n-Beziehungen ist die Anzahl der zu verknüpfenden Tabellen. Bei der 1:n-Beziehung müssen, wie im Beispiel direkt darüber, nur zwei Tabellen verknüpft werden. Bei der m:n-Beziehung muss auch die Beziehungstabelle mit verknüpft werden.

SELECT *
FROM angeschaut, NUTZER, FILM
WHERE angeschaut.UserID = NUTZER.UserID
AND angeschaut.FilmID = FILM.FilmID;

Es handelt sich in allen Fällen um ganz normale SQL-Abfragen und alle Befehle und Funktionen können ganz normal verwendet werden.


Dieses Werk steht unter der freien Lizenz
CC BY-SA 4.0Was bedeutet das?