Leitidee

Informationen stehen in Datenbanken häufig nicht in einer einzigen Tabelle. Wenn Daten aus mehreren Tabellen benötigt werden, müssen wir angeben, welche Datensätze zusammengehören.

Mehrere Tabellen stehen im FROM-Teil. Die Verknüpfungsbedingung steht im WHERE-Teil.

Terra3-Datenbank

Diese Version verwendet die Datei terra3.sqlite. Sie enthält bereits getrennte Tabellen für Länder, Orte und Kontinente.

land

Länder mit Länderkennung, Kontinentnummer und Hauptstadtkennung.

ort

Orte mit Ortskennung, Länderkennung, Einwohnerzahl und Koordinaten.

kontinent

Kontinente mit Kontinentnummer, Name, Fläche und Einwohnerzahl.

Wichtig: zwei Arten von Bedingungen

Bei Abfragen mit mehreren Tabellen stehen im WHERE-Teil oft zwei unterschiedliche Arten von Bedingungen. Sie haben verschiedene Aufgaben.

2. Filterbedingung

Sie schränkt das Ergebnis fachlich ein, zum Beispiel auf einen bestimmten Kontinent.

AND kontinent.Name = 'Europa'

Mini-Aufgabe

Die folgenden beiden Zeilen sind nur der Bedingungsteil einer SQL-Abfrage. Sie sind also noch keine vollständige SQL-Abfrage.

WHERE land.KNR = kontinent.KNR
AND kontinent.Name = 'Europa';

Was fehlt vor diesem Ausschnitt? Notiere zuerst deine Ideen oder die vollständige SQL-Abfrage auf Papier oder elektronisch.

Hinweis und Lösung anzeigen

Vor dem WHERE-Teil müssen noch zwei Teile stehen: Welche Spalten sollen angezeigt werden? Aus welchen Tabellen werden die Daten geholt?

Lösung anzeigen
SELECT land.Name AS Land, kontinent.Name AS Kontinent
FROM land, kontinent
WHERE land.KNR = kontinent.KNR
AND kontinent.Name = 'Europa'
ORDER BY land.Name;

Die Verknüpfungsbedingung ordnet passende Datensätze zu. Die Filterbedingung beschränkt das Ergebnis auf Europa.

Vorgehen in drei Schritten

Die Abfrage wird schrittweise entwickelt. Jeder Schritt hat einen kurzen Arbeitsauftrag und eine eigene leere SQL-Eingabe. So wird deutlich, warum die Verknüpfungsbedingung im WHERE-Teil notwendig ist.

Schema öffnen ↗

1. Schritt: Auswahl der Tabellen

Zuerst werden im FROM-Teil alle Tabellen angegeben, aus denen Daten benötigt werden. Diese Abfrage ist absichtlich noch nicht fertig: Es wird noch nicht festgelegt, welche Datensätze zusammengehören.

Arbeitsauftrag: Formuliere eine Abfrage, in der zunächst nur die Tabellen land und kontinent im FROM-Teil genannt werden. Führe sie aus und achte besonders auf die Zahl der Ergebniszeilen.

Noch keine Abfrage zu Schritt 1 ausgeführt

Erwartete Beobachtung: Es entstehen sehr viele Kombinationen. Jedes Land wird mit jedem Kontinent kombiniert. Das ist noch kein fachlich sinnvolles Ergebnis.

2. Schritt: Passende Datensätze zuordnen

Nun wird ergänzt, welche Datensätze zusammengehören. Dafür wird im WHERE-Teil die Kontinentnummer aus land mit der passenden Kontinentnummer aus kontinent verglichen.

Arbeitsauftrag: Ergänze deine Abfrage so, dass nur passende Länder und Kontinente zusammen angezeigt werden. Vergleiche das Ergebnis mit Schritt 1.

Noch keine Abfrage zu Schritt 2 ausgeführt

Erwartete Beobachtung: Jetzt werden nur noch passende Länder und Kontinente zusammen angezeigt. Die doppelt vorkommenden Schlüsselspalten sieht man aber noch.

3. Schritt: Ergebnis einschränken und übersichtlich ausgeben

Zum Schluss werden nur die benötigten Spalten angezeigt. Zusätzlich kann eine fachliche Filterbedingung ergänzt werden, zum Beispiel: nur Länder aus Europa.

Arbeitsauftrag: Beschränke die Anzeige auf die benötigten Spalten und ergänze eine fachliche Filterbedingung, zum Beispiel für Europa. Prüfe, welche Bedingung die Tabellen passend zuordnet und welche Bedingung das Ergebnis einschränkt.

Noch keine Abfrage zu Schritt 3 ausgeführt

Erwartete Beobachtung: Die Ausgabe ist jetzt deutlich übersichtlicher: Es werden nur die gewünschten Spalten und nur die fachlich passenden Datensätze angezeigt.

Eigene SQL-Abfrage testen

Hier können eigene lesende Abfragen gegen die Terra3-Datenbank getestet werden. Erlaubt sind nur SELECT-Abfragen. Die Ausgabe wird automatisch auf 20 Zeilen begrenzt, falls kein eigenes LIMIT angegeben wurde.

Noch keine eigene Abfrage ausgeführt

Beispielabfragen ausführen

Die folgenden Beispiele werden serverseitig aus der SQLite-Datenbank geladen. Sie dienen als Muster für eigene Abfragen.

Noch kein Beispiel geladen

Beispiel: Länder mit Kontinentnamen

Die Tabelle land enthält nur die Kontinentnummer. Der ausgeschriebene Name steht in der Tabelle kontinent.

SELECT land.Name AS Land, kontinent.Name AS Kontinent
FROM land, kontinent
WHERE land.KNR = kontinent.KNR
ORDER BY land.Name;

Die Bedingung land.KNR = kontinent.KNR sorgt dafür, dass Land und Kontinent passend zusammen angezeigt werden.

Beispiel: Länder in Europa

Hier kommen zwei Bedingungen zusammen: eine Verknüpfungsbedingung und eine Filterbedingung.

SELECT land.Name AS Land, land.Einwohner, land.Flaeche
FROM land, kontinent
WHERE land.KNR = kontinent.KNR
AND kontinent.Name = 'Europa'
ORDER BY land.Name;