Wer hat noch nie eine Adresse oder eine Telefonnummer dringend gesucht, die man doch irgendwo aufgeschrieben hatte? Im gro�n Zettelchaos ist diese jedoch nicht mehr zu finden. Und wenn man sich die Mhe macht, alles fein s�berlich aufzuschreiben, werden die Daten doch meist zu viele, um den �erblick zu behalten. Wem es so schon mal gegangen ist, m�hte es sich sicherlich leichter machen und dies geht doch am Besten mit einer Datenbank.
Eine Datenbank zu administrieren ist mit einigen Grundkenntnissen ber den Aufbau der Datenbank und dessen Datenbankmodell sowie der richtigen Sprache gar nicht so schwer. In diesem Artikel wollen wir Ihnen einige Grundkenntnisse vermitteln und die grundlegenden Befehle der Datenbanksprache SQL (Structured Query Language) vorstellen.
Welches Modell ist das richtige fr mich?
Die zuerst entwickelten Datenbankmodelle sind das hierarchische und das netzwerkartige Modell. In einer hierarchischen Datenbank werden die Daten in einer Baumstruktur abgelegt, wobei oftmals Daten redundant vorkommen mssen, um alle n�igen Datenbeziehungen aufbauen zu k�nen. Dieses Datenbankmodell ist mittlerweile nicht mehr stark verbreitet. Das netzwerkartige Datenbankmodell wird haupts�hlich auf Gro�echnern eingesetzt und verwendet eine eigene Datenbanksprache. Beide Modelle wurden im Laufe der Zeit von dem relationalen Datenbankmodell abgel�t. Dieses basiert auf dem mathematischen Konzept der Relation und ist heute weit verbreitet. Es gibt eine gro� Auswahl von relationalen Datenbanksystem, sowohl im kommerziellen, als auch im Open Source Bereich. Neuere Modelle basieren auf objekt-relationalen oder objektorientierten Konzepten. Diese sind vor allem als Open Source Projekte zu haben und etablieren sich langsam im Bereich der eingebundenen Datenbank wie in Internetapplikationen. Wir beziehen uns hier auf das weit verbreitete relationale Datenbankmodell.
Was ist eine Datenbank eigentlich?
Eine Datenbank ist streng genommen eine spezielle Anordnung von Daten. Sie besteht aus Tabellen, die im relationalen Datenbankmodell als Relation bezeichnet werden. Jede Relation muss einen eindeutigen Namen erhalten, um darauf jederzeit zugreifen zu k�nen und enth�t Datens�ze, die den Tabellenzeilen entsprechen. Eine Spalte wird als Attribut bezeichnet, tr�t einen Namen und besitzt einen Wertebereich oder Datentyp. Die Werte in einer Spalte nennt man Attributwerte. Den Aufbau veranschaulicht Abbildung 1. Es k�nen ein oder mehrere Attribute zu einem Prim�schlssel deklariert werden, welcher eindeutig sein muss und ber diesen einzelne Datens�ze eindeutig gefunden werden k�nen.
Eine Datenbank besteht technisch gesehen aus drei Ebenen und basiert auf der Drei-Schichten-Architektur. Die interne Ebene beschreibt die physikalische Datenorganisation, also wie und wo die Daten gespeichert werden. Die darber liegende konzeptionelle Ebene besch�tigt sich damit, welche Daten gespeichert werden und wie diese Daten untereinander in Beziehung stehen. Die externe Ebene stellt bestimmte Sichten der Daten zur Verfgung, auf die der Benutzer zugreifen kann.
Mit verschiedenen Datenbanksprachen kann man auf die unterschiedlichen Ebenen der Datenbank zugreifen. Um auf die interne Ebene zugreifen zu k�nen, ben�igt man eine Storage Definition Language (SDL), mit deren Hilfe man die Speicherung der Daten beeinflussen kann. Meist besteht hierzu jedoch kein Anlass, da die Hersteller bekannter Datenbankmanagementsysteme dies fr den Benutzer bereits erledigt haben. Fr die Definition von Daten verwendet man eine Data Definition Language (DDL) und zur Manipulation der Daten eine Data Manipulation Language (DML). Diese beiden Sprachen sowie die View Definition Language (VDL), zur Erzeugung und Beeinflussung der Sichten, sind die Sprachen, die von gr�erer Bedeutung fr einen Datenbank-Administrator sind. Die Structured Query Language (SQL) vereinigt diese drei Spracharten in sich.
Tabellen anlegen
Bevor man eine Datenbank realisiert, sollte man sich Gedanken ber den Aufbau der Datenbank machen, welche Tabellen man ben�igt, wo welche Daten abgelegt werden und wie die Beziehungen zwischen den Daten aussehen. Eine empfehlenswerte Methode um eine Datenbank zu entwerfen ist die Methode der Normalisierung. Durch diese wird gew�rleistet, dass keine Redundanzen entstehen und die Datenbank einfacher zu warten ist. Informationen ber diese Technik findet sich zum Beispiel im Internet [1]. Hat man den Aufbau skizziert, kann man beginnen ihn umzusetzen. Um eine Tabelle anzulegen, muss man sich zun�hst darber klar werden, welchen Datentyp jede Spalte erhalten soll. Eine �ersicht gibt die Tabelle “Wichtige Datentypen”.
Wichtige Datentypen
| Datentyp | Erl�terung | ||
|---|---|---|---|
| Int | Ganze Zahlen | ||
| numeric(p,q) | Dezimalzahlen mit genau p Stellen, q Stellen hinter dem Komma | ||
| decimal(p,q) | Dezimalzahlen mit mindestens p Stellen, q Stellen hinter dem Komma | ||
| char(n) | Zeichenkette mit genau n Zeichen | ||
| varchar(n) | Zeichenkette mit maximal n Zeichen | ||
| Boolean | Wahrheitswerte true, false oder unknown | ||
| date | Datum | ||
| Timestamp(p) | Datum und Uhrzeit, p ist die Anzahl der Nachkommastellen der Sekunden |
Ein SQL Befehl wird mit Hilfe von Schlsselw�tern konstruiert und sollte mit einem Semikolon abgeschlossen werden. Die Schlsselw�ter k�nen hierbei gro�oder klein geschrieben werden, da in SQL die Gro� und Kleinschreibung nicht beachtet wird. Der Abschluss mit einem Semikolon ist nicht vorgeschrieben, gilt aber als guter Stil. Um nun eine Tabelle zu erstellen, verwendet man die create table-Anweisung. Beispielhaft legen wir eine Tabelle an, die Namen, Telefonnummern und das Geburtsjahr einer Person aufnehmen sollen. Der hierzu ben�igte Befehl sieht so aus:
create table Person ( Vorname varchar(20), Name varchar(20), TelNr int , GebJahr int);
Bei den W�tern create table handelt es sich um die Schlsselw�ter zum Erstellen einer Tabelle. Person ist der Tabellenname, dem eine Liste von Spaltendefinitionen, eingefasst in runden Klammern, folgen. Jede Spalte wird durch ihren Namen und eine Typangabe definiert. Die Anweisung ist durch das Semikolon abgeschlossen. Weiterhin ist es m�lich jede Spaltendefinition mit Standardwerten zu versehen und eine Eingabe fr diese Spalte in jedem Datensatz mit den Schlsselw�tern not null zu erzwingen. Standardwerte werden mit dem Schlsselwort default angegeben. Erweitern wir unseren Befehl um diese beiden Eigenschaften, dann lautet er:
create table Person ( Vorname varchar(20) not null, Name varchar(20) not null, TelNr int default 123456, GebJahr int );
Um einen Prim�schlssel beim Erstellen einer Tabelle zu definieren kann an die Spaltendefinition die Schlsselw�ter primary key angehangen werden. M�hte man zwei oder mehr Spalten zusammen zu einem Prim�schlssel deklarieren, so kann man nach den Spaltendefinitionen eine primary key Klausel anh�gen. Wenn wir den Vor- und Nachnamen zusammen zu einem Prim�schlssel definieren wollen, �dert sich unser Befehl so:
create table Person ( Vorname varchar(20) not null, Name varchar(20) not null, TelNr int default 123456, GebJahr int, primary key( Vorname, Name );
Bieten sich keine Spalte oder eine Spaltenkombination als Prim�schlssel an, da sie die Eindeutigkeit nicht sicherstellen, ist es sinnvoll einen knstlichen Schlssel zu verwenden. Dieser knstliche Schlssel ist eine Zahl, die fr jeden Datensatz um Eins erh�t werden. Nach dieser Vorgehensweise kann man nun mehrere Tabellen, falls ben�igt anlegen, und gegebenenfalls miteinander verknpfen. Um eine Verknpfung zu erstellen, verwendet man einen so genannten Fremdschlssel. Fremdschlssel sind Attribute, die auf den Prim�schlssel einer anderen Tabelle hinweisen. �er diesen Fremdschlssel, kann dann auf den gesamten Inhalt der anderen Tabelle zugegriffen werden. Ein Fremdschlssel wird mit den Schlsselw�tern foreign key angelegt. Nimmt man beispielhaft an, dass es in der Datenbank noch eine Tabelle Anschrift gibt, die als Prim�schlssel einen knstlichen Prim�schlssel namens ID mit dem Datentyp int verwendet, so kann man die Tabellen wie folgt verbinden:
create table Person ( Vorname varchar(20) not null, Name varchar(20) not null, TelNr int default 123456, GebJahr int, AnschriftID int , primary key( Vorname, Name ), foreign key (AnschriftID) references Anschrift (ID);
Es wurde in der Tabelle Person fr den Fremdschlssel eine Spalte AnschriftID mit dem Datentyp int angelegt und diese Spalte in der foreign key Klausel mit dem Prim�schlssel der Tabelle Anschrift verbunden. Die foreign key Klausel besteht aus den Schlsselw�tern foreign key gefolgt von der in runden Klammern stehenden Spalte, die verbunden werden soll, und dem Schlsselwort references. Nach diesem folgt dann der Tabellenname, auf die verwiesen werden soll und in runden Klammern stehend der Prim�schlssel der Tabelle. In den weiteren Beispielen lassen wir diese Fremdschlsselspalte au�n vor, da dies der �ersichtlichkeit der Beispiele dient.
Datens�ze in die Tabellen einfgen
Die gerade erstellte Tabelle ist noch ziemlich leer. Um Daten in die Tabelle zu schreiben, verwendet man die insert into-Anweisung. Mit dieser Anweisung wird eine Zeile mit Daten in die Datenbank geschrieben. An einem Beispiel sehen wir wie dies geht:
insert into Person values ("Tux", "Pinguin", 654321, 1996);
Nach den Schlsselw�tern insert into folgt der Tabellenname, in die die Daten eingefgt werden sollen, gefolgt von dem Schlsselwort values und einer Liste mit den einzufgenden Werten. Die Zuordung der Werte zu den Spalten erfolgt anhand der Reihenfolge in der create table-Anweisung. M�hte man nur bestimmten Spalten Werte zuweisen, so muss man diese zun�hst explizit angeben, indem man zwischen dem Tabellennamen und dem Schlsselwort values eine Liste der Spaltennamen durch Kommata getrennt in runden Klammern angibt. Fr jede Spalte, die mit not null deklariert wurde und kein Standardwert angegeben wurde, muss auf jeden Fall ein Wert bereit gestellt werden. Spalten die einen Standardwert haben, werden automatisch mit diesem Wert belegt, wenn kein Wert bei der insert into-Anweisung angegeben wird. Das Beispiel k�nte dann folgenderma�n aussehen:
insert into Person (Vorname, Name) values ("Tux", "Pinguin");
Nach diesem Schema k�nen jetzt jede Menge Datens�ze eingepflegt werden.
Datens�ze ausw�len und anzeigen lassen
Der Vorteil einer Datenbank wird besonders deutlich, wenn man eine komplexe Datenbank mit vielen Datens�zen hat. Denn aus dieser Menge von Daten die richtigen Datens�ze auszuw�len und anzeigen zu lassen, geht sehr einfach mit einer select-Anweisung. Die select-Anweisung kann sehr komplex sein, aber zun�hst schauen wir uns die einfachsten Verwendungen an. Um alle Datens�ze mit allen Spalten einer Tabelle auszuw�len verwendet man die select-Anweisung wie folgt:
select * from Person;
Dem Schlsselwort select folgt ein *, das besagt, dass alle Spalten selektiert werden sollen. Anschlie�nd steht das Schlsselwort from und der Tabellenname aus der die Daten ausgelesen werden sollen. Um einzelne Spalten zu selektieren, zum Beispiel nur die Telefonnummern, werden die Spaltennamen zwischen den beiden Schlsselw�tern angegeben. Dies sieht dann so aus:
select TelNr from Person;
Bei mehreren Spalten werden die Spaltennamen durch Kommata getrennt angegeben. Oft werden in Datenbanken als Spaltennamen Abkrzungen verwendet wie in diesem Fall bei der Telefonnummer. Da dies bei der Ausgabe aber nicht immer erwnscht ist, kann man in der select-Anweisung einen Namen fr die �erschrift vergeben, der bei der Ausgabe anstelle der Abkrzung verwendet wird. Dies wird mit dem Schlsselwort as erreicht und stellt sich wie folgt dar:
select TelNr as Telefonnummer from Person;
Nun m�hte man sicherlich nicht immer alle Datens�ze ausgeben, sondern m�hte nur ausgew�lte Zeilen selektieren. Hierzu wird die select-Anweisung mit einer where Klausel erweitert. In dieser Klausel wird eine Bedingung angegeben, die die Auswahl der Datens�ze beschr�kt. Dort kann man zum Beispiel angeben, dass man nur Personen anzeigen m�hte, die mit Vornamen Tux hei�n oder dessen Telefonnummer 654321 lautet. Die Syntax fr die where Klausel ist eigentlich ganz einfach. An einem Beispiel wollen wir das n�er verdeutlichen:
select Vorname, Name from Person where TelNr = 654321;
�erprft wird hierbei, ob die Telefonnummer 654321 lautet und nur dann wird der Vor- und Nachname ausgegeben. Weiterhin gibt es noch eine Reihe von anderen Operatoren, die in der where Klausel verwendet werden k�nen, wie zum Beispiel ungleich (<>), gr�er (>), kleiner (<), gr�er gleich (>=) und kleiner gleich (<=). Bei diesen Operatoren handelt es sich um Vergleichsoperatoren. Es gibt allerdings auch noch logische Operatoren mit denen Vergleiche wie im obigen Beispiel miteinander verknpft werden k�nen. Die wichtigsten logischen Operatoren sind and und or. Bei and mssen beide Vergleiche wahr sein, um ein Ergebnis zu bekommen und bei or mindestens einer von beiden Vergleichen. Ein Beispiel ist die Selektion aller Datens�ze bei denen der Vorname Tux und der Nachname Pinguin lautet. Davon kann man sich zum Beispiel die Telefonnummer ausgeben lassen.
select TelNr from Person where (Vorname = "Tux") and (Name = "Pinguin");
Mit drei Schlsselworten l�st sich die where Klausel noch komfortabler nutzen. Mit between, in und like k�nen verschiedene Regeln erzeugt werden, die sich sonst nur ziemlich umst�dlich realisieren lassen wrden. Bei der Verwendung von between kann man berprfen, ob ein Wert oder ein Datum zwischen zwei angegebenen Werten oder Daten liegt. Die beiden Werte werden durch ein and getrennt angegeben. Die Verwendung von in erlaubt eine �erprfung, ob ein Wert in einer vorgegebenen Liste von Werten vorkommt. Diese Liste kann in runden Klammern eingefasst und durch Kommata getrennt direkt nach dem Schlsselwort in angegeben werden. Das Schlsselwort like erm�licht den Vergleich mit einem Muster. Dies ist zum Beispiel ntzlich, wenn man nur den Anfang einer Telefonnummer oder Bruchstcke eines Namens kennt, aber trotzdem herausfinden m�hte, um welche Person es sich handeln k�nte. Hierzu wird ein Muster erstellt, in dem man den bekannten Teil mit den Operatoren % und _ kombiniert. Der Operator % ist ein Platzhalter fr kein, ein oder beliebig viele Zeichen, wo hingegen der Operator _ genau ein Zeichen freih�t. Hierzu ein Beispiel:
select Name, Vorname from Person where TelNr like 65%2_;
Dies wrde den Namen und den Vornamen aller Personen anzeigen, die eine Telefonnummer besitzt, die mit 65 beginnt und dann keine, eine oder beliebig viele weitere Ziffern beinhaltet. Danach muss auf jeden Fall noch die Ziffer 2 und genau eine weitere beliebige Ziffer folgen.
M�hte man das Ergebnis einer select-Anweisung sortiert ausgegeben bekommen, so kann man diese sortieren lassen. Dazu fgt man an das Ende der select-Anweisung eine order by Klausel. Nach den Schlsselw�tern order by kann man die Spalten angeben, nach denen sortiert werden soll. Standardm�ig werden alle Spalten aufsteigend sortiert. M�hte man diese allerdings absteigend sortieren, so muss dies nach dem Spaltennamen durch desc angegeben werden. Ein Beispiel hierzu:
select Name, Vorname from Person where TelNr like 654% order by Name, Vorname desc;
Hier wird also zun�hst aufsteigend nach dem Namen sortiert und dann noch einmal absteigend nach dem Vornamen.
In der Tabelle Person befindet sich die Spalte GebJahr, die das Geburtsjahr der Person enth�t. Nun m�hte man vielleicht von einer Person wissen, wie alt sie im Jahr 2000 war und dies nicht selber berechnen mssen, so kann man sich mit einer virtuellen Spalte behelfen. Man l�st sich dabei das Alter ausrechnen und die Ergebnisse ausgeben, auch wenn es keine Spalte Alter in der Tabelle gibt. Diese select-Anweisung sieht dann wie folgt aus:
select Name, Vorname, (2000 - GebJahr) as Alter from Person;
M�hten wir den Namen und den Vornamen nicht in einzelnen Spalten sehen, sondern durch ein Komma getrennt in einer Spalte, so kann man sich auch einer virtuellen Spalte bedienen. Um so eine Formatierung zu erreichen, verwendet man den Konkatenationsoperator ||. Dadurch lassen sich Zeichenketten aneinander h�gen. Die Anweisung stellt sich wie folgt dar:
select Name || ', ' || Vorname as Gesamtname from Person;
SQL bietet eine Reihe von Funktionen, die in select-Anweisungen verwendet werden und sehr ntzlich sein k�nen. Die Funktion count kann benutzt werden, um die Anzahl der Zeilen, von Werten oder von verschiedenen Werten zu bestimmen. Um die Anzahl aller Zeilen zu ermitteln, verwendet man count(*). Sonst gibt man einen Spaltennamen explizit in den Klammern an. Schreibt man vor den Spaltennamen noch das Schlsselwort distinct, so wird nur die Anzahl von verschiedenen Werten gebildet ohne doppelt vorkommende Werte zu bercksichtigen. Die Funktion sum bildet die Summe der Werte der angegeben Spalte, avg ermittelt den Durchschnitt der Werte, min gibt das Minimum der Werte zurck und max das Maximum. Verwendet man jedoch so eine Funktion, drfen in der select-Anweisung keine einfachen Spalten mehr verwendet werden. Eine Ausnahme sind einfache Spalten, die in der group by Klausel verwendet wurden.
Die group by Klausel wird zum Gruppieren von Zeilen anhand gleicher Werte in einer bestimmten Spalte verwendet. Beispielhaft k�nte man sich die �teste Personen mit den gleichen Hinternamen ausgeben lassen. Die Anweisung verwendet eine Funktion und die group by Klausel und sieht wie folgt aus:
select min(GebJahr), Name from Person group by Name;
Datens�ze �dern
Wenn sich zu einem sp�eren Zeitpunkt Daten einer Person �dern, so kann man den Datensatz entweder l�chen und neuanlegen oder aktualisieren. Um einen Datensatz zu aktualisieren, was sich anbietet, da dies weniger aufw�dig ist, verwendet man den update Befehl. Dabei kann man eine oder mehrere Spalten eines Datensatzes ver�dern. Um gezielt Datens�ze ausw�len zu k�nen, die aktualisiert werden sollen, wird die update-Anweisung mit der where Klausel zusammen verwendet. Wird die where Klausel weggelassen, so werden alle Datens�ze aktualisiert. Beispielhaft wollen wir die Telefonnummer von der Person Tux Pinguin aktualisieren:
update Person set TelNr = 246813 where (Name = "Pinguin") and (Vorname = "Tux");
Nach dem Schlsselwort update wird der Tabellenname angegeben, in der die Aktualisierung erfolgen soll. Anschlie�nd folgt ein neues Schlsselwort set, gefolgt von dem Spaltennamen und der Zuweisung des neuen Wertes. Zum Schluss folgt die where Klausel. M�hte man mehrere Spalten aktualisieren, so werden die Spaltennamen zusammen mit den Zuweisungen durch Kommata getrennt als Liste angegeben.
M�hte man doch einen Datensatz l�chen, kann man die delete-Anweisung verwenden, um dies zu tun. Auch die delete-Anweisung wird mit der where Klausel zusammen angewendet, um Spalten explizit auszuw�len. L�st man hier die where Klausel entfallen, so l�cht man den kompletten Tabelleninhalt, aber nicht die Tabelle selber. Die Struktur der Tabelle bleibt erhalten. An einem Beispiel wird die Anweisung sehr schnell verst�dlich:
delete from Person where TelNr = 246813;
Tabellenstrukturen �dern und erweitern
Um Tabellenstrukturen zu �dern oder zu erweitern gibt es den Befehl alter table. So muss nicht bei einer Erg�zung der Tabelle oder bei dem Entfernen einer nicht mehr ben�igten Spalte, die Tabelle extra gel�cht und dann neu erzeugt werden. Um eine Spalte einer Tabelle hinzuzufgen, gibt man nach den Schlsselw�tern alter table und dem Tabellennamen die Schlsselw�ter add column an. Add column steht fr Spalte hinzufgen. Anschlie�nd folgt eine Liste mit den Spaltendefinitionen fr die neuen Spalten. Diese Spaltendefinitionen entsprechen den Definitionen wie sie in der create table-Anweisung verwendet werden. Beispielhaft soll eine Spalte Wohnort in die Tabelle Person eingefgt werden.
alter table Person add column Wohnort varchar(20) default null;
Um den Standardwert fr die gerade eingefgte Spalte zu l�chen, kann man die Schlsselw�ter alter column in der alter table-Anweisung verwenden. Der Befehl hierfr sieht wie folgt aus:
alter table Person alter column Wohnort drop default;
Einen neuen Standardwert kann man durch die Verwendung der Schlsselw�ter set default setzen. Dies erscheint so:
alter table Person alter column Wohnort set default "Linux";
Um eine ganze Spalte aus einer Tabelle zu entfernen, verwendet man die Schlsselw�ter drop column in der alter table-Anweisung. Nach den Schlsselw�tern muss nur noch der Spaltenname angegeben werden. Zum Beispiel:
alter table Person drop column GebJahr;
Tabellen l�chen
Um eine Tabelle, die nicht mehr ben�igt wird aus einer Datenbank zu l�chen, gibt es den drop table Befehl. Hierbei wird die komplette Tabellenstruktur und der gesamte Inhalt gel�cht. L�cht man die Tabelle Person, so sieht der Befehl wie folgt aus:
drop table Person;
Nun ist die Datenbank wieder leer. Doch eine grobe �ersicht ber die grundlegenden M�lichkeiten mit SQL sollte entstanden sein. Ein Artikel dieses Umfangs kann natrlich nur an der Oberfl�he des mit SQL machbaren kratzen. Zu Bemerken w�e, dass dem eigentlichen Datenbankentwurf, also bevor SQL berhaupt verwendet wird, in der Praxis ein besonders hoher Stellenwert zukommt und eine Datenbank daher wohl durchdacht werden sollte. Den ersten Schritten mit SQL sollte allerdings nun nichts mehr im Wege stehen, wir wnschen viel Spa�beim Ausprobieren und auf dem Weg zum Datenbankprofi.
Infos
[1] Normalisierung http://de.wikipedia.org/wiki/Normalisierung_(Datenbank)





