Abfrage einer Tabelle
SELECT * FROM db.tabelle;
⇒ alle Zeilen der Tabelle werden aufgelistet
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 | … |
---|---|---|
… | … | … |
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.
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.
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
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.
SELECT * FROM tabelle1, tabelle2, tabelle3;
SELECT * FROM tabelle1 JOIN (tabelle2 JOIN tabelle3);
Ergebnis: Zunächst wird die Kreuztabelle aus tabelle2 und tabelle3 erzeugt, dann mit tabelle1 kombiniert.
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 | 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;