CGI's (Common Gateway Interface) ist einfach Ausgedrückt eine Schnittstelle, womit man Anwendungen für das Internet schreiben kann. Diese CGI-Anwendung laufen dabei auf einem (Web)Server (wie Beispielsweise dem Apache) und wird von einer HTML-Webseite angesteuert. Die Daten erhält diese CGI-Anwendung entweder von der HTML-Seite selbst (POST-Verfahren) oder direkt über die URL (GET-Verfahren). C C++ C/C++ CGI mit C CGI Skripte in C CGI mit C- CGI Skripte in C Kapitel 28: MySQL und C

Die Kombination von MySQL und der C-API ist ein sehr reizvolles, aber leider auch selten behandeltes Thema. Dieses Kapitel sorgt für Abhilfe und bietet Ihnen eine Einführung in MySQL und die C-API.

Hinweis
 

Dieses Kapitel kann ein vollwertiges MySQL-Buch nicht ersetzen. Das Thema MySQL ist zwar nicht unbedingt kompliziert, aber der Umfang ist gewaltig. Einige Funktionen der C-API oder MySQL-Sprachelemente werden deshalb hier nicht erwähnt.

28.1. Aufbau eines Datenbanksystems            zurück  Ein Kapitel tiefer  zum Inhaltsverzeichnis

Dieser Abschnitt ist sehr wichtig, sofern Sie noch keinerlei Erfahrung mit Datenbanksystemen gemacht haben. Er erklärt die grundlegenden Prinzipien von Datenbanken im Allgemeinen.

Als C-Programmierer werden Sie sich fragen, warum benötige ich eine Datenbank? Ich kann doch einfach ein Programm unter Verwendung von binären Bäumen entwickeln, womit die Nutzung einer Datenbank überflüssig wird. Und Sie werden sich wundern - vereinfacht arbeitet MySQL auch so, nur mit einer anderen Beziehung: einer relationalen. Sicherlich, dass könnten Sie auch programmieren, schließlich wurde MySQL in der Programmiersprache C geschrieben. Also, wozu das Rad wieder neu erfinden? Außerdem erweist es sich als recht schwieriges Unterfangen, ein eigenes relationales Datenbankprogramm zu schreiben.

28.1.1 Warum wurde ein Datenbanksystem (DBS) entwickelt?
Vor der Zeit der Datenbanken wurden Daten mit selbst entwickelten Programmen in Dateien gespeichert. Diese Programme waren zumeist an die Bedürfnisse einer Firma bzw. eines Anwenders angepasst. Schlimmer noch, teilweise wurden die Programme für die einzelnen Abteilungen bis hin zum einzelnen Mitarbeiter konfiguriert. Probleme waren dabei vorprogrammiert. Herr Meier konnte nicht auf die Datei "x" zugreifen, die Herr Müller erstellt hat, da Herr Meier im Gegensatz zu Herrn Müller ein modifiziertes Programm besitzt.

In diesem Fall hatte Herr Meier zwei Möglichkeiten: Entweder er lässt das Programm vom Programmierer wieder anpassen (das war noch die Blütezeit für Programmierer, immer Arbeit vorhanden) oder er geht zu Herrn Müller und besorgt sich von diesem die Daten. Doch dann will Herr Müller den Datensatz abrufen und findet ihn nicht mehr. Nach einigen Recherchen stellt sich heraus, dass Frau Schneider diesen Datensatz gelöscht hat, da Sie dachte, dieser würde nicht mehr benötigt.

Da beim Zugriff auf gemeinsame Daten (auch file sharing genannt) ein enormer Wartungsaufwand entstand, was häufig zu hohen Kosten führte, wurden Datenbanksysteme entwickelt.

Ein Datenbanksystem hat gegenüber dem traditionellen Dateisystem die folgenden hervorzuhebenden Vorteile:

28.1.2 Das Datenbank-Management-System (DBMS)
Das Datenbank-Management-System (kurz DBMS) ist die Schnittstelle, mit der der Benutzer Mittel zu Verfügung gestellt bekommt, um mit der Datenbank zu kommunizieren. Durch das DBMS wird beim Ändern, Hinzufügen, Löschen oder Erweitern immer auf die Korrektheit der Datenbestände überprüft. Greift der Benutzer zum Beispiel auf einen Datensatz in der Datenbank zurück, wird zuerst nach einem gewissen Schema des DBMS auf den Datenbestand zugegriffen. Anschließend werden dem Benutzer diese Daten so serviert, wie er sie sich von der Anforderung erwünscht. Dadurch entsteht eine Art Datenunabhängigkeit, welche in einem DBMS deshalb so wichtig ist, weil dadurch die physische Speicherung einer Datenbank beliebig geändert werden kann, ohne die logische Struktur der Daten zu verändern.

Abbildung 28.1: Die drei Ebenen eines Datenbanksystems

Abbildung 28.1: Die drei Ebenen eines Datenbanksystems

In Abbildung 28.1 können Sie das Drei-Schichten-Modell erkennen. Um es kurz zu halten: Es handelt sich dabei schlicht um die Trennung von Benutzer, dem DBMS und der Datenspeicherung. Die externe Schicht beschreibt alle Möglichkeiten, die der Benutzer hat, um auf die Datenbank zuzugreifen (Programme, Funktionen und Schnittstellen). Die konzeptionelle Schicht beschreibt das Datenmodell (hier das relationale Modell). Mit diesem Modell wird beschrieben, wie auf die Daten zugriffen wird und in welchem Zusammenhang diese zueinander stehen. Die interne Schicht ist tiefste Schicht und stellt die Ebene der Datenpräsentation dar - also, wie und wo die Daten gespeichert werden.

Noch ein paar Sätze zur logischen Struktur: Als C Programmierer kennen Sie ja Strukturen. Folgende Struktur dient jetzt als Beispiel:

struct file{
             char name[MAX];
             char vame[MAX];
             int  old;
             struct file *l;
             struct file *r;
            };

Das Programm mit dieser Struktur läuft jahrelang bei Ihrem Kunden mit unzähligen Adressen. Jetzt wünscht Ihr Kunde, dass Sie den Datenbestand für int old entfernen und zwei andere Strukturvariablen dafür einsetzen. Sie müssen jetzt das Programm umschreiben, müssen den Datenbestand neu anpassen, und noch einiges mehr gilt es dabei zu beachten. Eine Menge Arbeit also. Mit dem DBMS lässt sich dies ohne Mühe mit ein oder zwei Befehlen erledigen. Der Benutzer kommuniziert allerdings nicht direkt mit dem DBMS, sondern mit einer Schnittstelle, die sich noch vor dem DBMS befindet, dem DBCI (Data-Base-Communication-Interface).

Sie können hier eindeutig das Client-Server-Prinzip wieder erkennen, wobei der Server-Teil sich um die Verwaltung und Verarbeitung von Daten kümmert und der Client-Teil mit dem Benutzer zu tun hat, darunter die komfortable Eingabe, einfaches Auslesen und mehr. Hier das Beispiel grafisch dargestellt:

Abbildung 28.2: MySQL-Datenbanksystem

Abbildung 28.2: MySQL-Datenbanksystem

Der Client kann jetzt ein Webbrowser sein, der ein CGI-Programm startet, womit auf die Datenbank zugegriffen wird, eine Java-Applikation mit der Schnittstelle JDBC (Java Database Connectivity), ein C-Programm mit der ODBC-Schnittstelle (ODBC = Open DataBase Connectivity), ein Perl-Skript mit dem DBI-Modul oder auch der Datenbank-Client mysql. Wie auch immer Sie auf das DBMS zugreifen, der Server verarbeitet die Anfrage des Clients und schickt gesammelte Daten an ihn zurück. Und die Sprache, mit der hier kommuniziert wird, heißt SQL (Structured Query Language). Die SQL ist eine genormte Datenbanksprache, die in der Regel jede Datenbank versteht. Es gibt natürlich auch Client-Programme, die Sie verwenden können, ohne ein Wort SQL zu verstehen. Das Client-Programm sorgt in diesem Fall für die Kommunikation zwischen Server und Benutzer. Als ein C-Programmierer sollte es Ihr Ziel sein, ein solches Client-Programm zu entwickeln.

28.1.3 Relationale Datenbank
MySQL ist eine Datenbank, die auf dem relationalen Konzept aufbaut. Das bedeutet, dass zwischen den Daten, welche in Tabellen gespeichert werden, bestimmte Beziehungen bestehen. Sie können die Daten mit Zusammenhängen zu anderen Daten speichern.

Hinweis
 

Die Daten einer Datenbank stehen in einer Tabelle mit Zeilen und Spalten. Eine Datenzeile wird dabei als Datensatz bezeichnet.

Folgende Beziehungen sind jetzt zwischen verschiedenen Datensätzen möglich:

Beziehung Bedeutung
1:1-Beziehung Bei der Eins-zu-Eins-Beziehung zwischen Datensätzen wird nur ein Datensatz mit einem anderen verbunden.
1:n und n:1 Beziehung Die 1:n-Beziehung ist die gängigste Beziehung. Ein Datensatz kann so mit vielen anderen Datensätzen zusammengehängt werden.
n:m-Beziehung Hierbei stehen mehrere Datensätze mit mehreren Datensätzen in Beziehung.

Tabelle 28.1: Relationale Beziehungen

Wenn Sie das relationale Konzept hier nicht so richtig verstanden haben, macht dies für den weiteren Verlauf des Buchs nichts aus. Es sollte nur der Vollständigkeit halber erwähnt werden. Sollten Sie sich allerdings ernsthaft mit MySQL befassen wollen, finden Sie im Anhang Literatur und weiterführende Links.

28.1.4 Eigene Clients mit C für SQL mit der ODBC-API entwickeln
In diesem Buch wird nur beschrieben, wie Sie eigene Clients für die MySQL-Datenbank mit der C-API (API = Application Programming Interface) schreiben können. Sie können zwar für jede Datenbank mit C eigene Client-Programme erstellen, nur liefert jede Datenbank dafür spezielle und leider unterschiedliche Funktionen aus. Wollen Sie Client-Programme schreiben, die mit jedem Datenbanksystem zusammenarbeiten, so benötigen Sie die ODBC-API, welche eine reine C-Schnittstelle ist. Der ODBC-Treiber muss zuvor besorgt und installiert werden. Er klinkt sich dann zwischen die Client-Anwendung und das DBMS ein. Sendet der Client eine Anforderung an den Server, verarbeitet der ODBC-Treiber zuerst die Anfrage und gibt sie in entsprechender Form an den Server (DBMS) weiter, damit dieser die Anfrage versteht. Der Server antwortet anschließend dem Client, wiederum durch den ODBC-Treiber. Wenn Sie so wollen, dient ODBC also als Dolmetscher für verschiedene Datenbanken mit dem Client-Programm.

28.2. MySQL installieren            zurück  Ein Kapitel tiefer  Ein Kapitel höher  zum Inhaltsverzeichnis

28.2.1 Linux
Die Installation unter Linux gestaltet sich wieder relativ einfach. Ein Download sollte eigentlich nicht erforderlich sein, da MySQL in der Regel jeder Linux-Distribution beiliegt. Bei der Suche nach MySQL in Ihrer Linux-Distribution wird Ihnen auffallen, dass meistens noch eine Reihe weiterer Pakete vorhanden sind. Um allerdings die Listings im Buch selbst nachzuschreiben, reichen die Pakete mysql, mysql-client, mysql-devel (enthält die Include-Dateien), mysql-bench und mysql-shared aus.

Wenn alle Pakete installiert wurden, können Sie den Datenbankserver starten. Unter Red Hat (funktioniert auch mit SuSE) ist dies der Befehl:

/etc/rc.d/init.d/mysql start

Bei der SUSE-Distribution kann MySQL auch mit folgendem Befehl gestartet werden (root-Rechte vorausgesetzt):

rcmysql start

Soll der Datenbankserver beim Neustart automatisch gestartet werden, müssen Sie bei Red Hat in "chkconfig" und bei SUSE in "rc.config" einen entsprechenden Eintrag vornehmen. In Regel benötigen Sie root-Rechte, um den MySQL-Datenbankserver zu starten bzw. zu stoppen.

28.2.2 Windows
Die Installation unter Windows verläuft ähnlich einfach, nur dass Sie höchstwahrscheinlich die Binary zunächst von http://www.mysql.de herunterladen müssen. Außerdem benötigen Sie noch ein Zip-Programm, um das Paket zu extrahieren. Anschließend finden Sie ein anwenderfreundliches "setup.exe" im extrahierten Verzeichnis. Nach einem Doppelklick können Sie den Anweisungen auf dem Bildschirm folgen.

Starten Sie jetzt das Programm "WinMySQLADMIN". Es befindet sich meistens im Verzeichnis "c:\mysql\bin", wobei "c:" das Laufwerk ist, auf dem Sie MySQL installiert haben. Beim ersten Start erscheint ein Quick-Setup, wo Sie einen User-Namen und ein Passwort angeben müssen. In meinem Beispiel wurde hier für User-Name "Jonathan" und für das Passwort "sql" angegeben. Das Passwort und der User-Name werden in der Datei "my.ini" gespeichert, welche Sie jederzeit mit "WinMySQLADMIN" wieder ändern können. Jetzt befindet sich in der Statuszeile (rechts unten) eine Ampel. Ist diese Ampel grün, läuft der Datenbankserver. Ist die Ampel rot, klicken Sie darauf. Folgen Sie jetzt dem Reiter "WINNT->Start the Service". Nun sollte der Datenbankserver laufen. Genauso können Sie diesen auch wieder stoppen. Für mehr Informationen zu "WinMySQLADMIN" liegt eine Windows-Hilfe-Datei im selben Verzeichnis.

Hinweis
 

Da es viele unterschiedliche Betriebssysteme gibt, ist diese Anleitung für Installation und Starten des Datenbankservers MySQL sehr oberflächlich gehalten. Für genauere Angaben und Details empfiehlt es sich immer, zuerst das Manual zur aktuellen MySQL-Version zu lesen. Dies befindet sich meist im Docs-Verzeichnis von MySQL oder online unter http://www.mysql.de.

28.2.3 Den Client mysql starten
Da Sie jetzt den Datenbankserver installiert haben und er läuft, soll jetzt das Client-Programm mysql mit dem MySQL-Datenbankserver in Kontakt treten. Öffnen Sie eine Kommandozeile bzw. ein Terminal und geben Sie Folgendes im Prompt ein:

mysql -u root -h localhost

oder alternativ unter MS-Windows:

c:\mysql\bin\mysql -u root -h localhost 



Hinweis
 

Wenn Sie unter MS-Windows vermeiden wollen, dass Sie zum Starten des mysql-Clients immer ins Verzeichnis "C:\MYSQL\BIN" wechseln oder den kompletten Pfad verwenden müssen, nehmen Sie am besten diesen Pfad in "Autoexec.bat" auf. Somit ist der mysql-Client aus jedem Pfad mit der MS-DOS-Eingabeaufforderung zu starten. Bei den Windows-Versionen 2000 und XP könnten Sie die PATH-Variable mit den von Microsoft mitgelieferten Verwaltungstools einstellen (Systemsteuerung · System · Erweitert · Umgebungsvariablen).

Jetzt befindet sich vor dem Eingabecursor:

mysql>

Wenn Sie nun quit eingeben, können Sie den Client wieder verlassen. Das Client-Programm mysql, welches Sie gerade gestartet haben, wird verwendet, um SQL-Anweisungen an Datenbankserver zu übermitteln. In der Praxis kann dafür auch das Tool phpMyAdmin verwendet werden, mit dem eine vollständige Administration der MySQL-Datenbank mithilfe des Webbrowsers möglich ist. Das Tool wird über PHP-Dokumente und das HTTP-Protokoll aufgerufen und lässt sich somit auf vielen Betriebssystemen mit dem Webbrowser verwenden.

Hinweis
 

Wenn Sie den mysql-Client starten, sollte der Server natürlich ebenso seine Arbeit verrichten. Plausibel, aber ein häufiger Grund, warum der Client keine Verbindung zum Server aufbauen kann.

28.3. Crashkurs (My)SQL            zurück  Ein Kapitel höher  zum Inhaltsverzeichnis

Um mit MySQL zu arbeiten, werden Sie einige grundlegende Sprachelemente kennen lernen. Vieles wird Ihnen als C Programmierer ohnehin nicht schwer fallen. Natürlich soll hier nicht die ganze Palette von SQL-Kommandos verwendet werden, sondern nur eine ausgewählte Anzahl, die Sie in die Lage versetzt, eine Datenbankstruktur aufzubauen und die zugehörigen Abfragen zu formulieren.

28.3.1 Was ist SQL?
Um es gleich vorweg zunehmen, SQL ist keine Programmiersprache. SQL steht für Structured Query Language und gliedert sich in zwei Teile:

28.3.2 Die Datentypen von (My)SQL
Genauso wie in C gibt es bei MySQL Datentypen. Aufgeteilt werden diese in numerische Datentypen, Datentypen für Strings und Datentypen für Datum und Zeit.

Zuerst eine kurze Übersicht zu den Datentypen für Ganzzahlen (Integerdatentypen) mit deren Bereichsangabe:

Datentyp Speicherbedarf Erklärung
TINYINT 1 Byte (8 Bit) -128 bis 127
mit UNSIGNED von 0 bis 255
SMALLINT 2 Byte (16 Bit) -32768 bis 32767
mit UNSIGNED von 0 bis 65535
MEDIUMINT 3 Byte (24 Bit) -83886008 bis 83886007
mit UNSIGNED von 0 bis 16777215
INT, INTEGER 4 Byte (32 Bit) -2147483648 bis 2147483647
mit UNSIGNED von 0 bis 4294967296
BIGINT 8 Byte (64 Bit) -9223372036854775808 bis9223372036854775807
mit UNSIGNED von 0 bis 18446744073709551616

Tabelle 28.2: Übersicht zu den ganzzahligen Datentypen von MySQL

Wie schon in C können Sie auch hierbei mit dem Schlüsselwort UNSIGNED das Vorzeichenbit setzen.

Für Gleitpunktzahlen stehen Ihnen folgende Datentypen zur Verfügung:

Datentyp Speicherbedarf Erklärung
FLOAT 4 Byte (32 Bit) -3.402823466E+38 bis1.175494351E-38 und
1.175494351E-38 bis3.402823466E+38
DOUBLE 8 Byte (64 Bit) -1.7976931348623157E+308 bis-2.2250738585072014E-308 und
2.2250738585072014E-308 bis 1.7976931348623157E+308
DECIMAL(M,D) M Byte (M*8 Bit) Abhängig von M und D

Tabelle 28.3: Übersicht zu Datentypen für Gleitpunktzahlen in MySQL

Für Strings (Zeichenketten) sind gleich mehrere Datentypen einsetzbar, welche sich abgesehen vom Namen hauptsächlich durch die Anzahl der Zeichen unterscheiden, welche diese aufnehmen können:

Datentyp Speicherbedarf Erkärung
CHAR(x) x-Byte Zeichenkette fester Länge mit x-Byte bis max. 255 Zeichen
VCHAR(x) x+1 Byte Zeichenkette mit variabler Länge mit x-Byte bis max. 255 Zeichen
TINYTEXT,TINYBLOB Zeichenzahl+1 Byte Zeichenkette mit variabler Länge bis max. 255 Zeichen
TEXT, BLOB Zeichenzahl+2 Byte Zeichenkette mit variabler Länge bis max. 65535 Zeichen
MEDIUMTEXT,MEDIUMBLOB Zeichenzahl+3 Byte Zeichenkette mit variabler Länge bis max. 224 Zeichen
LONGTEXT,LONGBLOB Zeichenzahl+4 Byte Zeichenkette mit variabler Länge bis max. 232 Zeichen

Tabelle 28.4: Übersicht zu den Datentypen für Zeichen und Strings in MySQL

Die BLOP-Datentypen sind für Binärdaten gedacht.

Zu guter Letzt folgen noch einige MySQL-Datentypen für Datum und Zeit:

Datentyp Speicherbedarf Erklärung
DATE 3 Byte (24 Bit) Datum von 1000-01-01 bis 9999-12-31; Format YYYY-MM-DD
DATETIME 8 Byte (64 Bit) Datum und Zeit von 1000-01-01 00:00:00 bis 9999-12-31 23:59:59; Format YYYY-MM-DD HH:MM:SS
TIMESTAMP(M) 4 Byte (32 Bit) UNIX-Zeitstempel von Datum und Zeit von 1970-01-01 00:00:00 bis 2036-12-31 23:59:59; Format YYYY-MM-DD HH:MM:SS. Format M = 6 YYMMDD;M = 8 YYYYMMDD;M = 12 YYMMDDHHMMSS;M = 14 YYYYMMDDHHMMSS
TIME 3 Byte (24 Bit) Zeit von -838:59:89 bis 838:59:59; Format HH:MM:SS
YEAR 1 Byte (8 Bit) Jahr (4-stellig) von 1901 bis 2155; Format YYYY

Tabelle 28.5: Übersicht zu den Datentypen für Zeit und Datum

Anhand eines Beispiels sollen Sie in die SQL-Sprache eingeführt werden. Starten Sie zuerst wieder den Client mysql mit:

mysql -u root -h localhost

28.3.3 Eine Datenbank erzeugen
Bevor Sie mit einer Datenbank arbeiten, müssen Sie zunächst eine neue erzeugen. Dies können Sie mit folgendem Befehl erreichen:

CREATE DATABASE dvd_archiv;

Abbildung 28.xx: Eine Datenbank wurde erstellt
Abbildung 28.xx: Eine Datenbank wurde erstellt

Mit diesem SQL-Kommando erzeugen Sie eine neue Datenbank mit dem Namen dvd_archiv. Wie Sie es bereits von C her kennen, wird der Befehl mit einem Semikolon abgeschlossen.

Hinweis
 

Es ist übrigens egal, ob Sie die SQL-Anweisung in Groß, -Klein- oder Groß- und Kleinbuchstaben gemischt schreiben. Sie können bspw. folgende Schreibweisen verwenden: Create Database oder create database.

Existiert eine Datenbank bereits, wird eine Fehlermeldung mit ausgegeben. Wollen Sie eine Bedingung beim Anlegen einer neuen Datenbank erstellen, können Sie so vorgehen:

CREATE DATABASE IF NOT EXISTS dvd_archiv;

Mit IF NOT EXISTS wird erst überprüft, ob eine Datenbank mit dem Namen dvd_archiv noch nicht vorhanden ist. Ist dies der Fall, wird der Befehl CREATE DATABASE ausgeführt.

Hinweis
 

Der Name der Datenbank darf nicht mehr als 64 Zeichen lang sein. Für Zeichen gelten dieselben Regeln wie schon bei der Namensvergabe für Variablen in C, außer dass der Name mit einem x-beliebigen Zeichen beginnen darf. Im Gegensatz zu Windows unterscheidet Linux, zumindest was den Namen der Datenbank betrifft, zwischen Groß- und Kleinschreibung.

28.3.4 Eine Datenbank löschen
Als Nächstes soll die neu erstellte Datenbank wieder gelöscht werden. Falls Sie den Namen der neu erstellten Datenbank vergessen haben, lassen Sie sich am besten einen Überblick aller Datenbanken geben. Hierfür verwenden Sie den SQL-Befehl:

SHOW DATABASES;

Abbildung 28.x: Anzeigen aller vorhandenen Datenbanken
Abbildung 28.x: Anzeigen aller vorhandenen Datenbanken

Jetzt ist es also wieder Zeit, die Datenbank dvd_archiv zu löschen:

DROP DATABASE dvd_archiv; 

Wollen Sie auch hier eine Fehlermeldung mit einer Bedingung abfangen, können Sie das Löschen auch so schreiben:

DROP DATABASE IF EXISTS dvd_archiv; 

Hiermit wird nur dann versucht, die Datenbank zu löschen, wenn diese auch existiert. Erstellen Sie wieder die Datenbank dvd_archiv, damit Sie mit den folgenden Beispielen weitermachen können.

28.3.5 Datenbank wechseln
Wenn Sie zwischen verschiedenen Datenbanken wechseln wollen, können Sie den Befehl USE verwenden. Beispiel:

USE dvd_archiv;

28.3.6 Eine Tabelle erstellen
Nachdem Sie eine Datenbank erstellt haben, wollen Sie sicherlich auch Daten darin speichern. Zuerst müssen Sie aber noch eine Tabelle anlegen. Eine Tabelle erzeugen Sie mit folgender SQL-Anweisung:

CREATE TABLE filmdaten (
titel CHAR(255),
hauptrolle CHAR(255),
gedreht YEAR
);

Mit diesem SQL-Kommando erstellen Sie in der Tabelle filmdaten die Spalten titel mit dem Datentyp CHAR(255), hauptrolle mit dem Datentyp CHAR(255) und gedreht mit dem Datentyp YEAR. Die Tabelle (Datensatz) mit dem Namen filmdaten (max. sind 64 Zeichen erlaubt) wird in der Datenbank dvd_archiv erzeugt - vorausgesetzt Sie haben mit USE in entsprechende Datenbank gewechselt. Als Inhalt der Tabelle wurden drei Variablen deklariert. Zwei Datentypen für Strings mit jeweils 255 Zeichen, welche den Titel (titel) und den Hauptdarsteller (hauptrolle) eines bestimmten Films enthalten. Außerdem wurde noch ein Datentyp angegeben, der das Jahresdatum des Films speichern kann.

Die Schreibweise, wie Sie hier verwendet wurde, ist nicht unbedingt so vorgeschrieben. Die Tabelle kann auch mit einer Zeile auf einmal erzeugt werden:

CREATE TABLE filmdaten (titel CHAR(255),hauptrolle CHAR(255),
gedreht YEAR);

Die Syntax setzt sich aber immer folgendermaßen zusammen:

CREATE TABLE tbl (Spaltenname Datentyp_der_Spalte,
                  Spaltenname Datentyp_der_Spalte,
                  Spaltenname Datentyp_der_Spalte);

Im Gegensatz zu C wird also hier der Bezeichner vor dem Datentyp geschrieben.

28.3.7 Die Tabelle anzeigen
Einen Überblick zu der Tabelle, die Sie mit CREATE erstellt haben, können Sie sich wieder mit dem SQL-Kommando SHOW anzeigen lassen:

SHOW TABLES;

28.3.8 Tabellendefinition überprüfen
Wissen Sie nicht mehr genau, was Sie alles in der Tabelle angegeben haben, können Sie sich mit dem Befehl EXPLAIN einen Überblick verschaffen:

EXPLAIN filmdaten;

Abbildung 28.x: Überprüfen der Tabellendefinition

Abbildung 28.x: Überprüfen der Tabellendefinition



Hinweis
 

In der Abbildung 28.5. sehen Sie in der Default-Spalte den Wert NULL. Dieser ist nicht gleich zu setzen mit dem NULL, welches Sie von C her kennen. NULL bedeutet in MySQL einfach: Es ist kein Wert dafür vorhanden. Verwenden Sie hingegen die doppelten Anführungszeichen (""), bedeutet dies in MySQL, dass der Wert unbekannt ist. Das mag zwar auf dem ersten Blick dasselbe sein, ist es aber nicht. Dies ist ein häufig gemachter MySQL-Fehler.

28.3.9 Tabelle löschen
Benötigen Sie eine Tabelle nicht mehr, können Sie diese mit demselben SQL-Befehl wie zum Löschen einer Datenbank entfernen:

DROP TABLE IF EXISTS filmdaten;

Wobei IF EXISTS hier wieder optional ist. Sie sehen, wie einfach es ist, mit MySQL etwas zu löschen. Daher ist es oft sinnvoll, regelmäßig ein Backup einer Datenbank durchzuführen. Wenn Sie ein Backup erstellen wollen, können Sie sich den Client mysqldump ansehen, welcher ebenfalls bei einer normalen MySQL-Installation dabei ist. Wollen Sie bspw. die vollständige MySQL-Datenbank sichern, dann geben Sie Folgendes im Prompt ein:

mysqldump -u root -p -opt -all -databases > my_backup.sql 

Nach dieser Eingabe müssen Sie noch schnell Ihr Passwort eingeben, und die Daten sind gesichert. Wollen Sie das Backup wiederherstellen, können Sie dies mit dem Client mysql so erreichen:

mysql -u root -p < my_backup.sql 

28.3.10 Struktur einer Tabelle ändern
Jetzt wollen Sie die Struktur einer Tabelle ändern. Dies können Sie unabhängig davon, ob diese Tabelle schon Daten beinhaltet, mit dem SQL-Kommando ALTER vornehmen. In der Tabelle filmdaten fehlt noch die Altersbeschränkung der einzelnen Filme. Diese soll jetzt hinter der Reihe hauptrolle eingefügt werden:

ALTER TABLE filmdaten ADD fsk TINYINT AFTER hauptrolle;

Bei gewissen Englischkenntnissen lässt sich diese Zeile doch schon fast wie ein Satz lesen: Ändere Tabelle filmdaten und füge fsk vom Typ TINYINT hinter hauptrolle hinzu. Mit dem SQL-Kommando ALTER lässt sich noch so manches mehr anstellen. Wollen Sie etwa ein Element in der Tabelle entfernen:

ALTER TABLE filmdaten DROP fsk; 

Hier würde zum Beispiel die Spalte fsk von der Tabelle filmdaten entfernt. Eine Spaltenbezeichnung ändern können Sie mit folgendem Kommando:

ALTER TABLE filmdaten CHANGE fsk alter INT;

Hiermit würden Sie die Spalte fsk in alter umbenennen. Außerdem ist das neue Element jetzt vom Datentyp INT. Oder wollen Sie beim Titel der Tabelle filmdaten mehr als 255 Zeichen eingeben:

ALTER TABLE filmdaten MODIFY titel CHAR(300);

Das ALTER-Kommando ist sehr vielfältig einsetzbar, sodass es sich lohnen würde, dieses Kommando noch genauer zu untersuchen.

28.3.11 Datensätze eingeben
Mit dem Kommando INSERT können Sie Daten in die Tabelle einfügen. Es gibt drei Möglichkeiten, wie INSERT verwendet werden kann. In diesem Abschnitt folgt zunächst die einfachste Variante. Jetzt fügen Sie Ihre ersten Daten in die Tabelle filmdaten ein:

INSERT INTO filmdaten (titel, hauptrolle, fsk, gedreht) VALUES
('Der Patriot', 'Mel Gibson', 16, 2001);

Wichtig ist, dass der Inhalt in der zweiten Klammerung mit der Reihenfolge der ersten Klammerung der Tabelle übereinstimmen muss. Sie könnten diese Daten auch in einer anderen Reihenfolge in die Tabelle einlesen:

INSERT INTO filmdaten (hauptrolle, titel, gedreht, fsk) VALUES
('Mel Gibson', 'Der Patriot', 2001, 16);

Sie müssen also immer darauf achten, dass die in VALUES angegebenen Werte mit denen der ersten Klammerung einheitlich sind. Sie können natürlich auch mehrere Daten auf einmal in eine Tabelle einfügen:

INSERT INTO filmdaten (titel, hauptrolle, fsk, gedreht) VALUES
('Braveheart', 'Mel Gibson', 16, 1998),
('Hello Mr. President', 'Michael Douglas', 6, 1995);

Die einzelnen Datensätze der Tabelle werden dabei jeweils mit einem Komma getrennt. Die Strings wurden hier zwar zwischen einzelne Hochkommata gestellt, können bei MySQL aber auch - wie Sie es aus C kennen - zwischen doppelte Hochkommata gestellt werden.

28.3.12 Datensätze auswählen
Jetzt zum wohl wichtigsten und am meisten angewandten Befehl in SQL: SELECT. Mit SELECT können Sie aus einer oder mehreren Tabellen Informationen zusammentragen. Zuerst sollen mittels SELECT alle Daten der Tabelle filmdaten angezeigt werden:

SELECT * FROM filmdaten;

Abbildung 28.xx: Datensätze selektieren

Abbildung 28.xx: Datensätze selektieren

Das Sternchen steht hier als ein Platzhalter für alle in der Tabelle vorhandenen Spalten. Dieser Platzhalter hat dieselbe Bedeutung, als wenn Sie Folgendes schreiben würden:

SELECT titel, hauptrolle, fsk, gedreht FROM filmdaten;  

Auch hiermit werden alle Daten einer Tabelle ausgegeben. Mit FROM geben Sie die Tabelle an, die selektiert werden soll. Interessieren Sie sich nur für die Titel der Filme, können Sie SELECT folgendermaßen verwenden:

SELECT titel FROM filmdaten; 

Wollen Sie hingegen nur die Daten der Filme ausgeben, bei denen Mel Gibson der Hauptdarsteller ist, verwenden Sie zusätzlich das SQL-Kommando WHERE:

SELECT * FROM filmdaten WHERE hauptrolle='Mel Gibson';

Oder wissen Sie nicht mehr genau, wie der Hauptdarsteller geschrieben wird:

SELECT * FROM filmdaten WHERE hauptrolle LIKE 'Mel%'; 

Hier wurde der Unschärfe-Operator LIKE eingesetzt. Wollen Sie alle Filme sortiert nach Datum ausgeben lassen, erreichen Sie dies mit:

SELECT * FROM filmdaten ORDER BY gedreht ASC;

Mit dem SQL-Befehl ORDER BY sagen Sie dem Server, er soll die Daten geordnet ausgeben; in welcher Reihenfolge, geben Sie mit ASC (aufsteigend) oder DESC (absteigend) an. Sie können natürlich auch die Vergleichsoperatoren verwenden, die Sie bereits von C her kennen.

28.3.13 Ein fortgeschrittenes Szenario
Ein Blick auf Ihre Datenbank dvd_archiv zeigt Ihnen, dass Sie einige Filme verliehen haben. Leider wissen Sie nicht mehr an wen. Da Sie sich ein wenig mit MySQL auskennen, lösen Sie das Problem mit einer Datenbank. Zuerst erstellen Sie eine neue Tabelle kontakt in der Datenbank dvd_archiv:

CREATE TABLE kontakt(nname CHAR(30), vname CHAR(30),
telefon BIGINT);

Als Nächstes geben Sie die Daten für die Tabelle kontakt ein:

INSERT INTO kontakt(nname, vname, telefon) VALUES
('Meier', 'Hans', 12345676),
('Müller', 'Franz', 3691215),
('Schiller', 'Johann', 48121620);

Jetzt benötigen Sie noch eine Tabelle, worin sich die Filme befinden, welche Sie verliehen haben und an wen:

CREATE TABLE verliehen(name CHAR(30), titel CHAR(255)); 

Sie lernen jetzt eine weitere Methode kennen, wie Sie Datensätze mit INSERT einlesen können:

INSERT INTO verliehen (name, titel) SELECT
kontakt.nname, filmdaten.titel FROM
kontakt, filmdaten WHERE
filmdaten.titel = 'Der Patriot' AND
kontakt.nname = 'Meier';

Hier fügen Sie mittels SELECT Daten in die Tabelle verliehen ein. Mit den Zeilen

kontakt.nname, filmdaten.titel

haben Sie eine Verknüpfung zweier Tabellen realisiert und zum ersten Mal Kontakt mit dem relationalen Modell gehabt. Denn obwohl beide Tabellen physisch voneinander getrennt sind, können diese mit SELECT verknüpft werden. Neu ist auch die logische AND-Verknüpfung, welche Sie als C-Programmierer als && kennen. Wenn Sie jetzt einen Blick auf die Tabelle verliehen werfen, befindet sich jetzt darin tatsächlich der Titel des Films und der Name, an wen Sie den Film verliehen haben:

SELECT * FROM verliehen; 

Nun wollen Sie die Telefonnummer der Person ermitteln, damit Sie sich mit dieser in Verbindung setzen können. Versuchen Sie es einmal selbst in Worte zu fassen. Beispiel: Suche die Telefonnummer von einer Person, welcher ich einen Film geliehen habe. So setzen Sie dies in MySQL um:

SELECT telefon FROM kontakt, verliehen
WHERE verliehen.name = kontakt.nname;

Ein echter MySQL-Guru geht dabei sicherlich noch eleganter zu Werke. Aber das ist jetzt nicht Ziel dieses Kapitels. Das Beispiel soll Ihnen zeigen, warum Sie gut beraten sind, eigene Client-Programme in C zu schreiben.

28.3.14 Datensatz löschen
Hat Ihnen der Bekannte den Film wieder zurückgebracht, ist es an der Zeit, ihn aus der Tabelle verliehen wieder zu löschen. Dies können Sie mit dem SQL-Befehl DELETE erledigen:

DELETE FROM verliehen WHERE titel = 'Der Patriot'; 

28.3.15 Datensatz ändern
Mit dem SQL-Kommando UPDATE können Sie die einzelnen oder auch mehrere Datensätze in einer Tabelle ändern. Zusätzlich wird der Befehl SET dazu verwendet. Wollen Sie bspw. die Altersbeschränkung für einen Film verändern, können Sie dabei so vorgehen:

UPDATE filmdaten SET fsk=12 WHERE fsk=6; 

Damit werden alle Daten fsk, bei denen der Wert 6 beträgt, umgeändert in den Wert 12.

Hinweis
 

Löschen Sie die Datenbank dvd_Archiv bitte nicht. Sie wird später bei der C-API wieder benötigt.

28.3.16 Zugriffsrechte in MySQL
Auf die Zugriffsrechte von MySQL soll hier nur kurz eingegangen werden. Die Zugriffsrechte von MySQL werden ebenfalls in Tabellen verwaltet. Wechseln Sie in die Datenbank und sehen Sie sich die Tabellen darin an:

USE mysql;
SHOW TABLES;

Sechs Tabellen werden aufgelistet mit folgender Bedeutung:

Tabelle Bedeutung
user Darin befinden sich die Zugriffsrechte der Anwender, die auf alle Datenbanken und Tabellen zugreifen können.
db Darin befinden sich die Zugriffsrechte der Anwender, die auf eine bestimmte Datenbank zugreifen können.
tables_priv Darin befinden sich die Zugriffsrechte der Anwender, die auf eine bestimmte Tabelle zugreifen können.
columns_priv Darin befinden sich die Zugriffsrechte der Anwender, die auf eine bestimmte Spalte zugreifen können.
host Darin befinden sich die Zugriffsrechte für bestimmte Rechner, von denen auf die Datenbank zugegriffen werden kann.
func Diese Tabelle ist bisher noch undokumentiert. Darin sollen in Zukunft die Zugriffsrechte einzelner user defined functions eingetragen werden.

Tabelle 28.6: Tabellen für die Erteilung der Zugriffsrechte von MySQL

Anhand dieser Tabelle lassen sich folgende Zugriffslevel zur Vergabe von Benutzerrechten vergeben:

Benutzerrechte vergeben können Sie mit dem SQL-Kommando GRANT und die Benutzerrechte entziehen mit REVOKE. Da das Thema recht umfangreich ist, sei hierfür auf die MySQL-Dokumentation verwiesen.

Hinweis
 

Bei einer Neuinstallation von MySQL ist das root-Passwort nicht gesetzt. Logisch, sonst könnten Sie den Client nicht starten. In der Praxis empfiehlt es sich, ein Passwort zu verwenden. Die Listings, die Sie in den folgenden Abschnitten erstellen, gehen davon aus, dass noch kein Passwort für root vergeben wurde. Falls Sie bereits das Passwort für root verändert haben, ändern Sie dies auch in den Listings ab.

28.3.17 Übersicht über einige SQL-Kommandos
Damit Sie im weiteren Verlauf nicht immer wieder zu den einzelnen Abschnitten zurückblättern müssen, folgt hier ein kurzer Überblick der SQL-Kommandos, die Sie kennen gelernt haben, und ihre jeweilige Bedeutung:

SQL-Kommando Bewirkt
CREATE DATABASE datenbank; Eine Datenbank erzeugen
SHOW DATABASES; Anzeigen einer Datenbank
DROP DATABASE datenbank; Eine Datenbank löschen
USE datenbank; Datenbank wechseln
CREATE TABLE tabelle(Spaltenname Datentyp,
Spaltenname Datentyp,
Spaltenname Datentyp);
Eine Tabelle erstellen
SHOW TABLES; Tabelle anzeigen
EXPLAIN tabelle; Tabellendefinition überprüfen
DROP TABLE IF EXISTS tabelle; Tabelle löschen
ALTER TABLE tabelle
ADD bezeichner_neu datentype
AFTER bezeichner;
Daten in die Tabelle einfügen
ALTER TABLE tabelle->
DROP spaltennamen;
Daten aus der Tabelle entfernen
ALTER TABLE tabelle
CHANGE alter_bezeichner
neuer_bezeichner Datentyp;
Bezeichner ändern
ALTER TABLE tabelle MODIFY
bezeichner datentype_neu;
Datentyp von Bezeichner ändern
INSERT INTO tabelle(
bezeichner1, bezeichner2,
bezeichner3, bezeichner4)VALUES(
'foo', 'baa', 99, 66);
Datensätze in Tabelle eingeben
SELECT * FROM tabelle; Alle Datensätze einer Tabelle ausgeben
SELECT bezeichner FROM tabelle; Einzelne Datensätze einer Tabelle ausgeben
SELECT * FROM filmdatenWHERE hauptrolle='foo'; Datensätze einer Tabelle mit bestimmtem Inhalt ausgeben
SELECT * FROM tabelleORDER BY bezeichner ASC; Datensätze sortiert ausgeben (aufsteigend)
SELECT * FROM tabelleORDER BY bezeichner DESC; Datensätze sortiert ausgeben (absteigend)
DELETE FROM tabelleWHERE bezeichner = 'foo'; Datensatz aus Tabelle mit bestimmtem Inhalt löschen
UPDATE tabelle
SET bezeichner=12
WHERE bezeichner=6;
Datensatz aus Tabelle mit bestimmtem Inhalt ändern
GRANT ALL ON tabelle TO benutzername Benutzerrechte vergeben
REVOKE ALL ON tabelle
TO benutzername
Benutzerrechte entziehen

Tabelle 28.7: Übersicht zu einigen gängigen MySQL-Kommandos

28.4. Die MySQL C - API            zum Inhaltsverzeichnis