SQL-Kurzeinführung

J. Mitlöhner, 1998

Dieser Text soll die wichtigsten Konzepte von SQL und relationalen Datenbanken vermitteln, soweit sie im PS Elektronische Datenverarbeitung mit der Schiene Intranetanwendungen eingesetzt werden.

Grundlagen

SQL (Structured Query Language) ist eine standardisierte Sprache zur Manipulation von Daten in Datenbanken. In relationalen Datenbanken finden wir als wichtigste Objekte Tabellen. Eine Tabelle hat einen Namen und eine oder mehrere Spalten. Jede Spalte hat ebenfalls einen Namen und einen Datentyp. In eine Tabelle können Datensätze eingefügt werden, die auch als Tupel bezeichnet werden. Operationen mit Tabellen sind

Anlegen von Tabellen

Bevor wir Datensätze von Tabellen manipulieren können, müssen wir zunächst eine Tabelle anlegen. Dazu dient der Befehl create table, der Teil der DDL (data definition language) ist. Es wird der Name der Tabelle sowie ihre Spalten mit deren Namen und Datentypen genannt:

create table kunde (
  nr      char(10) unique,
  name    char(30),
  adresse char(40)
);

Im obigen Beispiel wird eine Tabelle Kunde angelegt, die drei Spalten hat; die Spalten haben den Datentyp char (character), der eine Längenangabe enthält: die Spalten akzeptieren Einträge mit bis zu 10, 30 bzw. 40 Zeichen. Der Zusatz unique bei der Spalte nr bewirkt, daß alle Einträge in der Tabelle eindeutige Nummern haben; ein Datensatz mit einer schon existierenden Nummer kann nicht eingefügt werden.

Datenbanksystem erlauben in unterschiedlicher Weise einen Überblick über angelegte Objekte und deren Eigenschaften. In Oracle-Datenbanken kann z.B. mit dem Befehl

select * from tab;

eine Liste aller Tabellen abgefragt werden. Mit dem Befehl desc können die Felder einer bestimmten Tabelle abgefragt werden, z.B. desc kunde.

Tabellen Löschen

Damit der create table Befehl von der Datenbank erfolgreich ausgeführt werden kann, darf es noch keine Tabelle mit dem Namen 'kunde' geben. Falls eine solche schon existiert, kann sie mit dem Befehl

drop table kunde;

gelöscht werden.

Datensätze Einfügen

Nachdem die Tabelle angelegt ist, können Datensätze eingefügt werden:

insert into kunde values ('0001', 'Sigmund Freud', 'Berggasse 19, A-1090 Wien');
insert into kunde values ('0002', 'Radiobastler', 'Roesselmuehlgasse 20, A-8027 Graz');

Damit die insertBefehle ausgeführt werden können, muß jeder drei Werte haben, von denen der erste eine ganze Zahl und die beiden folgenden Texte sind; die Feldlängen für die Felder Name und Adresse dürfen nicht überschritten werden. Natürlich darf auch die Nummer noch nicht vergeben sein. Ungültige Einträge weist das Datenbanksystem mit einer Fehlermeldung zurück.

Datensätze Abfragen

Mit dem Befehl select können Datensätze abgefragt werden:

select * from kunde;

Es werden alle Datensätze angezeigt. Auch Einschränkungen sind möglich:

select * from kunde where nr = '0002';

Nur Tupel mit entsprechenden Werten für die Spalte nr werden angezeigt.

Datensätze Ändern

Mit dem Befehl update können Datensätze geändert werden.

update kunde set name = 'Radiobastler GmbH' where nr = '0002';

Im Datensatz mit der Nummer zwei wird das Feld Name geändert. Wird die Einschränkung where nr = 2 weggelassen, so werden alle Datensätze geändert!

Datensätze Löschen

Der Befehl delete dient zum Löschen von Datensätzen.

delete from kunde where nr = '0001';

Sigmund Freud wird aus der Kundentabelle entfernt. Wird die Einschränkung where nr = '0001' weggelassen, so werden alle Datensätze gelöscht!

Abfragen von mehreren Tabellen

Eine Datenbank besteht sinnvollerweise meist aus mehreren Tabellen. Abfragen sind daher auch über mehrere Tabellen möglich. Legen wir zunächst eine zweite Tabelle an:

create table auftrag (
  nr    integer unique,
  kunde char(10),
  datum char(10)
);

Diese Auftragstabelle ordnet jeder Auftragsnummer einen Kunden und ein Datum zu. Auftragsnummern sind wieder eindeutig. Die Spalte Kunde referenziert eine Spalte aus der Tabelle Kunde; Einträge mit Nummern, die nicht in der Kundentabelle vorkommen, sind nicht sinnvoll. In der DDL der meisten Datenbanksysteme kann erzwungen werden, daß nur konsistente Einträge akzeptiert werden; wir lassen diese Einschränkung aber weg. Beim Erfassen von Aufträgen müssen wir daher beachten, daß auch wirklich nur konsistente Einträge eingegeben werden. Im folgenden gehen wir davon aus, daß in der Kundentabelle noch die Kunden mit der Nummer 1 und 2 vorhanden sind.

insert into auftrag values (1, '0001', '1899-04-01');
insert into auftrag values (2, '0002', '1998-01-31');
insert into auftrag values (3, '0002', '1998-09-26');

Eine Abfrage aller Aufträge mittels select * from auftrag; liefert die eben eingegebenen Werte. Die Kundennummern sind dabei wenig aussagekräftig; wir würden an ihrer Stelle lieber die Namen der Kunden sehen. Wir können dazu die Auftragstabelle mit der Kundentabelle in einer Abfrage verbinden (join). Weil ein Feld mit der Bezeichnung 'nr' in beiden Tabellen vorkommt, sprechen wir die Felder mit Tabelle.Spalte an, wo Verwechslungen möglich sind:

select name, datum from kunde, auftrag
where kunde.nr = auftrag.kunde;

Als Resultat liefert die Datenbank jene Kombinationen der Tupel aus den Tabellen Kunde und Auftrag, wo die Felder kunde.nr und auftrag.kunde identisch sind:

Sigmund Freud 1899-04-01
Radiobastler GmbH 1998-01-31
Radiobastler GmbH 1998-09-26

Der Effekt dieser Abfrage ist die Expansion der Kundennummern aus der Auftragstabelle: statt wenig aussagekräftiger Nummern sehen wird die Namen der Kunden. Die where-Klausel selektiert aus allen möglichen Kombinationen von Kunde und Auftrag nur jene, die im aktuellen Zusammenhang Sinn machen. Führen Sie die uneingeschränkten Abfrage select name, datum from kunde, auftrag; durch und vergleichen Sie die Resultate!