Datenbank
SQL
4 Verknüpfen von Tabellen

Neben der Abfrage von Daten aus einer Tabelle kommt es viel häufiger vor, Daten aus mehreren Tabellen gleichzeitig abzufragen. Hierbei kommen Verknüpfungen (engl. join) zum Einsatz. Es gilt hierbei alles, was bisher dargestellt wurde.

 


4.1 Einführung

Die zu verknüpfenden Tabellen werden in der FROM Klausel aufgezählt, wobei die Reihenfolge keine Rolle spielt.

 

Die Verknüpfung wird in der WHERE Klausel deklariert. Bei den Spalten wird – wenn die Namen nicht eindeutig sind – der Tabellenname oder ein Alias mit angegeben. Doch Vorsicht bei dem Fehlen der Tabellenbezeichnern. Ich empfehle, diesen bei Verknüpfungen immer mitanzugeben.

 

SELECT [[Tabelle.]Spalte(,)]{1..n} FROM [Tabelle(,)]{1..n}

 

Als erstes Beispiel soll folgende Verknüpfung dienen:

 

select

  Tabelle1.Spalte1,

  Tabelle1.Spalte2,

  Tabelle2.Spalte1,

  Tabelle2.Spalte2

from

  Tabelle1,

  Tabelle2

 

Hierbei wird das kartesische Produkt Tabelle1 x Tabelle2 zurückgegeben, da keine Verknüpfung einschränkend angegeben wurde. Dies nennt man dann auch Crossjoin.

 

Anstelle des Tabellennamens – der meist lang ist – kann man einen Aliase für jede Tabelle vergeben, mit denen der Befehl verkürzt wird. Hierdurch wird der Befehl meist lesbarer. Diesen Alias schreibt man direkt hinter die Tabellenangabe in der FROM Klausel.

 

select

  t1.Spalte1,

  t1.Spalte2,

  t2.Spalte1,

  t2.Spalte2

from

  Tabelle1 as t1,

  Tabelle2 as t2

 

Die Angabe von AS bei der Aliasdeklaration ist optional.

 


4.2 Equi Joins

Bei dieser – am häufigsten eingesetzten – Verknüpfungsform werden zwei Tabellen miteinander Verknüpft, die über gleiche Spalten verfügen, in denen gleiche Werte stehen.

 

Dies sind in der Regel der Primärschlüssel einer Tabelle und der Fremdschlüssel dieser Tabelle in der zweiten Tabelle.

 

Man nennt diese Verknüpfungsart equi join, da die beiden Tabellen mit den gleichen Spalten über ein Gleichheitszeichen verknüpft werden.

 

Beispiel: Aufträge und ihre Artikel

 

select

  aa.Auftrag_Nummer,

  art. Nummer,

  art.Bezeichnung

from

  AuftragArtikel aa,

  Artikel art

where

  aa.Artikel_Nummer = art. Nummer

 

Dies Abfrage bewirkt, das alle Artikel eines Auftrags zusammen ausgegeben werden, und dies für jeden Auftrag, der in der Datenbank steht.

 

Natürlich können mehrere einschränkende Bedingungen in der WHERE Klausel angegeben werden. Diese Bedingung wird auf die Verknüpfung angewendet. Hiermit ist es z.B. möglich, die Artikeldaten nur eines Auftrags abzurufen.

 

select

  aa.Auftrag_Nummer,

  art. Nummer,

  art.Bezeichnung

from

  AuftragArtikel aa,

  Artikel art

where

        aa.Artikel_Nummer = art. Nummer

  AND aa.Auftrag_Nummer = 1

 

Genauso kann man die Umsätze jedes Artikels bestimmen.

 

select

  SUM (aa.Anzahl * art.Preis)

from

  Artikel art,

  Auftrag_Artikel aa

where

         aa.Artikel_Nummer = art. Nummer

  AND art.Bezeichnung = ‘Dosenbier‘

 

Beachte hierbei die Aliasnamen der beiden Tabellen. Der erste Term der WHERE Klausel stellt die Verknüpfung dar und der zweite Term ist eine einschränkende Bedingung.

 

Natürlich kann man mehr als zwei Tabellen verknüpfen. Hierbei werden jeweils zwei Tabellen in einem Term verknüpft und jeweils eine weitere Tabelle in einem weiteren Term verknüpft.

 

select

  kd.Name,

  kd.Vorname,

  art.Bezeichnung,

  art.Preis * aa.Anzahl,

  au.Nummer

from

  Artikel art,

  Auftrag au,

  Kunde kd

where

        kd. Nummer = au.Kunde_Nummer

 AND au. Nummer = aa.Auftrag_Nummer

 AND aa.Artikel_Nummer = art. Nummer

 

Man sieht an der Ergebnismenge, das, wenn mehr als eine entsprechende Zeile in der zweiten Tabelle existiert, mehrere Zeilen für dieselben Daten der ersten Tabelle generiert werden. Desweiteren sind keine Kunden in der Ergebnismenge enthalten, die bisher keinen Bestellung (=> Auftrag) aufgegeben haben, da hier keine Gleichheit existiert. Dies ist ein ganz wichtiger Punkt, der häufig vergessen wird.

 

Hinweis. Diese Art der Abfrage ist sehr viel schneller, als die Daten der drei Tabellen einzeln anzufordern. D.h. man nimmt die Kundentabelle, sucht zu jeder Kundennummer die Aufträge und zu jedem Auftrag die Artikel in jeweils einzelnen SQL Befehlen. Dieser Lösungsansatz ist zwar genau so richtig, kostet aber sehr viel Zeit und Prozessorlast. Also Finger davon und ein großer SQL Befehl schreiben.

 


4.3 Non Equi Joins

Als non equi join bezeichnet man jede Verknüpfung, die nicht das Gleichheitszeichen verwendet. Diese Art wird jedoch sehr selten eingesetzt und wird hier nicht weiter erläutert.

 


4.4 Inner Joins

Eine andere Schreibweise für die equi joins ist der inner join. Diese Begriffe sind gleich zu verwenden. Microsoft (mit Sybase) hat diese Syntaxform eingeführt, beherrscht aber auch noch die andere Syntax. Die meisten anderen Datenbanken verstehen aber nur die equi join Form (oder zum teil wieder Eigenentwicklungen).

 

Die allgemeine Syntax lautet:

 

SELECT Spalten FROM Tabelle1

INNER JOIN Tabelle2 ON 

  Tabelle1.Spalte = Tabelle2.Spalte

 

Beachte, das hier keine WHERE Klausel angegeben wird, um die Verknüpfung zu beschreiben.

 


4.5 Outer Joins

Bei den equi join (inner join) Abfragen sieht man, das nur Ergebniszeilen geliefert werden, die eine Entsprechung in beiden Tabellen haben.

 

Häufig ist es aber wichtig, alle Zeilen einer Tabelle zu bekommen, auch wenn keine entsprechenden Zeilen in der verknüpften Tabelle existieren. Beispielsweise möchte man eine Kunden Umsatz Tabelle haben, in der alle Kunden vorhanden sind, auch solche, mit denen man keinen Umsatz gemacht hat. Hierbei kommt man mit einem equi join nicht weiter.

 

Dieses Problem kann mit den outer joins gelöst werden. Hierbei macht man der Datenbank klar, das alle Zeilen der einen Tabelle zur Ergebnismenge gehören sollen. Die Datenbank generiert dann für die Spalten der Ergebniszeilen NULL Einträge, in denen es keine Entsprechungen gibt.

 

Welche Tabelle alle Zeilen zur Ergebnismenge hinzufügt wird über die left  oder die right outer join Befehle festgelegt.

 


4.5.1 Left Outer Join

Bei dem left outer join werden alle Zeilen der linken Tabelle der Ergebnismenge zugefügt. Links bedeutet hier die Tabelle in dem SQL Befehl, die weiter links steht, also zuerst in dem Befehl angegeben wird.

 

Beispiel.: Kunden Auftrag Tabelle

 

select

  kd.Name,

  kd.Vorname,

  au.Nummer

from

  Kunde kd

left outer join

  Auftrag au

  on

   au.Kunden_Nummer = kd.Nummer

 

Das Ergebnis enthält alle Kunden. Die entsprechende Auftragsspalte sind evtl. durch einen NULL Eintrag gefüllt. Ein Kunde kann mehrfach vorkommen, da zu einem Kunde mehr als ein Auftrag existieren kann.

 

Das left bezieht sich hier auf die Tabelle Kunde, da diese im Befehl als erstes angegeben wurde, also weiter links steht.

 

Beachte, das hier zwar das Gleichheitszeichen angegeben wird, es sich aber nicht um einen reinen equi join handelt.

 

Diese Syntax kennt nur Microsoft (Sybase). Die von anderen Datenbanken verwendete Syntax hat das o.g. Schlüsselwort nicht. Hierbei wird die equi join Syntax verwendet. Die Tabelle, die die NULL Einträge liefern soll, wird mit einem (+) hinter der Verknüpfung gekennzeichnet.

 

Allgemein lautet die Syntax:

 

SELECT Spalten FROM Tabellen

WHERE Tabelle1 = Tabelle2(+)

 

Obiges Beispiel mit dieser Syntax lautet dann

 

select

  kd.Name,

  kd.Vorname,

  au.Nummer

from

  Kunde kd,

  Auftrag au

where

  kd.Nummer = au.Kunden_Nummer(+)

 


4.5.2 Right Outer Join

Wie gesehen, fügt bei dem left outer join die linke Tabelle alle Zeilen zur Ergebnismenge bei. Soll jedoch die zweite Tabelle alle Zeilen der Ergebnismenge beifügen, so setzt man den right outer join ein. Die Syntax ist analog zu o.g. Syntax, jedoch wird die Klausel right outer join eingesetzt.

Voriges Beispiel schreibt man als right outer join folgendermaßen:

 

select

  kd.Name,

  kd.Vorname,

  au.Nummer

from

  Auftrag au

  right outer join

  Kunde kd

    on

    kd.Nummer = au.Kunden_Nummer

 

Wie man sieht, ist der right outer join die Umkehrung des left outer join (Vertauschen der Tabellenreihenfolge und Vertauschen von left/right).

 

Die analoge Syntax der restlichen – nicht Microsoft – Welt, lautet:

 

select

  kd.Name,

  kd.Vorname,

  au.Nummer

from

  Kunde kd,

  Auftrag au

where

  au.Kunden_Nummer(+) = kd.Nummer

 


4.6 Tabellen mit sich selbst verknüpfen

Durch die Vergabe von Aliasnamen können Tabellen mit sich selbst verknüpft werden. Diese Technik wird jedoch seltener eingesetzt.

 

Beispiel.: Suchen nach doppelten Einträgen in einer Tabelle

 

select

  kd.Nummer,

  kd.Name

from

  Kunde kd,

  Kunde kd2

where

        kd.Nummer = kd2.Nummer

  AND kd.Name <> kd2.Name

 



Last update:  13.07.2005