===== 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;