Zurück zur Hauptseite
Impressum
< SQL sortieren Inhalt Aggregatsfunktionen >

Tabellen verbinden

Folgendes Video erklärt wie man Tabellen in SQL verbindet:



Tabellen in SQL-Abfragen verbinden

Eine DB beinhaltet Tabellen, welche logisch zusammengehören.
Will man z.B. wissen von welchem Interpreten welches Lied ist, so muss man in der SQL-Abfrage Tabellen verbinden.
Die SQL Anfrage SELECT * FROM table1, table2; liefert ein kartesisches Produkt,
d.h. in der Ergebnistabelle ist jede Zeile von table1 mit jeder Zeile von table2 verbunden.
Beispiel Kreuzprodukt
Mit den Tabellen table1:
t1idt2id
a0b3
a1b4
a2b4
t2id
b3
b4

Liefert SELECT * FROM table1, table2; folgendes Ergebnis:
table1.t1idtable1.t2idtable2.t2id
a0b3b3
a0b3b4
a1b4b3
a1b4b4
a2b4b3
a2b4b4


Hier wird jeder Datensatz von table1 mit jedem Datensatz table2 verbunden.
Um Tabellen "richtig" zu verbinden muss man das Ergebnis auf Datensätze einschränken, in welchen der Primär- und Fremdschlüssel übereinstimmen.
Hierzu gibt es 2 Möglichkeiten.

Verbinden über WHERE

Gibt man im WHERE-Teil der SQL-Abfrage an, dass der Primärschlüssel der 2. Tabelle gleich dem Fremdschlüssel der ersten Tabelle sein muss, so werden nur "passende" Datensätze geliefert.

Im obigen Beispiel muss an SELECT * FROM table1, table2 noch WHERE table2.t2id=table1.t2id angehängt werden.
Beispiel zum Verbinden über WHERE:
Mit den Tabellen table1:
t1idt2id
a0b3
a1b4
a2b4
t2id
b3
b4

Liefert SELECT * FROM table1, table2
WHERE table2.t2id=table1.t2id;
folgendes Ergebnis:
table1.t1idtable1.t2idtable2.t2id
a0b3b3
a1b4b4
a2b4b4


Hier werden nur Datensätze geliefert in welchen der Fremdschlüssel t2id aus table1 mit dem Primärschlüssel t2id aus table2 übereinstimmt.
Beim Verbinden über WHERE bildet das Datenbank-Mangement-System (DBMS) zuerst das kartesische Produkt, dies kann zu extrem großen Zwischentabellen führen.

Bsp.: 3 Tabellen mit je 1000 Datensätzen werden verknüpft:
Da jeder Datensatz von jeder der 3 Tabellen mit jedem Datensatz der andern verbunden wird entsteht eine Zwischentabelle mit 1.000*1.000*1.000 = 1.000.000.000 Zeilen!

Aus dieser Milliarde Datensätze werden dann mit dem WHERE die passenden z.B. 1000 Datensätze ermittelt.

Die benötigt viel Zeit und Speicher.

Verbinden über INNER JOIN

Um große Zwischentabellen zu vermeiden können Tabellen bereits im FROM-Teil verbunden werden.
Der FROM-Teil sieht dann folgendermaßen aus:
SELECT * 
FROM tabelle1
     INNER JOIN tabelle2 ON tabelle1.PK = tabelle2.FK
     INNER JOIN tabelle3 ON tabelle2.FK = tabelle3.PK
     ...
Das heißt an die erste Tabelle (tabelle1) wird die Tabelle2 mit INNER JOIN angehängt und anschließend mit ON angegeben, welcher Primärschlüssel (PK) gleich welchem Fremdschlüssel (FK) sein muss.
Beispiel zum Verbinden über WHERE:
Mit den Tabellen table1:
t1idt2id
a0b3
a1b4
a2b4
t2id
b3
b4

Liefert
 SELECT *
 FROM table1 INNER JOIN table2 ON table2.t2id=table1.t2id;

folgendes Ergebnis:
table1.t1idtable1.t2idtable2.t2id
a0b3b3
a1b4b4
a2b4b4


Hier werden nur Datensätze geliefert in welchen der Fremdschlüssel t2id aus table1 mit dem Primärschlüssel t2id aus table2 übereinstimmt.
Und dies ohne vorher eine große Zwischetabelle zu erzeugen.
Hier werden nur die Datensätze in der Zwischentabelle gespeichert, welche zusammenpassen. Somit ist die Zwischentabellen viel kleiner.
Am effektivsten ist es, wenn man mit der kleinsten Tabelle beginnt.

Aufgabe 1

Gegeben ist eine CD-Datenbank mit folgenden Tabellen:
CD( CDID, TITEL )
AUFCD( CDID LIEDID )
INTERPRET( ID, NAME, STILRICHTUNG )
VON( IntId LiedId )
LIED( ID, NAME )
  1. Geben Sie alle Liednamen aus, welche auf der CD mit CDID 0 sind
  2. Geben Sie alle Liednamen (als Song) mit zugehörigem CD-Titel (als CD) aus.
  3. Geben Sie alle Lied-Titel (als Lied) mit Interpretennamen (als Interpret) aus.
  4. Geben Sie alle Lied-Titel aus, welche von einer Band gespielt werden, welche keine Stilrichtung besitzt.
  5. Geben Sie alle Stilrichtungen von CD 1 aus ohne doppelte Nennungen.
  6. Geben Sie alle Interpreten von CD 1 aus. Sortieren Sie diese alphabetisch und vermeiden sie doppelte Datensätze.
  7. Geben Sie alle Lieder incl. Interpret aus, wo Lied und Interpret mit 'B' beginnt.

Aufgabe 2

Gegeben ist folgende Bestell-Datenbank.
Ein Kunde kann mehrere Bestellungen aufgeben welche wiederum aus mehreren Produkten bestehen.
Eine nicht ausgelieferte Bestellung hat im Feld Ausgeliefert den Wert NULL.
KUNDE( ID, NAME, PLZ, ORT, STRASSE )
BESTELLUNG( NR, KUNDENID, AUSGELIEFERT )
BESTELLT( BESTELLNR, PID, ANZAHL )
PRODUKT( ID, NAME, PREIS )
  1. Ermitteln Sie alle Kunden, für welche Bestellungen noch ausgeliefert werden müssen.
  2. Geben Sie die Produktnamen, deren Preis und die Bestell-Nr der Bestellung 53 aus.
  3. Geben Sie alle Bestellungen des Kunden 0 aus.
  4. Geben Sie alle Produkte (Name und Preis) aus, welche Kunde 0 bestellt hat.
  5. Geben Sie alle Bestellungs-Nummern aus, welche nach Berlin geliefert werden.
  6. Geben Sie alle Produkte aus welche nach Dresden geliefert werden.
  7. Geben Sie alle Orte aus ohne doppelte zu nennen und absteigend sortiert.