Verknüpfte Tabellen

Abbilden von Beziehung zwischen Entitäten

Primärschlüssel

In einer Datenbank muss jeder Datensatz eindeutig identifizierbar sein. Ein Attribut, anhand dessen man einen Datensatz finden kann, wird in der Datenbanksprache Primärschlüssel genannt. Eine Tabelle darf nie zwei oder mehr Datensätze enthalten, die den gleichen Primärschlüssel haben. Glücklicherweise überwachen Datenbanksysteme automatisch, dass so etwas nicht auftritt – sofern man es ihnen sagt. Wenn man ein oder mehrere Attribute als Primärschlüssel definiert, gibt das Datenbanksystem einen Fehler zurück, sobald man versucht, einen Datensatz einzufügen oder zu verändern, so dass die Eindeutigkeit verletzt würde.

In einer Datenbank bietet es sich häufig an, eine fortlaufende Nummer zu vergeben, die nur innerhalb der Datenbank eine Bedeutung hat (künstlicher Schlüssel oder Surrogatschlüssel). Die Option „auto_increment“ (siehe Bild 5) sorgt dafür, dass ein neu hinzugefügter Datensatz automatisch die nächste mögliche Nummer bekommt, wenn man keinen Wert für den Primärschlüssel einträgt.

Fremdschlüssel

Um eine 1:N-Beziehung zwischen zwei Tabellen in einer Datenbank zu modellieren, wird die Tabelle auf der „N-Seite“ der Beziehung (in unserem Beispiel die Schüler) um eine Spalte erweitert, in die man den Primärschlüssel des Objekts einträgt, zu dem die Beziehung besteht (im Beispiel die Nummer des Klassenlehrers). Wenn der Primärschlüssel einer Tabelle in einer anderen Tabelle verwendet wird, so ist dies ein sogenannter Fremdschlüssel. Es ist natürlich einfacher, wenn man die Beziehung auf der Seite speichert, wo mehrere Entitäten möglich sind. Jeder Schüler muss sich nur eine Information merken, was einfacher zu verwalten ist, als wenn jeder Lehrer sich alle seine Schüler merken müsste.

Zusammenführen der Datensätze

Um Daten aus beiden Tabellen zu erhalten, verwendet man diese SQL-Abfrage:

SELECT * FROM Schueler, Lehrer

Diese Abfrage liefert allerdings jede mögliche Kombination der Datensätze aus der Tabelle „Schueler“ mit denen der Tabelle „Lehrer“.

Es gehören aber nur die zusammen, bei denen das Attribut „KLNr“ der Schüler mit dem Attribut „LNr“ der Lehrer übereinstimmt. Wir schränken daher das Ergebnis ein:

SELECT * FROM Schueler, Lehrer WHERE KLNr = LNr

Diese Abfrage liefert nur noch die Datensätze, die zusammenpassen. Jetzt könnte man einerseits die Spalten des Ergebnisses noch einschränken: SELECT SVorname, SNachname, LDienstbez, LNachname FROM Schueler, Lehrer WHERE KLNr = LNr Zudem könnte man die Anzahl der zurückgegebenen Datensätze noch einschränken: SELECT SVorname, SNachname, LDienstbez, LNachname FROM Schueler, Lehrer WHERE KLNr = LNr AND SKlasse >= 9 Damit werden nur die Daten der Schüler, die in Klasse 9 oder höher sind, zurückgegeben. Übrigens: Es kann durchaus vorkommen, dass ein Spaltenname in zwei verschiedenen Tabellen vorkommt. Bei einer Abfrage, die diese beiden Tabellen verknüpft, ist dann nicht mehr klar, welche Spalte gemeint ist. In solchen Fällen kann man den Tabellennamen und einen Punkt vor den Spaltennamen setzen, um klarzumachen, welche Spalten gemeint sind: SELECT Schueler.SVorname, Schueler.SNachname, Lehrer.LNachname FROM Schueler, Lehrer WHERE Schueler.KLNr = Lehrer.LNr AND Schueler.SKlasse >= 9 Seite 10/15