Inhaltsverzeichnis

SQL Statement JOIN

Abfrage einer Tabelle

SELECT * FROM db.tabelle;

⇒ alle Zeilen der Tabelle werden aufgelistet

WHERE-Klausel

Die Ausgabe wird durch die Bedingung der WHERE-Klausel reduziert

z.B.:

SELECT * FROM db.tabelle WHERE name=”Huber”;

⇒ Es werden alle Datensätze der Tabelle tabelle aus der Datenbank db ausgegeben, deren Werte für name gleich Huber ist.

Normalisierung einer Tabelle führt in der Regel zu mehreren Tabellen.

z.B.:

Nr. Anrede Vorname Nachname

in:

Nr. anrede_nr Vorname Nachname

und

Nr. Anrede

Verbinden von Tabellen in SQL-Statements

Kreuztabelle

z.B.:

SELECT * FROM db.kunde, db.anrede;

⇒ Jeder Datensatz der Tabelle kunde wird mit jedem Datensatz der Tabelle anrede kombiniert.

⇒ Das Ergebnis ist wenig sinnvoll, aber die Grundlage für JOIN-Abfragen.

Sinnvoll wird die Kreuztabelle durch die Anwendung der Klauseln.

WHERE-Klausel

z.B.:

SELECT * FROM kunde, anrede WHERE kunde.anr_nr = anrede.nr;

⇒ Ergebnis sind die Sätze, deren Wert in beiden Tabellen ist.

Problem: Alle Datensätze aus beiden Tabellen, die die WHERE-Bedingung nicht

Lösung: Mit JOIN-Abfragen lassen sich auch solche Datensätze finden.

SELECT * FROM kunde INNER JOIN anrede ON kunde.anr_nr = anrede.nr;

In JOIN-Anweisungen wird die WHERE-Klausel durch die ON-Klausel ersetzt.

Kreuztabelle in JOIN-Schreibweise:

SELECT * FROM kunde INNER JOIN anrede;

INNER JOIN heißt auch EQUI JOIN.

OUTER JOIN

Aufgabe: Anzeige aller Datensätze einer Tabelle und der Referenzwerte der anderen Tabelle.

z.B.: Alle Kunden mit eventuell vorhandenen Kreditkartennummern.

Ergebnis: Für Kunden, die Werte in der Kreditkartentabelle vorliegen haben, werden diese angezeigt. Sonst für Kreditkarten-Werte NULL.

SQL-Statement:

SELECT * FROM kunde LEFT OUTER JOIN kreditkarte ON kunde.kreditkarte_nr = kreditkarte.nr;
Kunde Kreditkarte
Nr Vorname Nachname Kreditkarte_nr nr gültig Konto
.. .. .. .. .. .. ..

LEFT = gibt an, dass alle Datensätze der linksstehenden Tabelle angezeigt werden sollen. RIGHT = rechte Tabelle wird vollständig angezeigt FULL = beide Tabellen werden vollständig angezeigt

JOIN

Kreuztabelle:

SELECT * FROM tabelle1, tabelle2;
SELECT * FROM tabelle1 JOIN tabelle2;

⇒ Ergebnis: Jeder Datensatz der tabelle1 wird mit jedem Datensatz der tabelle2 kombiniert.

Verwendung von mehreren Tabellen:

SELECT * FROM tabelle1, tabelle2, tabell3;

Ergebnis: Jeder Datensatz jeder Tabelle wird mit jedem Datensatz der anderen Tabellen kombiniert.

Die Abarbeitung erfolgt von links nach rechts, sofern nichts anderes angegeben.

  1. Schritt des Beispiels:
    SELECT * FROM tabelle1, tabelle2, tabelle3;
  2. Schritt: Ergebnis aus 1. wird mit jedem Datensatz der tabelle3 kombiniert. Zusatzangabe zur Änderung der Reihenfolge:
    SELECT * FROM tabelle1 JOIN (tabelle2 JOIN tabelle3);

    Ergebnis: Zunächst wird die Kreuztabelle aus tabelle2 und tabelle3 erzeugt, dann mit tabelle1 kombiniert.

LEFT und RIGHT JOIN

LEFT bzw. RIGHT JOIN gibt an, welche Tabelle komplett ausgegeben werden soll.

Beispiel: Aus einer Kundendatenbank mit einer Kunden- und einer Bestelltabelle soll eine Liste erstellt werden, die alle Kunden mit ihren zugehörigen Bestellungen enthält.

Vorüberlegung:

⇒ Verwendung einer ON-Klausel.

SQL-Abfrage:

SELECT * FROM kunde JOIN bestellung;
SELECT * FROM kunde LEFT JOIN bestellung;
SELECT * FROM kunde LEFT JOIN bestellung ON kunde.knd_nr =
bestellung.knd_nr;

Ergebnis: Liste mit allen Spalten der Tabellen kunde und bestellung (*) mit allen Datensätzen der Tabelle kunde.

Achtung!: Es können Kundendatensätze mehrfach ausgegeben werden, wenn zu einem Kunden mehrere Bestellungen existieren!

In der Regel existieren Kunden auch ohne Betellungen.

⇒ In der Liste erscheinen in den Spalten der Bestelldaten die Werte NULL.

Beispiel:

kunde bestellung
knd_nr name ort bst_nr knd_nr order
1 HuberErfurt 1 1 54233
2 MaierFürth NULL NULL NULL NULL
3 SchulzAalen 2 3 44710
4

Einschränkungen der Liste auf Kunden, die keine Bestellung haben.

Es wird ein Spaltenwert der Tabelle bestellung auf dem Wert NULL abgefragt.

SELECT * FROM kunde LEFT JOIN bestellung ON kunde.knd_nr = WHERE
bestellung.knd_nr IS NULL;