Ob PHP, Perl, Servlets, JSP oder ASP - wer sich mit Web-Programmierung beschäftigt, wird sich früher oder später mit SQL-Datenbanken konfrontiert sehen. Die einfachen SQL-Statements sind schnell erlernt. Einsteiger übersehen häufig, dass die meisten SQL-Engines weitergehende Funktionen besitzen. Sie vereinfachen die Entwicklung und können die Performance steigern. Wie und wo zeigt folgende Artikel am Beispiel von MySQL. Hintergrund MySQL versteht einen Grundstock von SQL-Statements. Sie sind allen SQL-RDBMS gemeinsam. Die wichtigsten vier sind INSERT, SELECT, DELETE und UPDATE. Daneben hat beinahe jedes RDBMS eine ganze Reihe eigener Funktionen an Bord, die innerhalb solcher Statements verwendet werden. Der Einsatz im Rahmen eines SELECT ist dabei der häufigste Fall. MySQL bietet unter anderem arithmetische, logische, mathematische sowie Datums-, String- und Kontrollfluß-Funktionen. Sie dienen dazu, bei SQL-Abfragen die Datensätze schon auf der Datenbank-Ebene zu verändern oder vorzuverarbeiten. Dadurch werden die Daten in die benötigte Form gebracht. Anwendungsmöglichkeiten
Um alle Datensätze auszulesen und nach dem Nachnamen sortiert in der Form "Vorname Nachname, Firma / Datum" auf einer Seite anzuzeigen, würde theoretisch ein simples "SELECT firma, vorname, nachname, datum FROM kontakte ORDER BY nachname" ausreichen. Die Ergebnisse werden in einer Schleife ausgegeben. Aber schon, wenn es darum geht, das Datum vom internen MySQL-Format JJJJ-MM-TT in das deutsche TT.MM.JJJJ zu transformieren, ist in diesem Fall Handarbeit angesagt. In Perl z.B. würde man, um den gewünschten Zweck zu erzielen, für jeden einzelnen Datensatz eine Operation wie "s/(\d{4})-(\d{2})-(\d{2})/$3.$2.$1/" vornehmen müssen. Noch unangenehmer wird es hingegen bei den Namen. Mittels einer Bedingung ist zu testen, ob ein Vorname eingegeben wurde; wenn ja, folgen auf den Vornamen ein Leerzeichen und der Nachname, wenn nicht, wird nur der Nachname ausgegeben. Ebenso ist die Existenz des Firmennamens zu überprüfen. Wenn vorhanden, soll dieser mit vorangestelltem Komma und Leerzeichen angezeigt werden, andernfalls ist die Firmen-Angabe zu ignorieren. Diese Vorgehensweise ist denkbar - besonders elegant oder performant ist sie aber nicht. Wäre es nicht naheliegend, schon im Moment der Anfrage MySQL mitzuteilen, in welchem Format wir die Datensätze haben möchten? Um das oben gestellte Problem zu lösen, bedienen wir uns einiger MySQL-Funktionen: DATE_FORMAT(Datumswert,Formatierungsstring)
- dient der nahezu beliebigen Formatierung von Datums- oder
Datums-Zeit-Feldern. Der Formatierungsstring funktioniert ähnlich wie
"printf" in z.B. C, Perl oder PHP. Die Spezifizierer
unterscheiden sich allerdings (s.u.). An der prinzipiellen Struktur des SQL-Statements ändert sich nichts - einzig die Feldnamen in "SELECT firma, vorname, nachname, datum FROM kontakte ORDER BY nachname" ersetzen wir durch geeignete Funktionen: Statt "vorname, nachname"
setzen wir die Funktion "IF(LENGTH(vorname), CONCAT(vorname, ' ',
nachname), CONCAT('Mr. ', nachname)) AS name" ein. Im Klartext:
Enthält das Feld "vorname" mindestens ein Zeichen, werden
Vor- und Nachname durch ein Leerzeichen verbunden ausgegeben. Sonst nur
der Nachname, dem wir in diesem Fall ein "Mr. " voranstellen.
Korrekterweise könnte man das Geschlecht in der Datenbank speichern und
per "IF" die passende Anrede einzusetzen. Aber das sparen wir
uns hier der Übersichtlichkeit halber. Das nachgestellte "AS
name" teilt MySQL mit, dass wir das Ergebnis dieser Operation unter
dem Feldnamen "name" im Ergebnis zu finden wünschen. Das SQL-Statement lautet nun:
(Anmerkung: Die Einrückungen und Returns dienen lediglich der Übersichtlichkeit; auch die Leerzeichen sind beliebig setzbar. Nur die Funktionen bilden hierbei eine Ausnahme, denn zwischen diesen und der öffnenden Klammer darf kein weiteres Zeichen stehen.)
Da die Datensätze nun wunschgemäß vorliegen, müssen sie nur noch in einer Schleife ausgegeben werden. Selbstverständlich könnte man noch weiter gehen und die Felder mittels "CONCAT()" zu einer fertigen HTML-Tabellenzeile inklusive "<tr>"- und "<td>"-Tags zusammenfassen, wenn gewünscht. Wann ist der Einsatz sinnvoll? Der einzige echte Nachteil der Nutzung von RDBMS-spezifischen Funktionen liegt in der Portabilität. Möchte man bei einem fertigen Projekt die SQL-Engine wechseln (was bei Nutzung von Datenbank-Abstraktions-Layern wie dem DBI in Perl oder der PHPLIB in PHP recht einfach ist), müssen die SQL-Statements gegebenenfalls angepasst werden. Da das aber nicht allzu oft vorkommt, kann man dieses Argument in der Regel getrost vergessen. (cb)
|