Optionen und weiterführende Links



In der Datenbank befinden sich derzeit 477 Specials. Alle Specials anzeigen...

My- und andere SQL

My- und andere SQL

Wie bereits erwähnt, ist PHP besonders geeignet, um Daten aus einer Datenbank in eine Webseite zu integrieren. Um diese F&auuml;higkeiten der Skriptsprache nutzen zu können, braucht Ihr zumindest ein Basiswissen über Datenbanken. Wenn hier von Datenbanken die Rede ist, ist ein bestimmter Typ Datenbank gemeint: Relationale DBMS, die mit SQL kommunizieren. Der Reihe nach - ein DBMS ist ein Datenbank-Management-System. Das ist einfach ein Programm, das Eure Daten aufnimmt und auf Anfrage wieder ausspukt. Relational bedeutet, daß Eure Daten in Form von Tabellen organisiert sind, die miteinander in Beziehung (in Relation) stehen. SQL (Structurized Query Language) ist die Sprache, in der Ihr Eure Anfragen an die Datenbank formuliert.

Eine solche Datenbank ist beispielsweise MySQL, die in Eurem Komplettpaket enthalten sein sollte. Üblicherweise wird MySQL von einem Kommandozeilenclienten aus (z. B. in einer DOS-Box oder einem xterm) gesteuert, indem Ihr einfach Eure SQL-Befehle eintippt. Es gibt allerdings auch eine Reihe von mehr oder weniger praktischen graphischen Oberflächen, mit denen Ihr Eure Daten verwalten könnt. Hier werde ich mich auf die reinen SQL-Befehle beschränken.

Das relationale Modell läßt sich am einfachsten an einem Beispiel erklären. Nehmen wir an, ihr wollt eine Checkliste für Neuerscheinungen schreiben. Dann könnt Ihr das in Form von zwei Tabellen tun. Die erste enthält in jeder Zeile die Daten einer Serie (Titel, Zeichner, Verlag, ...), außerdem eine eindeutige ID (meist einfach eine laufende Nummer). In die zweite Tabelle kommen die einzelnen Hefte, ebenfalls mit einer laufenden Nummer, der ID ihrer Serie aus der ersten Tabelle, dem Erscheinungsdatum und so weiter. Beispiel für ein relationales Datenmodell
Beispiel für ein relationales Datenmodell

Die Spalten einer solchen Tabelle nennt man auch Felder, die Zeilen sind Datensätze. In jeder Tabelle müßt Ihr einen Schlüssel festlegen. Das ist ein Feld (oder eine Kombination mehrerer Felder), deren Werte immer eindeutig sein müssen. Diese Schlüssel werden (wie im Beispiel) für die Verknüpfung der Tabellen untereinander benötigt. Häufig reicht es, einfach ein fortlaufende Nummer zu verwenden. Jedes Feld ist von einem bestimmten Feldtyp, vergleichbar mit dem Typ einer Variablen. Allerdings müßt (bzw. k&oul;nnt) Ihr hier auch die Länge in Zeichen mit angeben. Welche Feldtypen Ihr verwenden könnt, steht im Manual der Datenbank.

Eine Anmerkung noch zum Feldtyp timestamp: Leider hält sich MySQL nicht an die übliche Definition eines timespamps, wie sie unter Unix/Linux und auch bei PHP benutzt wird. Dort ist ein timestamp einfach die Anzahl der Millisekunden, die seit dem 1.1.1970 vergangen sind. Mit diesem Format kann man Datumsangaben leicht von verschiedenen Kalendern unabhängig machen und auch leichter damit rechnen. timestamp-Felder in MySQL sind anders; hier werden nur die Ziffern des Datums in amerikanischer Schreibweise hintereinander geschrieben (zum Beispiel «20021010»). Die Anzahl der Ziffern hängt von der Länge des Felds ab. Dieser Unterschied führt häufig zu Verwirrungen, wenn MySQL-timestamp-Felder mit Unix-timestamp-Werten belegt werden etc. MySQL kennt jedoch Funktionen, die zwischen den beiden Varianten umrechnen können.

Die Tabellen sind innerhalb eines DBMS in Datenbanken organisiert. Das sind einfach Gruppen von Tabellen, die zusammengehören (beispielsweise zu einem Datenmodell). Die Begriffdopplung mit «Datenbank» als Kurzform für das gesamte DBMS ist etwas ungünstig, hat sich aber so eingebürgert. Bei gemietetem Webspace, zu dem die Benutzung eines MySQL-DBMS gehört, wird meist jedem Kunden eine solche Datenbank zugeteilt.

Zum Abschluß noch die wichtigsten SQL-Statements. Mit CREATE TABLE legt Ihr eine Tabelle an

CREATE TABLE serien
  (SerieID int(11) AUTO_INCREMENT PRIMARY KEY,
  Titel varchar(30),
  Autor varchar(30),
  Genre varchar(30),
  Verlag varchar(30));

«serien» ist einfach der Name der Tabelle. Darauf folgt eine Liste der Felder, die die Tabelle haben soll, im Format «Feldname Feldtyp(Länge) Besonderheiten». Solche Besonderheiten können beispielsweise PRIMARY KEY sein, das ein Feld als Schlüssel festlegt. AUTO_INCREMENT erspart Euch das Heraufzählen des Schlüssels, denn dieses Feld wird «automatisch incrementiert». SQL-Statements werden mit Semikola abgeschlossen; dadurch könnt Ihr Euer Statement in mehrere Zeilen aufteilen, um es übersichtlicher zu halten.

Mit INSERT INTO könnt Ihr neue Datensätze anlegen. Dabei gibt es zwei Varianten

INSERT INTO serien
  VALUES (1, 'Die Beispiel-Serie', 'A. U. Tor', 'Horror', 'ABComics');

Hier werden in der Klammer einfach die Werte für alle Felder aufgezählt. Wenn Ihr nur einige Felder belegen wollt, könnt Ihr das wie folgt machen

INSERT INTO serien (Titel, Autor, Verlag)
  VALUES ('Die Beispiel-Serie', 'A. U. Tor', 'ABComics');

Wieder auslesen könnt Ihr mit SELECT

SELECT Titel, Verlag FROM serien WHERE Autor='A. U. Tor';

Diese Anfrage liefert die Felder 'Titel' und 'Verlag' aus allen Datensätzen, bei denen im Feld 'Autor' der Wert 'A. U. Tor' steht. Im WHERE-Teil könnt Ihr auch mehrere Bedingungen mit AND, OR oder NOT verknüpfen

SELECT Titel FROM serien
  WHERE Autor='A. U. Tor' AND (Verlag='ABComics' OR Verlag='EFGraphics');

Neben dem einfachen Vergleich (Feld = Wert) könnt Ihr die normalen Vergleichsoperatoren (<, >, <=, >=, !=) verwenden. Außerdem könnt Ihr mit dem Schlüsselwort IN einen Vergleich mit mehreren Werten machen

SELECT Titel FROM serien WHERE anzahl_folgen IN (5, 7, 10);

Eine weitere Möglichkeit ist ein Ähnlichkeitsvergleich mit Hilfe von LIKE. Dabei werden sogenannte Joker verwendet. Vielleicht kennt Ihr das Fragezeichen als Joker für ein einzelnes Zeichen und den Stern als Joker für beliebig viele Zeichen. Ein Suchmuster 'M?SQL*' findet also 'MySQL', 'MySQL-Datenbank', 'MaSQL-Tippfehler', und so weiter. Mit LIKE könnt Ihr etwas ähnliches machen, allerdings mit anderen Jokersymbolen: Der Unterstrich (_) steht für genau ein Zeichen, das Prozentzeichen (%) für beliebig viele Zeichen.

SELECT Titel FROM serie WHERE Titel LIKE 'Spider%';

Wenn ein _ oder ein % selbst gefunden werden soll, müßt Ihr es wie gewohnt mit einem \ entwerten

SELECT Titel FROM serie WHERE Tiel LIKE 'Spider\_Man%';

findet alles, was mit 'Spider_Man' beginnt. Um alle Datensätze in der Tabelle zu bekommen, könnt Ihr die WHERE-Klausel einfach weglassen

SELECT Titel FROM serie;

Mit Hilfe der Schlüsselwörter GROUP BY und ORDER BY könnt Ihr die Ergebnisse Eures SELECTs ordnen

SELECT Titel, Verlag FROM serien
  WHERE Autor='A. U. Tor' ORDER BY Titel ASC;

ORDER BY sortiert die Datensätze nach den Einträgen im angegebenen Feld entweder aufsteigend (ASC) oder absteigend (DESC). ASC ist die Standard-Einstellung, Ihr könnt das Schlüsselwort hier also auch weglassen. Ihr könnt auch nach mehreren Feldern sortieren; wenn der Eintrag im ersten Feld gleich ist, wird nach dem Eintrag im zweiten Feld sortiert, dann nach dem dritten, und so weiter

SELECT Titel, Verlag FROM serien
  WHERE Autor='A. U. Tor' ORDER BY Verlag ASC, Titel ASC;

GROUP BY ordnet die Datensätze nur in Gruppen nach den Einträgen im angegebenen Feld, aber ohne die Gruppen in eine bestimmte Reihenfolge zu bringen. Außerdem könnt Ihr angeben, welchen Ausschnitt aus den Datensätzen, auf die die WHERE-Klausel zutrifft, Ihr haben wollt

SELECT Titel FROM serien WHERE Verlag='ABComics'
  ORDER BY Titel LIMIT 10,5;

Damit bekommt Ihr ab dem zehnten Datensatz die nächsten fünf Datensätze. Das wird oft dafür benutzt, um die Datensätze auf mehre Seiten zu verteilen (erste Seite Nummer 0-5, zweite Seite Nummer 5-10, ...). Dazu ruft Ihr einfach die Datensätze «portionsweise» ab.

Ihr könnt natürlich auch bestehende Datensätze ändern. Dazu dient das UPDATE-Statement

UPDATE serien SET Verlag='ABComics AG' WHERE Verlag='ABComics';

Die im SET-Teil angegebenen Zuweisungen werden in allen Datensätzen ausgeführt, für die die WHERE-Klausel zutrifft. Dabei könnt Ihr auch die alten Werte benutzen, z. B. für ein Inkrement

UPDATE counter SET anzahl=anzahl+1 WHERE ip='127.0.0.1';

Auch zum Löschen von Datensätzen gibt es ein Statement

DELETE FROM serien WHERE Autor='A. U. Tor';

Ganze Tabellen löschen könnt Ihr mit

DROP serien;

SQL bietet noch eine ganze Reihe weiterer Möglichkeiten. So könnt Ihr bespielweise Daten aus mehreren Tabellen kombinieren, Minima, Maxima und die Anzahl von Datensätzen bestimmen, im SQL-Statement rechnen und einiges mehr. Mehr dazu (wie üblich) im Manual Eurer Datenbank.

Ein paar Statements will ich noch kurz ansprechen, die insbesondere bei der Arbeit mit Eurem lokalen Datenbank-Server eine Rolle spielen. Ihr könnt exakte Zugriffrechte vergeben, wer was von welchem Host aus unter welchem Passwort mit Euren Daten machen kann. Dazu könnt Ihr Zugriffsrechte zuweisen (GRANT) oder entziehen (REVOKE), für eine Datenbank, eine Tabelle oder sogar ein einzelnes Feld. Mit Hilfe des USE-Statements könnt Ihr die zu verwendende Datenbank angeben (gewissermaßen wie ein Wechsel in ein Unterverzeichnis)

USE checklist;
SELECT Titel FROM serien ...;

Wenn Ihr von Eurem Webspace-Anbieter nur eine Datenbank zur Verfügung gestellt bekommt, greift Ihr automatisch auf diese Datenbank zu, ohne daß Ihr ein USE-Statement braucht. Eine neue Datenbank erstellt Ihr mit

CREATE DATABASE checklist;

wieder gelöscht wird sie mit

DROP DATABASE checklist;

Kleine Anmerkung am Rande: In vielen DBMS könnt Ihr sogenannte Constraints festlegen. Das sind einfach Beschränkungen, die die Daten erfüllen müssen: Eine Serie darf nicht 0 Folgen haben, die SerienID, auf die ein Eintrag in der Hefte-Tabelle verweist, muß auch in der Serien-Tabelle existieren, ein Heft darf keinen Preis < 0 haben, und so weiter. Andere DBMS bieten die Möglichkeit, diese Constraints automatisch überprüfen zu lassen, MySQL kann das (noch) nicht. Hier müßt Ihr selbst darauf achten, daß Ihr keine unsinnigen Daten eintragt.



Special vom: 16.01.2003
Autor dieses Specials: Henning Kockerbeck
Die weiteren Unterseiten dieses Specials:
Die reine Lehre - HTML
Stilvoll - CSS
Kleiner Grundkurs Programmieren
Jetzt wird's dynamisch - JavaScript
Die andere Seite der Dynamik - PHP
Neue Gefilde - XML
Weiterführende Links
Zurück zur Hauptseite des Specials


?>