Lern-Fabrik

Einführung in SQL - Datenbankabfragen

Schlüssel und Indizes

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:

Artikel

ArtikelNr Bezeichnung Preis
0010 Kaffeebecher 5
0020 T-Shirt 20
0030 Mütze 10
0040 Sweatshirt 45

Kunden

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

Bestellung

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.

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:

SELECT BestNr, ArtikelNr, Menge

FROM Bestellung, Kunden

WHERE Bestellung.KundenNr = Kunden.KundenNr AND Nachname = ’Meier’;

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:

SELECT DISTINCT Kunden.KundenNr, Nachname, Vorname

FROM Bestellung, Kunden

WHERE Bestellung.KundenNr = Kunden.KundenNr ORDER BY Nachname, Vorname;

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...