Bei der Programmierung in Zusammenhang mit Datenbanken kommt man wohl an SQL (eines erstmals 1986 von der ANSI verabschiedeten Standards) nicht vorbei. Wer mit SQL gearbeitet hat, lernt, es zu lieben und möchte gar nicht mehr daran vorbei ,-) Mittlerweile gibt es natürlich viele Erweiterungen und Weiterentwicklungen dieser Definition.
Als Literatur kann ich zur Arbeit mit SQL das Standard-Werk von Date, C. sehr empfehlen. Es ist auch in deutsch erhältlich (allerdings ist die Eindeutschung mancher Begriffe ungünstig gewählt, so dass ich die englische Version vorziehe). Ein weiteres Buch, welches sich auch allgemein mit Datenbanksystemen beschäftigt ist von Kemper, A. und Eicker, A.: " Datenbanksysteme - Eine Einführung". Wer es gerne noch (sprach-)theoretischer mag, kann sich von Ullman, J. " Principles of Database and Knowledge-base Systems" zulegen.

MySQL

Über die DBI-Schnittstelle kann man auf MySQL-Datenbanken zugreifen. Bei MySQL handelt es sich um einen "echten Datenbankserver". Dies merkt man vor allem, wenn man vorher mal mit Access o.ä. gearbeitet hat.

Installation der erforderlichen Module

Für die Zusammenarbeit von Perl und MySQL sind die Module DBI und DBD-mySQL zu installieren. 

Programmschnipsel

use DBI;
my $dbh = DBI->connect ('DBI:mysql:Datenbankname', $usr,$pwd);
$dbh->do ('ALTER TABLE Tabelle ADD (Name char(20));');

$dbh->disconnect();

DBI-Programmierung

Anfragen an MySQL-Tabellen

Um Daten aus einer Tabelle auszulesen gibt es mehrere Möglichkeiten. Diese sind, sich ein Array zurückgeben zu lassen, eine Referenz auf ein ebensolches oder eine Referenz auf eine Hash Tabelle. Die Lösung mit der Hash-Tabelle hat den Vorteil, dass man direkt über die Tabellennamen auf die Felder zugreifen kann und nicht die Spalten auszählen muss, um die gewünschte Information zu erhalten. Hier ein paar Codezeilen, die die Arbeit mit o.g. Strukturen verdeutlichen sollen.

$sth = $dbh->prepare ('SELECT * FROM Adressen;');
$sth->execute();
while (my @erg = $sth->fetchrow_array) {
    print "$erg[3]\n";               # gibt das 4. Feld der Tabelle aus
}

##== ... oder lieber(?) mit Hash-Tabellen:

$sth = $dbh->prepare ('SELECT * FROM Adressen;');
$sth->execute();
while (my %erg = $sth->fetchrow_hashref) {
    print "$erg->{'vorname'}\n";     # gibt das Feld 'vorname' aus
}

(Achtung bei der Verwendung von fetchrow_hashref: Perl ist 'case sensitive' (wie man so schön sagt...). D.h., dass man sehr mit Gross- und Kleinschreibung der Feldnamen aufpassen muss. SQL ist die Schreibweise egal - in Perl allerdings kann es passieren, dass ein Feld 'id' (von Perl) nicht gefunden wird, da beim Tabellenentwurf ein Feld 'ID' angelegt wurde.
Um dieses Problem zu umgehen, habe ich mir vorgenommen, einfach alle Feldnamen klein zu schreiben.)

Mit dem Platzhalter '?' im SQL-String und Parametern in der execute-Funktion kann man 'variable Abfragen' stellen:

Harry', 'Ron', 'Hermine', 'Sirius', 'Dumbledore') { 
    $sth->execute ($item);
    while (my @erg = $sth->fetchrow_array()) {
        # ... tue etwas
    }
}

Anfragen mit nur einem Ergebnis (z.B. Anzahl Datensätze)

Häufig ist bekannt, dass eine Anfrage nur einen Wert zurück liefert - wenn man z.B. die Anzahl der Datensätze ermitteln möchte. Übergibt man das Ergebnis von fetchrow_array an einen skalaren Wert, so steht in diesem der gewünschte Wert:

$sth = $dbh->prepare ('SELECT anz(name) FROM Adressen WHERE name=\'harry\';');
$sth->execute();
my $anzahl = $sth->fetchrow_array();