| Nützliche MySQL Funktionen |
Nützliche MySQL Funktionen die jeder Anfänger kennen sollteIn diesem kleinen Artikel möchte ich dem angehenden Programmierer einige sehr nützliche MySQL Funktionen vorstellen, die einem das Leben erleichtern, Tipparbeit sparen und zum Teil die Ausführung des Scripts deutlich beschleunigen können. Als PHP Programmierer stolpert man zwangsläufig ständig über MySQL. Was viele, speziell Anfänger, nicht wissen ist, dass MySQL eine riesige Fülle an eigenen Funktionen bereit hält, die zum Teil extrem viel schneller arbeiten, als deren PHP Pendant. Ungeübertere Programmierer beschränken ihre MySQL-Exkursionen meist auf simple INSERT oder SELECT Anweisungen, ziehen Daten aus der Datenbank und verarbeiten diese dann mit PHP. Dabei werden nicht selten abenteuerliche Keulen ausgepackt um z.B. ein Timestamp oder Datum im MySQL Format in ein Deutsches Datum umzuwandeln oder man möchte ganz simpel einen Status (Ja oder Nein) ermitteln und packt dann irgend welche IF-Konstrukte aus. Das vieles davon aber direkt mit MySQL nicht nur viel einfacher, sondern zudem auch noch viel performanter geht, ist den meisten nicht bewusst. Das wird sich jetzt aber ändern! ;-) CONCAT $sql = "SELECT CONCAT(`vorwahl`, '/', `rufnummer`) as `telefonnummer` FROM `tabelle`"; DATE_FORMAT $sql = "SELECT DATE_FORMAT(`datum`, '%d.%m.%Y') as `datum` FROM `tabelle`"; So wird aus einem Datum im Format 2010-03-09 16:04:37 ein Datum im Format 09.03.2010. Eine ausführlichere Übersicht über die Datums- und Zeitfunktionen von MySQL findet ihr ebenfalls auf phpBuddy.eu. IF while ($zeile = mysql_fetch_array( $ergebnis )) { if ($zeile['aktiviert'] == 1) { echo '<img src="aktiv.png" />'; } elseif ($zeile['aktiviert'] == 0) { echo '<img src="inaktiv.png" />'; } } Übergeben wir MySQL die Aufgabe festzustellen welchen Status ein Mitglied hat, lässt sich unser Code vereinfachen und übersichtlicher gestalten. $sql = "SELECT IF(`aktiviert`=1, 'aktiv.png', 'inaktiv.png') as `status` FROM `tabelle`"; // Die Ausgabe dann... while ($zeile = mysql_fetch_array( $ergebnis )) { echo '<img src="' . $zeile['status'] . '" />'; } In der MySQL IF-Funktion ist der 1. Parameter der Ausdruck der über Wahr oder Falsch entscheidet. Ist der Ausdruck Wahr, wird der 2. Parameter als status (as `status`) zurück gegeben, andernfalls liefert MySQL den 3. Parameter als status. IN $sql = "SELECT `name` FROM `tabelle` WHERE `beruf` = 'Maurer' OR `beruf` = 'Tischler' OR `beruf` = 'Fotograf'"; Es werden also Datensätze gesucht, in denen der Beruf Maurer oder Tischler oder Fotograf vorkommt. Eleganter und übersichtlicher geht's so: $sql = "SELECT `name` FROM `tabelle` WHERE `beruf` IN('Maurer', 'Tischler', 'Fotograf')"; INET_ATON und INET_NTOA Um umgewandelte IP Adressen als Integer speichern zu können ist es dringend empfohlen, als Feldtyp in MySQL, INT unsigned (Integer unsigniert) zu verwenden, da es sonst beim zurück konvertieren von IP Adressen über dem Bereich 127.x.x.x zu Probleme kommen kann. Schauen wir uns zuerst die Anwendungsbeispiele an. $sql = "INSERT INTO `tabelle` (`ip`) VALUES(INET_ATON('192.168.1.254'))"; Auslesen einer IP, die als INT gespeichert wurde: $sql = "SELECT INET_NTOA(`ip`) as `ip` FROM `tabelle`"; Warum das Ganze mit INT, statt IPs direkt als VARCHAR zu speichern? Nun, zum einen verbrauchen IP Adressen, je nach Bereich, erheblich mehr Speicherplatz als der Integer Wert. Zum anderen, und das ist der wichtigere Aspekt, lassen sich Integer Werte in einer Datenbank erheblich schneller durchsuchen, als andere Datentypen. Mit erheblich schneller ist gemeint, dass je nach Vergleichsdaten und Datentyp ein Durchsuchen von Integer Werten bis zu 100 mal schneller ist, als das Durchsuchen von VARCHAR, TEXT oder gar BLOB. Besonders bei vielen gespeicherten IP Adressen, wie etwa in Logs oder Tracking Anwendungen, macht sich das extrem bemerkbar. INSERT INTO...ON DUPLICATE KEY Nehmen wir noch einmal an, dass wir eine Mitgliedertabelle haben. In dieser Tabelle ist das Feld name als UNIQUE gekennzeichnet. Damit wird verhindert, dass es mehr als einen User mit einem identischen Namen gibt. Jedes Forum, jede Blogsoftware funktioniert nach diesem Prinzip. Nehmen wir ferner an, dass ein Datensatz hinzugefügt werden soll der, sofern der Name nicht existiert, neu angelegt wird, aber falls der Name bereits existiert, nur der Wohnort aktualisiert werden soll. Die MySQL Anweisung dafür sieht etwa so aus: $sql = "INSERT INTO `tabelle` (`name`, `wohnort`) VALUES('Andreas', 'Kaiserslautern') ON DUPLICATE KEY UPDATE `wohnort` = 'Kaiserslautern'"; MySQL versucht nun zuerst einen neuen Datensatz hinzuzufügen. Ist das Feld name aber als UNIQUE gekennzeichnet und der Name kommt bereits vor, würde MySQL mit einem Fehler abbrechen. Durch das ON DUPLICATE KEY wird aber die UPDATE Anweisung auf den Datensatz ausgeführt, die dem Feld entspricht, dass den Fehler ausgelöst hat. Hätte Andreas vorher in Frankfurt gewohnt, würde er nachher also in Kaiserslautern wohnen. REPLACE $sql = "SELECT REPLACE(`farbe`, 'Rot', 'Blau') as `farbe` FROM `tabelle`"; Wie die IF-Funktion erwartet REPLACE 3 Parameter. Der 1. Parameter ist das Feld, der 2. Parameter die zu ersetzende Zeichenkette, der 3. Parameter die Ersetzung. Die Daten werden in diesem Beispiel nur beim Auslesen geändert, ohne das der eigentliche Datensatz geändert wird! Viel Spaß mit den Tipps und bis zum nächsten Mal, Funktionsübersicht und Download MySQL Beispiele (1 KB) |