
- SQL-Datenbanktabellen sind strukturiert - Birgit Schmidt
SQL (Structured Query Language) hat sich seit den 1980er-Jahren als Standardsprache für relationale Datenbanksysteme etabliert. Zu den bekanntesten relationalen Datenbanksystemen gehören "Oracle Database" von Oracle, "DB2" und "Informix" von IBM sowie "MySql", das vornehmlich durch die Verwendung in Open-Source-Produkten bekannt ist. Daher lohnt sich eine Beschäftigung mit diesem Thema.
Ein paar Grundlagen: Die relationale Datenbank
Ein relationales Datenbanksystem ist ein System, in der Tabellen die Grundstruktur für die Speicherung von Daten bilden. Jeder Datensatz ist gleichförmig aufgebaut, die Daten sind in Zeilen und Spalten abgelegt. Dabei entspricht eine Zeile einem Datensatz, während die Spalten die Struktur vorgeben. Das erleichtert den Zugriff auf die Daten, weil jedes Feld der Tabelle über die Angabe von Zeile und Spalte direkt angesprochen werden kann. Das ist ähnlich wie beim Spiel "Schiffe versenken" - über die Angabe der gewünschten Zeilen und der gewünschten Spalte trifft der Spieler dort genau ein Feld. Bei Datenbanktabellen sind die Bezeichnungen nur eben nicht "1" bis "9" und "a" bis "i", sondern haben Namen, die der Benutzer selbst vergibt.
Daten mittels SELECT aus Datenbanktabellen auslesen
Wie liest man aber nun solche Daten aus, die in relationalen Datenbanken abgelegt sind? Das Handwerkszeug dafür bietet uns SQL, der einfachste Abfragebefehl ist der SELECT. Wie oben gesehen, haben alle Datensätze einer Datenbanktabelle gleichen Aufbau, auch wenn die Inhalte unterschiedlich sind. Der einfachste Weg, solche Datensätze zu ermitteln, besteht im Befehl
SELECT * FROM tabelle;
"tabelle" ist dabei der Name einer Datenbanktabelle. Diesen Namen muss der Benutzer bei der Tabellenanlage festlegen. In unserm Fall könnte die Tabelle einfach "Spielfeld" heißen. Der Stern gibt an, dass wir keine weitere Einschränkung bezüglich der Spalten machen wollen. Wir bekommen dadurch also sämtliche Einträge, die in der Tabelle stehen. Würden wir Schiffe-Versenken spielen, bekämen wir so ein vollständiges Bild unserer eingetragenen Schiffe.
Man kann aber auch auf Spalten oder Zeilen einschränken. Die einfache Variante ist, nur bestimmte Spalten abzufragen. Dazu gibt man einfach den Namen der Spalte an.
SELECT a FROM spielfeld;
würde in unserm Fall die erste Spalte des Schiffe-Versenken Spielfeldes zurückliefern, aber alle neun Zeilen. Die Einschränkung auf die Zeilen erfolgt dagegen über die sogenannte "WHERE"-Bedingung am Ende des Befehls:
SELECT * FROM spielfeld
WHERE zeile = 1;
Dies würde alle Einträge der ersten Zeile zurückliefern.
Kombiniert man diese beiden Befehle, erhält man das, was bei Schiffe-Versenken üblicherweise abgefragt wird:
SELECT a FROM spielfeld
WHERE zeile = 1;
liefert das erste Feld links oben in der Ecke.
Mehrere Spalten oder mehrere Zeilen bekommt man, wenn man den Befehl erweitert. Bei Spalten ist das wiederum ganz einfach, bei Zeilen ist etwas mehr Schreibarbeit erforderlich. Hier muss über eine Oder-Verknüpfung explizit angeben werden, welche Zeilen man möchte:
SELECT c, d, e FROM spielfeld
WHERE zeile = 3
OR zeile = 4
OR zeile = 5;
liefert die Felder c3 bis e3, d4 bis e4 und d5 bis e5.
Relationale Datenbanken – woher der Name kommt
Durch die Ablage in Tabellen kann der Benutzer die Daten nicht nur strukturiert speichern, er kann sie auch in "Relation" zueinander setzen. Das bedeutet nichts anderes, als dass er Beziehungen zwischen zwei Tabellen herstellen kann. Um zum Beispiel des Schiffe-Versenkens zurückzukommen: Wenn es ein zweites Spielfeld gäbe, das in den Zeilen ebenfalls von "1" bis "9" durchnummeriert ist, zur besseren Unterscheidung aber in den Spalten die Kennzeichnung "j" bis "r" hat, dann könnte man dreidimensionales Schiffeversenken spielen. Die Spieler müssten sich dann nur vorstellen, dass die beiden Spielfelder übereinander liegen und könnten ihre Schiffe entsprechend dreidimensional eintragen. Ein Schiff wäre dann natürlich erst dann versenkt, wenn es sowohl in der einen Ebene wie auch in der anderen Ebene vollständig getroffen wäre. Zwischen den beiden Ebenen besteht dann eine Relation - sie können zusammen betrachtet werden, obwohl sie unterschiedliche Bezeichnungen und Einträge haben. Man sagt dann auch, die Tabellen sind "verknüpft", in unserm Fall über die Zeilennummern.
Wäre das zweite Spielfeld kleiner, hätte es also beispielsweise nur fünf Spalten statt neun, so würde diese Relation immer noch bestehen. Die Spieler müssten dann eben nur wissen, dass in den letzten vier Spalten keine dreidimensionalen Schiffe liegen können. Für relationale Datenbanken heißt das: Die verschiedenen Tabellen müssen nicht die gleiche Struktur haben, man muss nur die Beziehung kennen, die sie miteinander verbindet.
Daten mittels JOIN aus verknüpften Datenbanktabellen auslesen
Die einfachste Art, zwei miteinander in Relation stehende Tabellen auszulesen, ist der INNER JOIN.
SELECT * FROM spielfeld1 INNER JOIN spielfeld2
ON spielfeld1.zeile = spielfeld2.zeile;
Hier wird in der ON-Bedingung angegeben, über welche Bedingung die Tabellen miteinander verknüpft werden. In unserm Fall ist es die Zeilennummer. Weil unsere beiden Spielfelder die gleichen Zeilennummern haben, bekämen wir bei unserem Schiffe-Versenken-Beispiel also die gewohnten neun Zeilen zurück und alle Spalten, die in den beiden Spielfeldern vorhanden sind. Das sind die Spalten "a" bis "r."
Damit haben wir alle Kenntnisse zusammen, um auf einen Schlag abfragen zu können, ob wir zwei übereinanderliegende Felder unseres dreidimensionalen Schiffes getroffen haben. Für die übereinanderliegenden Spalten "c" und "n" und Zeile 5 wäre das beispielsweise
SELECT c, n FROM spielfeld1 INNER JOIN spielfeld2
ON spielfeld1.zeile = spielfeld2.zeile
WHERE spielfeld2.zeile = 5;
In der WHERE-Bedingung reicht es, nur die Zeilennummer für Spielfeld1 anzugeben. Durch die ON-Bedingung gilt der Wert automatisch für die Zeilen von Spielfeld2 mit.
Über JOINS können auch mehrere Tabellen verknüpft werden, außerdem gibt es neben dem hier beschriebenen INNER JOIN auch andere Formen. Dafür sei aber auf andere Stellen verwiesen. Zu SQL gibt es mittlerweile gute und kostenlose Tutorials, beispielsweise das interaktive SQL-Tutorial von Jürgen Auer oder die SQL-Seiten von Torsten Horn.
