===== SQL Statement JOIN =====
Abfrage einer Tabelle
SELECT * FROM db.tabelle;
* db = gewünschte Datenbank
* tabelle = gewünschte Tabelle
* * = alle Spalten werden angezeigt
=> 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.
- **Schritt des Beispiels:** SELECT * FROM tabelle1, tabelle2, tabelle3;
- **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:__
* Alle Kunden sollen in der Liste enthalten sein.
* Nicht jeder Kunde hat eine Bestellung. -> Es gibt Datensätze, die keine Bestelldaten enthalten.
* Die Umsetzung besteht aus den Tabellen kunde und bestellung.
* Für die Liste wird ein SELECT mit JOIN verwendet. Kunde ist die fremde Tabelle.
=> 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 |Huber|Erfurt| 1| 1| 54233| ... |
| 2 |Maier|Fürth| NULL | NULL | NULL | NULL |
| 3 |Schulz|Aalen| 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;