Damit man diesselben Daten nicht mehrmals in unterschiedlichen Tabellen speichern muss, werden sie indiziert. Dazu bekommt ein Datensatz in einer Tabelle einen Primärschlüssel (primary key). Dieser besteht aus einer oder mehreren Spalten. Auf jeden Fall muss der Primärschlüssel eines Datensatzes in dieser Tabelle eindeutig sein, es darf keinen anderen Datensatz mit demselben Schlüssel geben. Man spricht von einem Fremdschlüssel (foreign key) bei einer Tabellenspalte, die in einer anderen Tabelle ein Primärschlüssel ist. Das heisst, die beiden Tabellen haben miteinander zu tun, ihre Datensätze sind untereinander verknüpft. Folgende Tabellen dienen als Beispiele:
ArtikelNr | Bezeichnung | Preis |
---|---|---|
0010 | Kaffeebecher | 5 |
0020 | T-Shirt | 20 |
0030 | Mütze | 10 |
0040 | Sweatshirt | 45 |
KundenNr | Nachname | Vorname | Strasse | Stadt |
---|---|---|---|---|
99100 | Meier | Richard | Hauptstr. 1 | 70000 Stuttgart |
43689 | Banner | Werner | Moosweg 5 | 12334 Aachen |
32074 | Zeller | Stefanie | Zollstr. 41 | 09137 Grenzdorf |
77077 | Schwarz | Eugen | Bahnhofstr. 13 | 83990 Fulda |
BestNr | KundenNr | ArtikelNr | Menge |
---|---|---|---|
1234 | 99100 | 0020 | 5 |
3645 | 43689 | 0010 | 16 |
1234 | 99100 | 0040 | 2 |
9834 | 32074 | 0030 | 9+ |
In diesem Beispiel hat eine "Bestellung" zwei Fremdschlüssel: zum einen einen Käufer über die "KundenNr", zum anderen einen Artikel über die "ArtikelNr". Wichtig ist, dass in dieser Tabelle kein Primärschlüssel vorhanden ist. Die Bestellnummer kommt doppelt vor, wie man sieht. Mit diesen Tabellen werden wir nun kompliziertere Abfragen durchführen: Joins.
Es gibt zwei Voraussetzungen, um miteinander in Verbindung stehende Tabellen optimal einzusetzen:
Redundanzfreiheit: Dieselben Daten dürfen nicht doppelt in unterschiedlichen Tabellen gespeichert werden. Es wäre beispielweise überflüssig, in der Tabelle "Bestellung" die Daten des Kunden zu speichern, da diese bereits in der Tabelle "Kunden" erfasst wurden.
Schlüssel: Woher weiss ich, welcher Kunde zu welcher Bestellung gehört? Seine "KundenNr", die in der Tabelle "Kunden" der Primärschlüssel ist, wird in der Bestellung als Fremdschlüssel gespeichert, und dadurch weiss ich, welcher Kunde welche Bestellung aufgegeben hat. Und damit ins Geschehen: wir wollen alle Bestellung sehen, die Herr Meier aufgegeben hat:
Zu beachten ist in der WHERE-Klausel die Notation TabellenName.Spaltenname. Dadurch werden die Spalten aus den beiden Tabellen nicht verwechselt. Das Ergebnis sieht so aus:
BestNr | ArtikelNr | Menge |
---|---|---|
1234 | 0020 | 5 |
1234 | 0040 | 2 |
Es gibt Kunden, die noch keine Bestellung aufgegeben haben. Die aber, die schon einmal etwas bestellt haben, sollen einen Bonus bekommen. Dazu wollen wir herausfinden, wer das ist:
Normalerweise würde Herr Meier im Ergebnis zweimal auftauchen, da er ja zwei Bestellung aufgegeben hat. Mit dem Schlüsselwort DISTINCT wird das aber vermieden, er taucht nur einmal auf. DISTINCT filtert also Duplikate unter den angeforderten Datensätzen heraus. Um noch eins draufzusetzen, haben wir das Ergebnis nach Nachnamen und Vornamen sortieren lassen, und zwar durch ORDER BY. Das Ergebnis dieser Anfrage sieht so aus
KundenNr | Nachname | Vorname |
---|---|---|
43689 | Banner | Werner |
99100 | Meier | Richard |
32074 | Zeller | Stefanie |
Dies also eine kleine Einführung in die Joins, damit kommt man schon mal ein Stück weit. Natürlich geht’s aber noch weitaus komplexer...