Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger

 << zurück
Linux-UNIX-Programmierung von Jürgen Wolf
Das umfassende Handbuch – 2., aktualisierte und erweiterte Auflage 2006
Buch: Linux-UNIX-Programmierung

Linux-UNIX-Programmierung
1216 S., mit CD, 49,90 Euro
Rheinwerk Computing
ISBN 3-89842-749-8
gp Kapitel 12 MySQL und PostgreSQL
  gp 12.1 Relationales Datenbanksystem
  gp 12.2 Relationaler Datenbankserver
  gp 12.3 SQL-Server im Überblick
  gp 12.4 MySQL
    gp 12.4.1 Anwendungsgebiete von MySQL
    gp 12.4.2 Schnittstellen von MySQL
    gp 12.4.3 Installation von MySQL
    gp 12.4.4 MySQL-Server starten und stoppen
    gp 12.4.5 Konfigurationsdatei my.cnf
    gp 12.4.6 Kommandozeilenwerkzeuge für und von mysql
    gp 12.4.7 Grafische Clients
    gp 12.4.8 MySQL-Crashkurs
    gp 12.4.9 Datentypen
    gp 12.4.10 Datenbank anlegen, verwenden und löschen
    gp 12.4.11 Tabelle anlegen
    gp 12.4.12 Schlüsselfelder (Tabellen anlegen)
    gp 12.4.13 Indizes
    gp 12.4.14 Tabellentypen (Tabellen anlegen)
    gp 12.4.15 Autowerte definieren
    gp 12.4.16 Tabellen umbenennen und ändern
    gp 12.4.17 Daten einfügen, ändern und löschen
    gp 12.4.18 Daten importieren
    gp 12.4.19 Datenausgabe
    gp 12.4.20 NULL ist 0 oder undefiniert?
    gp 12.4.21 Unscharfe Suche
  gp 12.5 MySQL C-API
    gp 12.5.1 Verbindung mit dem MySQL-Server aufbauen
    gp 12.5.2 Aufgetretene Fehler ermitteln – mysql_errno() und mysql_error()
    gp 12.5.3 Schließt die Verbindung zum Server – mysql_close()
    gp 12.5.4 Erstes Beispiel
    gp 12.5.5 Verschiedene Informationen ermitteln
    gp 12.5.6 Datenbanken, Tabellen und Felder ausgeben (MYSQL_RES)
    gp 12.5.7 Ergebnismenge zeilenweise bearbeiten (MYSQL_ROW)
    gp 12.5.8 Ergebnismenge spaltenweise einlesen (und ausgeben) (MYSQL_FIELD)
    gp 12.5.9 Ein Beispiel
    gp 12.5.10 Ergebnismenge – weitere Funktionen
    gp 12.5.11 Befehle an den Server – mysql_query() und mysql_real_query()
    gp 12.5.12 Weitere Funktionen
    gp 12.5.13 Veraltete Funktionen
    gp 12.5.14 Neue Funktionen ab Version 4.1.x
  gp 12.6 Beispiel eines Newssystems mit MySQL
    gp 12.6.1 Die Headerdatei my_cgi.h
    gp 12.6.2 (Pseudo-)Planung
    gp 12.6.3 Datenbank und Tabellen anlegen
    gp 12.6.4 MySQL-Clients mit GUI
    gp 12.6.5 Randnotiz
  gp 12.7 Neue SQL-Funktionen für die Shell – MySQL erweitern
  gp 12.8 MySQL-Funktionen mit der UDF-Schnittstelle entwerfen
    gp 12.8.1 UDF-Sequenzen
    gp 12.8.2 UDF_INIT-Struktur
    gp 12.8.3 UDF_ARGS-Struktur
    gp 12.8.4 Rückgabewert
    gp 12.8.5 Benutzerdefinierte Funktionen erstellen
    gp 12.8.6 Benutzerdefinierte Funktion kompilieren, installieren und ausführen
  gp 12.9 PostgreSQL – objektrelationales Datenbankverwaltungssystem
    gp 12.9.1 PostgreSQL im Vergleich zu MySQL
    gp 12.9.2 Unterschiede in der Syntax zwischen MySQL und PostgreSQL
    gp 12.9.3 PostgreSQL installieren
    gp 12.9.4 Konfigurationsdateien bei PostgreSQL – (postgresql.conf, pg_hba_conf)
    gp 12.9.5 CRASHKURS PostgreSQL
    gp 12.9.6 PostgreSQL C-API – libpg
    gp 12.9.7 Umgebungsvariablen und Passwortdatei
    gp 12.9.8 PostgreSQL und Threads
    gp 12.9.9 Ausblick


Rheinwerk Computing

12.4 MySQL  downtop

Beginnen wir zuerst mit der MySQL-Datenbank. Ich habe mich für MySQL entschieden, nicht nur weil es frei ist, sondern weil es zum einen gute Schnittstellen (API) zu vielen verschiedenen Programmiersprachen bietet und weil zum anderen mit MySQL auch möglich ist, ein TCP/IP-Netz zu kontaktieren, ohne gleich zusätzlich noch die Socket-Programmierung zu verwenden. Die API von MySQL nimmt Ihnen diese Arbeit ab. MySQL bietet eine Reihe von Vorteilen gegenüber anderen Datenbanksystemen. Außer dass MySQL frei verfügbar und (unter UNIX) in allen Hinsichten kostenlos ist, sind die Datenbankzugriffe sehr schnell, der Server kann als absolut stabil und sicher gelten, es werden wenig Ressourcen vom System verschwendet (sowohl CPU-Zeit als auch RAM), und MySQL ist auf fast allen Betriebssystemen erhältlich. Sollte das nicht der Fall sein, kann immer noch der Quellcode hergenommen und kompiliert werden.

Ein eventueller Nachteil von MySQL ist, dass sich dieses nicht an ANSI SQL hält, sondern viele eigene Erweiterungen nutzt. Das ist gerade im Open-Source-Bereich von ziemlicher Bedeutung. MySQL lässt sich aber auch im ANSI-Modus nutzen, in dem man den Server mit der Option –ansi startet.


Hinweis   Die Beispiele in diesem Kapitel wurden getestet unter FreeBSD-4.10-STABLE mit mysql-4.0.20(ports build), unter Debian(mixed) mit mysql-4.0.15(source build) und unter SUSE-Linux 8.1 mit mysql-3.23.55-log.



Rheinwerk Computing

12.4.1 Anwendungsgebiete von MySQdowntop

Das Anwendungsgebiet von MySQL ist natürlich sehr umfassend. Dennoch sollen hierbei ein paar Hauptanwendungsgebiete von MySQL aufgezählt werden.

gp  Einsatz als Internet Service Provider (ISP) – Da MySQL absolut kostenlos ist, läuft diese Datenbank bei sehr vielen ISPs. Häufig wird dabei die Kombination Linux, Apache, MySQL und PHP oder/und Perl eingesetzt – kurz auch als LAMP bekannt.
gp  Einsatz bei Internet-Anwendungen – Wird gerne verwendet, da sich, wie schon beim ISP, serverseitige Technologien wie Perl oder PHP einfach anwenden lassen.
gp  CMS (Content Management Systems) – Die meisten (fast alle) CMS bieten eine Schnittstelle zur Datenbank MySQL an. Vor allem auch weil wieder viele ISPs diese Datenbank verwenden, was wiederum die Nutzung des CMS für jedermann bedeutet.
gp  Einsatz zur Schulung – Zum einen sind wie schon beim ISP recht geringe Anschaffungskosten nötig, zum anderen muss auch kein großer Aufwand bei der Installation und der Konfiguration betrieben werden. Und es lässt sich mit MySQL auch das Standard-SQL darstellen.

Anhand dieser Auflistung fällt allerdings auch auf, dass das Hauptanwendungsgebiet von MySQL eindeutig das Internet und somit auch ied Internet-Programmierung ist.


Rheinwerk Computing

12.4.2 Schnittstellen von MySQdowntop

Dank vieler Schnittstellen, was auch der Grund zur Vorstellung dieser Datenbank im Buch war, kann MySQL fast überall in der IT-Welt integriert werden. Im Schnittstellen-Konzept ist eine so genannte MySQL client library implementiert, womit sowohl die Werkzeuge von MySQL als auch die Programmierschnittstelle bedient werden.

MySQL bietet ein Menge Schnittstellen für uns Programmierer; wobei die Schnittstellen für C, Java, PHP und Perl wohl die am häufigsten verwendeten Schnittstellen sein sollten. Die meisten Kommandozeilenwerkzeuge von MySQL wurden z. B. in C geschrieben. Den Quellcode der einzelnen Clientanwendungen finden Sie in der Source-Distribution von MySQL im Verzeichnis client.


Rheinwerk Computing

12.4.3 Installation von MySQdowntop

Gewöhnlich sollte MySQL Ihrer Linux-Distribution beiliegen – weshalb sich die Installation als nicht sehr schwierig erweisen sollte. Bei der Suche nach den Paketen Ihrer Linux-Distribution wird Ihnen sicherlich noch eine Reihe weiterer Pakete zu MySQL auffallen. 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.

Wollen Sie MySQL herunterladen und dieses Paket installieren oder gar die Source-Distribution neu übersetzen, dann sollten Sie hierzu einen Blick auf die gute Dokumentation werfen, die Ihnen die weiteren Schritte genau beschreibt.


Hinweis   Natürlich finden Sie auch hierzu wieder Info-Material auf der Buch-CD.



Rheinwerk Computing

12.4.4 MySQL-Server starten und stoppedowntop

Nachdem Sie MySQL erfolgreich installiert haben, können Sie den Server starten. Sollte dies bei Ihnen nicht funktionieren, dann sollten Sie sich die mitgelieferte Dokumentation durchlesen oder der Webseite von MySQL einen Besuch abstatten. Gewöhnlich benötigen Sie dazu Superuser-Rechte.

Unter der Red Hat- und Debian-Distribution lässt sich der MySQL-Server wie folgt starten:

$ /etc/rc.d/init.d/mysql start
Starting service MySQL

Ebenso einfach lässt sich der Server unter Red Hat auch wieder stoppen:

$ /etc/rc.d/init.d/mysql stop
Starting service MySQL

Bei der SUSE-Distribution kann der MySQL-Server auch mit folgendem Befehl vom Superuser gestartet bzw. gestoppt werden:

$ rcmysql start
Starting service MySQL                                  done
$  rcmysql stop
Shutting down service mysql                             done

Mit dem Befehl restart am Ende, anstatt start oder stop, können Sie den MySQL-Server neu starten lassen.

Wollen Sie, dass der MySQL-Server bei jedem Start von Linux aktiv ist, können Sie bei Red Hat einen Eintrag in chkconfig und bei SUSE einen in rc.config oder in /etc/init.d/mysql machen. Darauf soll aber hier nicht genauer eingegangen werden.


Rheinwerk Computing

12.4.5 Konfigurationsdatei my.cndowntop

Mit MySQL haben Sie auch die Möglichkeit, mit der Konfigurationsdatei my.cnf verschiedene Einstellungen vorzunehmen. Diese Konfiguration kann dabei auf der System-, Datenbank- oder der Benutzerebene vorgenommen werden. Sie finden folgende drei Konfigurationsdateien für den MySQL-Server:

gp  Systemweite Einstellungen in /etc/my.cnf
gp  Globale Servereinstellungen in <Datenverzeichnis>/my.cnf – Da auf einem Rechner mehrere MySQL-Server (in verschiedenen Datenverzeichnissen) ausgeführt werden können, sind hiermit Einstellungen für diese Server möglich. Dies eignet sich bei mehreren Server besser als /etc/my.cnf, da hierbei die Einstellungen für alle Server des Systems gelten würden. Die Konfigurationsdatei kann dem Server beim Start übergeben werden.
gp  Benutzerspezifische Einstellungen in ~./my.cnf – Diese Konfigurationsdatei wird verwendet, wenn der MySQL-Server unter einer abweichenden Einstellung arbeiten soll.

Die Konfigurationsdatei ist eine gewöhnliche Textdatei und lässt sich mit jedem ASCII-fähigen Editor betrachten und mit entsprechenden Rechten modifizieren. Da Sie den Server soeben als Superuser starten mussten, können Sie sich gleich als solcher die Konfigurationsdatei in der Kommandozeile ansehen:

$ less -MSi /etc/my.cnf

Die Ausgabe kann nun von System zu System variieren. Die Syntax der Konfigurationsdatei können Sie der Online-Dokumentation entnehmen. Folgende globale Einstellungen sind allerdings gewöhnlich immer anzutreffen:

[client]
#password       = your_password
#user           = username
port            = 3306
socket          = /var/lib/mysql/mysql.sock
# Here follows entries for some specific programs
# The MySQL server
[mysqld]
port            = 3306
socket          = /var/lib/mysql/mysql.sock

Alle Zeilen, die mit # beginnen, sind Kommentare und werden vom MySQL-Server ignoriert. Anschließend folgt in den eckigen Klammern das Programm, wofür die nachfolgenden Parameter gelten. Außer mysqld (der MySQL-Server (Dämon)) können noch weitere MySQL-Clientprogramme wie u. a. mysql, mysqladmin, mysqldump usw. verwendet werden. Anschließend werden die einzelnen Einstellungen für das Programm mit der Angabe

option = wert (bspw. port = 3306)

eingestellt. Selbiges gilt für die Einstellung von Variablen mit

set-variable =      Variablenbezeichnung=Wert

Zum Beispiel:

# The MySQL server
[mysqld]
port            = 3306
socket          = /var/lib/mysql/mysql.sock
set-variable    =  max_connections = 200

Hier wurde dem MySQL-Server die Anzahl der maximalen gleichzeitigen Verbindungen (max_connections) übergeben. Eine Konfiguration einzustellen ist somit recht einfach. Es muss lediglich das Programm in eckigen Klammern gefolgt von den einzelnen Parametern angegeben werden.


Tipp   Um die Geschwindigkeit Ihrer Datenbank ein wenig zu optimieren, können Sie die Variable query_cache_size, ein Speicher zur Zwischenspeicherung, verwenden. Setzen Sie diese Variable einfach beim Programm [mysqld] auf einen bestimmten Wert, je nachdem, wie groß dieser Cache sein soll. Um den Query-Cache zu aktivieren, müssen Sie außerdem die Variable query_cache_startup_type aktivieren.



Rheinwerk Computing

12.4.6 Kommandozeilenwerkzeuge für und von mysqdowntop

Es gibt zwar mittlerweile eine umfangreiche Auswahl an grafischen Tools und Programmen für Administrationsaufgaben von MySQL, aber in vielen Fällen reichen die Kommandozeilenwerkzeuge von MySQL aus. Am häufigsten sind dabei die mysql-Clientanwendung (auch gerne mysql-Shell genannt; offiziell MySQL Monitor) und phpMyAdmin (grafischer Client für den Browser) anzutreffen.

mysql

Der Client (oder besser die SQL-Shell) mysql ist im Standardumfang von MySQL enthalten und quasi das wichtigste Werkzeug, um mit MySQL in der Kommandozeile zu arbeiten. Die MySQL-Shell soll jetzt aufgerufen werden. Starten Sie hierfür, falls noch nicht geschehen, den MySQL-Server. Da das Werkzeug mysql eine gewaltige Anzahl von Optionen besitzt, können Sie es auch mit dem Flag –help aufrufen, um sich einen Überblick zu verschaffen.

$ mysql -uroot –hlocalhost -p
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2 to server version: 3.23.55-log
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

Sie starten hierbei die MySQL-Shell mit dem User root und dem Host localhost. Sie können sich von Haus aus als Benutzer root mit dem MySQL-Server verbinden. Sollte eigentlich auch logisch sein, denn sonst hätten Sie keinen Zugriff auf den MySQL-Server. Aus Sicherheitsgründen sollten Sie dies natürlich ändern. Verlassen Sie die MySQL-Shell erst wieder mit dem Aufruf von quit (oder auch mit exit (ein Alias für quit)).

mysql> quit
Bye

Natürlich können Sie auf die MySQL-Shell, wie es sich für eine Shell eben gehört, auch im Batch-Modus zugreifen. Z. B. können Sie die mysql-Anweisungen in ein Skript schreiben und mit folgendem Befehl ausführen lassen:

$ mysql -u root -h localhost -p datenbank < skript.sql

Damit werden alle Befehle, die Sie in skript.sql angegeben haben, ausgeführt. Weiterhin können Sie die Ausgabe auch in eine andere Datei umleiten lassen:

$ mysql -u root -h localhost -p datenbank < skript.sql > \
> ausgabe.txt

Der Batch-Modus ist sehr gut für Cron-Jobs geeignet, um regelmäßige Aufgaben (wie z. B. Backups) zu automatisieren.

mysqladmin

Damit jetzt nicht jedermann auf die Datenbanken zugreifen kann, sollten Sie wenigstens ein Passwort vergeben. Da ich davon ausgehe, dass Sie der Chef am Rechner sind, soll hierfür ein Passwort für Sie eingerichtet werden. Dies können Sie recht komfortabel mit dem Client mysqladmin realisieren.

$ mysqladmin -uroot password juergen

Hiermit haben Sie sich als root das Passwort juergen gegeben. Sie sollten sich natürlich ein anderes Passwort einfallen lassen. Wollen Sie das Passwort wieder ändern, können Sie folgendermaßen vorgehen:

$ mysqladmin -uroot -pjuergen password k4p6m3o3

Hinweis   Man kann dies auch ohne -p machen, wodurch man interaktiv gefragt wird. Das ist auch vorteilhafter, weil man sonst über »ps aufwwx« die Passwörter sehen kann.


Es empfiehlt sich allerdings, auf Produktivsystemen nicht diesen Befehl abzusetzen. Falls es jemand schafft, root-Rechte auf dem Server zu erlangen, kann er somit das Hauptpasswort für die DB aus der /root/.bash_history auslesen (erste Anlaufstelle für Cracker). Es ist sinnvoller, das Passwort im mysql-Monitor mit den Grant-Funktionen zu ändern. Oder mit einem

mysql > USE mysql;
mysql > UPDATE user SET Password=PASSWORD('neues_password')
      > WHERE User='root';

und danach mit

mysql > FLUSH PRIVILEGES;

die User-Datenbank neu einzulesen.

Somit haben Sie das Passwort juergen umgeändert zu k4p6m3o3. Wenn Sie sich jetzt wieder in die MySQL-Shell einloggen wollen, müssen Sie das Passwort mit angeben:

$ mysql -uroot -hlocalhost -pk4p6m3o3
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9 to server version: 3.23.55-log
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> exit
Bye

Zur Verwaltung des Zugriffs der verschiedenen Anwender auf die Datenbank verwendet MySQL (wenn wundert‘s) auch eine Datenbank mit entsprechendem Namen – mysql. Sie sollten daher immer darauf achten, dass Sie für diese Datenbank entsprechende Rechte vergeben haben (Schreibschutz). Denn was hilft die Verteilung von Zugriffsrechten zu Datenbanken, einzelnen Tabellen oder einzelnen Spalten, wenn sich der Anwender die Rechte selbst vergeben kann. Neue Benutzer können Sie mit dem SQL-Befehl GRANT hinzufügen und mit REVOKE wieder entfernen. Hierfür sei allerdings die Online-Dokumentation empfohlen, da hierauf das Buch nicht eingeht.

Weitere, gerne verwendete Aktionen, die mit mysqladmin durchgeführt werden, sind das Überwachen des Serverzustands. Hierzu können Sie die Optionen status und extended-status verwenden:

$ mysqladmin -uroot -pk4p6m3o3 status
Uptime: 22476  Threads: 1  Questions: 41  Slow queries: 0  Opens: 12  Flush tables: 1  
        Open tables: 6 Queries per second avg: 0.002
$ mysqladmin -uroot -pk4p6m3o3 extended-status
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| Aborted_clients          | 0     |
| Aborted_connects         | 7     |
| Bytes_received           | 1361  |
| Bytes_sent               | 4586  |
| Com_admin_commands       | 0     |
...
[schnipp]
...
| Threads_created          | 21    |
| Threads_connected        | 1     |
| Threads_running          | 1     |
| Uptime                   | 22488 |
+--------------------------+-------+

Einige weitere wichtige Information erhalten Sie mit processlist. Damit erfahren Sie, wo der Server seine meiste Zeit verbringt oder gar vergeudet:

$ mysqladmin -uroot -pk4p6m3o3 processlist
+--+----+---------+--+-------+----+-----+------------------+
|Id|User|Host     |db|Command|Time|State| Info             |
+--+----+---------+--+-------+----+-----+------------------+
|22|root|localhost|  |Query  |0   |     | show processlist |
+--+----+---------+--+-------+----+-----+------------------+

Mehr zu mysqladmin erfahren Sie außerdem mit der Option –help.

mysqlshow

Mit dem Programm mysqlshow können Sie sich Informationen über eine Datenbank, Tabelle, Spalten oder Indizes ansehen. So können Sie sich mit folgender Eingabe die Passwortdatei des MySQL-Servers, in der die User eingetragen werden, ausgeben lassen:

$ mysqlshow -uroot -pk4p6m3o3 -hlocalhost mysql user

Die Syntax dazu lautet:

mysqlshow [OPTIONEN] [Datenbank [Tabelle [Spalte] ] ]

mysqldump

Mit dem Programm mysqldump erzeugen Sie eine komplette Kopie Ihrer Datenbank oder auch Teile davon. Diese Datei enthält dann sämtliche Befehle, die Sie zur Wiederherstellung Ihrer Datenbank benötigen, wenn der Fall eintreffen sollte. Bei der Kopie handelt es sich um eine im ASCII-Text gespeicherte Datei mit vollständiger SQL-Syntax. Auch ich habe das Thema »Backup« von MySQL selten beachtet, bis ich eines Besseren belehrt wurde und ein paar Tage Arbeit weg waren. Beispiel eines solchen Dumps:

$ mysqldump -uroot -pk4p6m3o3 -hlocalhost datenbankname > \
  backup_datenbankname.sql

Hiermit wird z. B. ein Dump von der Datenbank datenbankname gemacht. Die Ausgabe wird in die Datei backup_datenbankname.sql umgeleitet, worin sich jetzt ein komplettes Backup von datenbankname befindet. Wiederherstellen können Sie diese Sicherung ganz einfach mit:

$ mysql -uroot -pk4p6m3o3 -hlocalhost datenbankname < \
  backup_datenbankname.sql

Rheinwerk Computing

12.4.7 Grafische Clientdowntop

Alle Aufgaben lassen sich mit den mitgelieferten Mitteln von MySQL sehr effektiv realisieren. Aber häufig fehlt einem bei etwas größeren Projekten der Überblick zu den Datenbanken, Tabellen, Spalten und den Daten selbst. Hier kann man sich mit grafischen MySQL-Clients behelfen. Meistens handelt es sich dabei einfach um Frontends zu den Kommandozeilenwerkzeugen.

phpMyAdmin

phpMyAdmin dürfte wohl der bekannteste und meistverwendete Vertreter der grafischen Clients zu MySQL sein. Dabei kommt dieser Client ganz ohne Installation von Software aus. phpMyAdmin benötigt lediglich einen Server, auf dem es möglich ist, PHP-Skripte auszuführen. Meistens findet man phpMyAdmin bei den Internet Service Providern unter dem Einsatz von LAMP (Linux, Apache, MySQL, PHP/Perl). Sofern Sie z. B. Ihre Webseite auf einem Internet Service Provider haben, ist dies häufig die einzige Möglichkeit, direkt auf die einzelnen Tabellen, Zeilen, Spalten und Daten zuzugreifen. Denn nicht jeder ISP bietet einen Kommandozeilenzugang via SSH (Secure Shell). Allerdings bedarf es bei phpMyAdmin der gleichen Kenntnisse wie bei der Verwendung der MySQL-Shell.

MySQLCC

MySQLCC steht für MySQL Control Center und ist seit Mitte 2003 als installierbare Software verfügbar. Damit lassen sich dieselben Arbeiten wie bei der MySQL-Shell oder dem grafischen Frontend phpMyAdmin durchführen. MySQLCC ist kostenlos und steht unter GNU GPL-Lizenz.

KSQL und Knoda

Unter dem KDE-Desktop stehen Ihnen gleich zwei hervorragende grafische MySQL-Clients zur Verfügung, zum einen Knoda, den der Autor des Buchs gerne verwendet, und KSQL. Beide Clients bieten eine umfangreiche Funktionspalette, wobei es mit beiden Clients auch möglich ist, mit anderen Datenbanken als MySQL eine Verbindung aufzubauen. Ein weiteres interessantes Feature ist u. a. der Export von HTML und XML.


Rheinwerk Computing

12.4.8 MySQL-Crashkurdowntop

Sofern Sie noch keine MySQL-Kenntnisse besitzen, folgt hier ein kleiner Crashkurs zu MySQL mit einigen grundlegenden Befehlen. Diese Einführung erhebt keinerlei Anspruch, eine komplette Einführung in MySQL zu sein. Trotz eines gewissen Umfangs entspricht dieser Crashkurs aus der Sicht des Autors nicht mehr als dem berühmten Tropfen auf dem heißen Stein. Wenn Sie der Datenbank MySQL mächtig sind, können Sie diesen Abschnitt auch ein wenig überfliegen.

Um mit Datenbanken zu arbeiten, sind mehrere Schritte nötig. Logischerweise muss zuerst eine Datenbank angelegt werden, anschließend wird eine Tabelle benötigt, worin die Daten gespeichert werden. Hierzu ein schematischer Ablauf vom Anlegen der Datenbank bis zum Ausgeben von Daten:


Abbildung
Hier klicken, um das Bild zu vergrößern

Abbildung 12.1    Schematischer Ablauf vom Anlegen der DB bis zur Ausgabe


Um diese Schritte in MySQL zu realisieren, benötigen Sie Kenntnisse zu den MySQL-Befehlen, die Sie in den folgenden Kapiteln näher kennen lernen werden. Ich werde Ihnen diese Befehle anhand der MySQL-Shell (dem mysql-Client) näher bringen. Sie können, wenn Sie wollen, natürlich auch eines der grafischen Clientprogramme verwenden, um die SQL-Befehle auszuführen. Es wird empfohlen, die einzelnen Schritte, wie sie auf den folgenden Seiten dargestellt werden, auch selbst in der Praxis zu testen, um das Beschriebene nachvollziehen zu können.

Aufgeteilt werden die Befehle in zwei Kategorien – die DDL- und die DML-Befehle:

gp  DDL (Datendefinitionssprache) – Die Datendefinitionssprache wird genutzt, um die Struktur der abzuspeichernden Datenobjekte zu beschreiben – sprich: Datenbanken oder Tabellen anlegen, verändern, umbenennen usw. Ebenfalls gehört die Administration (Benutzer anlegen, Rechte verteilen ...) zum Bereich der DDL.
gp  DML (Datenmanipulationssprache) – Die Datenmanipulationssprache dient zum Einfügen, Ändern, Löschen und Lesen des Inhalts aller Datenbankobjekte. Dabei wird zwischen der Anfragesprache (Query Language) und der eigentlichen Datenmanipulationssprache, mit der abgespeicherte Datensätze manipuliert werden können, unterschieden.

Mit einem Satz: DDL beschreibt die Struktur und DML den Inhalt dieser Struktur.


Rheinwerk Computing

12.4.9 Datentypedowntop

Wie in C und in vielen anderen Sprachen gibt es auch in MySQL Datentypen. Datentypen sind die kleinste Einheit, die mit SQL-Befehlen manipuliert werden können. Die Datentypen werden dabei als Spaltenwert (Attribut) einer Tabelle zwingend verwendet. Und, wie ebenfalls in vielen anderen Sprachen, gibt es hierbei unterschiedliche Datentypen. Zum Glück sind Sie ja bereits (mindestens) einer Sprache mächtig, somit kann ich mir einige Erklärungen zu den Datentypen ersparen. Aufgeteilt werden die Datentypen in folgende Kategorien:

gp  Zeichen und Zeichenketten (einzelne Zeichen, Strings)
gp  Nummerische Werte (Zahlen (Ganzzahlen, Gleitpunktzahlen))
gp  Datums- und Zeitdatentypen

Zeichen(-ketten) und nummerische Werte als Datentypen sollten bei Ihnen eigentlich keine Wimper mehr zucken lassen. Aber anders als in vielen Programmiersprachen bietet MySQL auch einige Datentypen für Datums- und Zeitangaben.

Logischerweise müssen Sie sich auch bei MySQL Gedanken über den Sinn eines Datentyps machen. Zu klein gewählte Datentypen können bei Überschreitung der Typengrenze zur falschen Darstellung führen, und zu groß gewählte Datentypen verschwenden nur unnötig Platz und machen zudem noch die Datenbank erheblich langsamer.

In der folgenden Abbildung finden Sie einen kurzen Überblick zu den gängigsten Datentypen in MySQL:


Abbildung
Hier klicken, um das Bild zu vergrößern

Abbildung 12.2    Datentypen von MySQL im Überblick


Jetzt noch eine genauere Zusammenfassung zu den einzelnen Datentypen in MySQL:


Tabelle 12.1    Nummerische Datentypen

Datentyp Bedeutung Bereich Speicherbedarf
TINYINT sehr kleine Ganzzahl -128 bis 127 (0 bis 255) 1 Byte
SMALLINT kleine Ganzzahl -32768 bis 32767 (0 bis 65535) 2 Byte
MEDIUMINT mittelgroße Ganzzahl -8388608 bis 8388607  (0 bis 16777215) 3 Byte
INT Ganzzahl (Standard) -2147283648 bis 2147283647  (0 bis 4294967295) 4 Byte
BIGINT große Ganzzahl -9223372036854775808 +9223372036854775807  (0 bis 18446744073709551615) 8 Byte
FLOAT Fließkommazahl, einfache Genauigkeit -3,40282346638  bis -1,17549435138  , 0 und 1,17549435138  bis 3,40282346638  4 Byte
DOUBLE Fließkommazahl, doppelte Genauigkeit ~ -1,798308  bis ~ -2,225–  308  , 0 und ~ 2,225–  308  bis ~ 1,798308  8 Byte
DECIMAL(G,N) Fließkommazahl derLänge G mit n Nachkommastellen    G+2 Byte


Tabelle 12.2    Datums- und Uhrzeit-Datentypen

Datentyp Bedeutung Bereich Format Speicherbedarf
DATE Datum 1.1.1000 bis 31.12.9999 YYYY-MM-DD 3 Byte
DATETIME Datum und Uhrzeit 1.1.1000, 0:00:00 Uhr, bis 31.12.9999, 23:59:59 YYYY-MM-DD hh:mm:ss 8 Byte
TIMESTAMP UNIX-Zeit 1.1.1970 bis 19.01.2038   4 Byte
TIME Uhrzeit   hh:mm:ss 3 Byte
YEAR Jahreszahl 1901 bis 2155   1 Byte


Tabelle 12.3    Zeichenketten-Datentypen

Datentyp Bedeutung Länge Speicherbedarf
CHAR(G) Zeichenkette mit fester Größe G max. 255 Zeichen Größe G Byte
VARCHAR(G) Zeichenkette mit variabler Größe G max. 255 Zeichen Größe G Byte
TINYTEXT, TINYBLOB Sehr kleine Zeichenkette max. 255 Byte 2E8 – 1 Byte
TEXT, BLOB Kleine Zeichenkette max. 65535 Byte 2E16 - 1 Byte
MEDIUMTEXT, MEDIUMBLOB Mittelgroße Zeichenkette max. 16777215 Byte 2E24 - 1 Byte
LONGTEXT, LONGBLOB Große Zeichenkette max. 4294967295 Byte 2E32 - 1 Byte
ENUM Auflistung Auswahl nur eines Feldes 65535 Elemente
SET Auflistung Mehrfachauswahl 64 Elemente

(»BLOB«: Abk. f. »Binary Large Object«, z. B. Fotos oder Musikdateien)


Hinweis   In MySQL ist es übrigens egal, ob Sie Groß- oder Kleinschreibung verwenden. Es hat sich aber etabliert, die Statements großzuschreiben und die Feldnamen klein. Dadurch wird eine bessere Übersichtlichkeit erreicht.



Rheinwerk Computing

12.4.10 Datenbank anlegen, verwenden und löschedowntop

Jetzt soll mit den SQL-Befehlen begonnen werden. Als Beispiel wird eine einfache Datenbank verwendet, womit sich Adressen verwalten lassen – ist zwar ein wenig öde, aber zum Lernen genau das Richtige. Sie können (sollten) dabei die einzelnen SQL-Befehle nach Herzenslust testen.


Hinweis   Wie in C müssen Sie das Ende eines MySQL-Befehls auf dem Monitor mit einem Semikolon (oder aber auch mit dem Zeichen \g) abschließen.


Der erste Schritt ist das Anlegen einer neuen Datenbank. Starten Sie die MySQL-Shell, und gehen Sie dabei wie folgt vor:

$ mysql -uroot -hlocalhost -pk4p6m3o3
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1 to server version: 3.23.55-log
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> CREATE DATABASE adressen;
Query OK, 1 row affected (0.06 sec)

Mit dem Befehl CREATE DATABASE legen Sie eine neue Datenbank ohne Tabelle an. Idealerweise überprüft man, ob nicht schon eine Datenbank mit dem Namen existiert. Dies können Sie folgendermaßen abfragen:

mysql> CREATE DATABASE IF NOT EXISTS adressen;
Query OK, 0 rows affected (0.00 sec)

Mit IF NOT EXISTS wird überprüft, ob eine Datenbank mit dem Namen bereits existiert. Bedenken Sie aber auch, dass hierbei die Fehlermeldung (Database exists) nicht ausgegeben wird. Die Länge des Namens darf max. 64 Zeichen betragen – als Zeichen sind alle erlaubt, die auch für die Angabe von Dateien erlaubt sind.

Wollen Sie sich jetzt einen Überblick über die vorhandenen Datenbanken auf Ihrem System machen, steht Ihnen folgender Befehl zur Verfügung:

mysql> SHOW DATABASES;
+-------------+
| Database    |
+-------------+
| adressen    |
| dvd_archiv  |
| mail_archiv |
| mein_test   |
| mysql       |
| test        |
+-------------+
6 rows in set (0.26 sec)

Wenn Sie auf eine Datenbank zugreifen wollen, müssen Sie die gewünschte Datenbank erst auswählen. Auch dieser Vorgang lässt sich recht einfach realisieren:

mysql> USE adressen;
Database changed

Wenn Sie jetzt eine Datenbank wieder löschen wollen, können Sie hierfür den SQL-Befehl DROP DATABASE verwenden:

mysql> DROP DATABASE IF EXISTS adressen;
Query OK, 0 rows affected (0.00 sec)

Bitte beachten Sie dabei, dass Sie hiermit die Datenbank mitsamt den Tabellen unwiderruflich löschen.

Hierzu nochmals eine Übersicht zu den SQL-Befehlen zum Anlegen, Auswählen und Löschen einer Datenbank:


Tabelle 12.4    SQL-Befehle zum Anlegen, Auswählen und Löschen einer DB

Befehl Bedeutung
CREATE DATABASE <datenbankname>; Legt eine neue Datenbank an.
CREATE DATABASE IF NOT EXISTS <datenbankname>; Legt eine neue Datenbank an, wenn diese noch nicht existiert.
DROP DATABASE <datenbankname>; Löscht eine Datenbank.
SHOW DATABASES; Zeigt alle Datenbanken auf dem System an.
USE <datenbankname>; Wählt eine Datenbank aus.
mysqladmin CREATE <datenbankname> Legt eine Datenbank mit dem Kommandozeilenwerkzeug mysqladmin an.
mysqladmin DROP <datenbankname> Löscht eine Datenbank mit dem Kommandozeilenwerkzeug mysqladmin.


Rheinwerk Computing

12.4.11 Tabelle anlegedowntop

Nach dem Anlegen einer Datenbank können Sie die Tabellenstruktur festlegen. Neue Tabellen lassen sich recht einfach mit dem SQL-Befehl CREATE TABLE erzeugen. Als Parameter müssen Sie dabei Datenbankfelder und die Definitionen der Datentypen angeben. Für Sie als C-Programmierer sieht dies ähnlich aus wie bei der Definition eines Funktionsprototypen. Ein Unterschied in der Definition, im Gegensatz zu C, liegt darin, dass der Variablennamen vor dem Datentyp steht. Hierzu das Anlegen einer einfachen Tabellenstruktur:

mysql> CREATE DATABASE IF NOT EXISTS adressen;
Query OK, 1 row affected (0.00 sec)
mysql> CREATE TABLE privat(
    -> vname VARCHAR(25),
    -> nname VARCHAR(25),
    -> plz   INT,
    -> ort   VARCHAR(100),
    -> strasse VARCHAR(100),
    -> hausnr INT
    -> );
Query OK, 0 rows affected (0.25 sec)

Mehr ist nicht nötig, um eine einfache Tabelle zu definieren. Im Beispiel haben Sie auch gesehen, dass es ohne Probleme möglich ist, SQL-Befehle über mehrere Zeilen zu schreiben. Entscheidend ist letztendlich das Semikolon am Ende einer SQL-Anweisung.


Hinweis   Die Zeichenfolge »->« gehört übrigens zur Eingabeaufforderung des MySQL-Monitors und nicht zum Befehl! Anders als in einer Shell kann sich hierbei ein Befehl über mehrere Zeilen erstrecken, wobei allerdings dann auch nicht der ganze Befehl in die History übernommen wird.


Die allgemeine Syntax zur Erstellung einer neuen Tabelle sieht wie folgt aus:

CREATE TABLE <tabellennamen> ( <spaltennamen> <datentype>, ... );

Häufig wird die Frage gestellt, wie man eine neue Tabelle mit dem Inhalt einer anderen Tabelle anlegen kann. Dies ist einfacher, als Sie denken:

CREATE TABLE neue_Tabelle SELECT * FROM andere_Tabelle;

Schon finden Sie in neue_Tabelle dieselben Tabellen und denselben Inhalt vor wie bei andere_Tabelle (ein so genannter subquery). Auf SELECT wird noch ausführlich eingegangen.

Natürlich sind beim Anlegen einer neuen Tabelle noch viel mehr Angaben möglich: U. a. Erstellungsanweisungen, Tabellenoptionen oder Auswahlanweisungen sind eine Reihe von Parametern, die zusätzlich verwendet werden können. Wenn ich allerdings darüber schriebe, könnte ich gleich ein Buch zu MySQL schreiben – und muss mich somit bremsen –, wie zu Beginn schon erwähnt. Für noch mehr Details sei entsprechende Literatur (oder die Buch-CD) empfohlen. Dennoch sollen hierzu einige Dinge kurz beschrieben werden.


Rheinwerk Computing

12.4.12 Schlüsselfelder (Tabellen anlegendowntop

Schlüsselfelder werden benötigt, wenn Sie eine relationale Verknüpfung zwischen verschiedenen Tabellen herstellen wollen. Mit solch einem Schlüssel kann jeder Datensatz in der Tabelle eindeutig identifiziert werden. Man bezeichnet diesen als Primärschlüssel. Die einfachste und gewöhnlichste Methode, einen solchen Schlüssel für eine Tabelle zu definieren, ist es, in jeder Tabelle ein Feld mit einem Integer zu definieren. Wobei darauf geachtet werden sollte, dass solche Felder keine NULL-Werte (nicht mit NULL in C zu verwechseln) oder doppelte Einträge zulassen. Dafür werden die Erstellungsanweisungen vom CREATE TABLE-Befehl verwendet. Dies wird mit folgenden Vorgaben erledigt:

gp  NOT NULL – Vorgabe, dass keine leeren Werte gespeichert werden dürfen; folgt hinter der Angabe der Definition des Datentyps (z. B. plz INT NOT NULL).
gp  UNIQUE oder PRIMARY KEY – Vorgabe, dass keine doppelten Einträge für das Feld vorgenommen werden dürfen.
gp  AUTO_INCREMENT – Der Integer-Wert wird automatisch bei einem Neueintrag inkrementiert und hinzugefügt, falls er nicht angegeben wurde.

Rheinwerk Computing

12.4.13 Indizedowntop

Eine weitere Möglichkeit beim Anlegen einer Datenbank sind Indizes. Damit können die Suche und die Geschwindigkeit positiv verbessert werden. Vorwiegend werden Indizes verwendet, um folgende Vorgänge zu beschleunigen:

gp  die Suche nach Informationen von Daten
gp  Tabellen sortieren
gp  die Suche nach den größten und kleinsten Werten einer Tabelle
gp  die Abfrage über unterschiedliche Tabellen

Mit Indizes werden die Daten in einer Form aufbereitet, die es ermöglicht, sie bei der Suche schneller zu finden. Dazu wird eine extra Index-Datei (standardmäßig mit der Endung *.MYI für MyISAM) angelegt, die bei jedem Hinzufügen, Löschen bzw. Ändern von Daten in der Tabelle aktualisiert wird. Bedenken Sie allerdings, dass beim Anwachsen des Index gleichzeitig auch die Arbeit der Aktualisierung aufwändiger wird und somit die Performance darunter leiden kann. Um einen Index anzulegen, wird das Schlüsselwort INDEX verwendet. Wollen Sie z. B. einen Index für eine bestehende Tabelle erstellen, könnten Sie wie folgt vorgehen:

mysql> CREATE TABLE privat(
    -> vname VARCHAR(25),
    -> nname VARCHAR(25),
    -> plz   INT,
    -> ort   VARCHAR(100),
    -> strasse VARCHAR(100),
    -> hausnr INT
    -> INDEX meinindex (nname));
    -> );

So würde hiermit ein Index für den Nachnamen nname angelegt, der über den Namen meinindex angesprochen werden kann.


Rheinwerk Computing

12.4.14 Tabellentypen (Tabellen anlegendowntop

Die Daten von MySQL werden nicht einfach in einer ASCII-Form auf die Festplatte gespeichert, was den gleichzeitigen Zugriff auf die Daten erheblich verlangsamen würde. Vielmehr werden die Daten in einem bestimmten Tabellentyp gespeichert, der dafür verantwortlich ist, wie die Daten physikalisch auf der Festplatte gespeichert werden. Es gibt dabei eine Menge Tabellentypen, womit Sie sich in der Praxis allerdings recht selten auseinander setzen müssen. Gedanken machen müssen Sie sich, wenn Sie Transaktionen mit MySQL machen wollen – aber dies steht hier nicht zur Diskussion. Gewöhnliche Tabellentypen sind HEAP, HASH, ISAM oder BTREE. Sofern Sie also standardmäßig mit MySQL arbeiten, wie in diesem Buch, verwenden Sie den Tabellentyp MyISAM, der für MySQL konzipiert ist.


Rheinwerk Computing

12.4.15 Autowerte definieredowntop

Mit der Option AUTO_INCREMENT können Sie (wie der Name schon aussagen sollte) Zahlenwerte beim Anlegen eines neuen Datensatzes automatisch inkrementieren (hochzählen). Autowerte werden nicht selten zusammen mit Primärschlüsseln verwendet, um einen eindeutigen Wert automatisch zu erzeugen. Es sollte auch klar sein, dass Autowerte nur bei Integern verwendet werden können. Hier ein Beispiel, wie Sie solche automatischen Werte verwenden können.

CREATE TABLE eine_Tabelle( wert INT NOT NULL AUTO_INCREMENT,
                           name VARCHAR(100) );

Rheinwerk Computing

12.4.16 Tabellen umbenennen und änderdowntop

Wenn Sie eine Tabelle umbenennen, Felder, Indizes oder Schlüssel hinzufügen, löschen oder den Datentyp eines Feldes verändern wollen, dann steht Ihnen der Befehl ALTER TABLE zur Verfügung. Bevor Sie etwas verändern wollen, werden Sie sich sicherlich die Struktur der Tabellen zuvor ansehen wollen. Dies können Sie mit einem einfachen EXPLAIN <datenbankname> machen:

mysql> USE adressen;
Database changed
mysql> EXPLAIN privat;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| vname   | varchar(25)  | YES  |     | NULL    |       |
| nname   | varchar(25)  | YES  |     | NULL    |       |
| plz     | int(11)      | YES  |     | NULL    |       |
| ort     | varchar(100) | YES  |     | NULL    |       |
| strasse | varchar(100) | YES  |     | NULL    |       |
| hausnr  | int(11)      | YES  |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

Den Namen der Tabelle können Sie mit folgendem Befehl umbenennen:

ALTER TABLE <tabellenname> RENAME <neuer_tabellenname>;

Zum Umbenennen einer Tabelle können Sie auch alternativ RENAME alleine wie folgt verwenden:

RENAME TABLE <tabellenname> TO <neuer_tabellenname>;

Neue Felder können Sie mit ALTER TABLE und dem Befehl ADD hinzufügen:

mysql> ALTER TABLE privat ADD COLUMN telefon INT;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> EXPLAIN privat;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| vname   | varchar(25)  | YES  |     | NULL    |       |
| nname   | varchar(25)  | YES  |     | NULL    |       |
| plz     | int(11)      | YES  |     | NULL    |       |
| ort     | varchar(100) | YES  |     | NULL    |       |
| strasse | varchar(100) | YES  |     | NULL    |       |
| hausnr  | int(11)      | YES  |     | NULL    |       |
| telefon | int(11)      | YES  |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+
7 rows in set (0.00 sec)

Hier haben Sie zur Adressverwaltung das Feld für die Telefonnummer hinzugefügt. Hätten Sie die Telefonnummer an einer anderen Stelle platzieren wollen, hätten Sie den Befehl AFTER verwenden müssen:

mysql> ALTER TABLE privat ADD COLUMN test INT AFTER nname;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> EXPLAIN privat;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| vname   | varchar(25)  | YES  |     | NULL    |       |
| nname   | varchar(25)  | YES  |     | NULL    |       |
| test    | int(11)      | YES  |     | NULL    |       |
| plz     | int(11)      | YES  |     | NULL    |       |
| ort     | varchar(100) | YES  |     | NULL    |       |
| strasse | varchar(100) | YES  |     | NULL    |       |
| hausnr  | int(11)      | YES  |     | NULL    |       |
| telefon | int(11)      | YES  |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+
8 rows in set (0.00 sec)

Hier wurde die Variable test hinter der Spalte nname hinzugefügt. Wollen Sie einen neuen Eintrag am Anfang vornehmen, können Sie das Gegenstück FIRST verwenden. Wollen Sie den Eintrag von test in der Tabelle wieder löschen, benötigen Sie DROP:

mysql> ALTER TABLE privat DROP COLUMN test;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

Natürlich können Sie auch nachträglich neue Indexfelder (ADD INDEX), Unique-Felder (ADD UNIQUE) und Primärschlüssel (ADD PRIMARY) hinzufügen bzw. löschen (DROP). Eine genauere Beschreibung erspare ich mir hierzu.

Zum Verändern von bestehenden Feldern einer Tabelle stehen Ihnen CHANGE und MODIFY zur Verfügung. Das Ändern des Datentyps und/oder des Variablennamens können Sie mit CHANGE folgendermaßen durchführen:

mysql> ALTER TABLE privat CHANGE COLUMN telefon phone BIGINT;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql> EXPLAIN privat;
+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| vname   | varchar(25)  | YES  |     | NULL    |       |
| nname   | varchar(25)  | YES  |     | NULL    |       |
| plz     | int(11)      | YES  |     | NULL    |       |
| ort     | varchar(100) | YES  |     | NULL    |       |
| strasse | varchar(100) | YES  |     | NULL    |       |
| hausnr  | int(11)      | YES  |     | NULL    |       |
| phone   | bigint(20)   | YES  |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+
7 rows in set (0.00 sec)

Hiermit haben Sie den Variablennamen telefon in phone umbenannt und als neuen Datentyp BIGINT anstatt INT verwendet. Mit dem SQL-Befehl MODIFY hingegen können Sie nur den Datentypen verändern. Die Existenzberechtigung von MODIFY basiert auf Oracle-Kompatibilität, da CHANGE alle Anwendungsfälle des Veränderns bestehender Felder in Tabellen abdeckt.


Rheinwerk Computing

12.4.17 Daten einfügen, ändern und löschedowntop

Jetzt, nachdem die DDL-Elemente für die strukturelle Definition der Datenbank abgeschlossen ist, kann mit der eigentlichen Arbeit (wofür Datenbanken eben existieren) einer Datenbank begonnen werden.

An dieser Stelle sind eigentlich auch Sie als Programmierer angesprochen. Denn zur Arbeit mit den Daten werden Benutzerwerkzeuge und Schnittstellen verwendet. Im Beispiel werden Sie das Kommandozeilenwerkzeug mysql dazu verwenden. Alternativ können Sie hierfür auch einen grafischen Client verwenden, oder – das ist ja auch der Sinn dieses Kapitels – Sie programmieren eine eigene Benutzerschnittstelle (Client) zur MySQL-Datenbank (Server). Dabei können Sie sowohl Desktop-Anwendungen entwerfen als auch eigene Webapplikationen, die mit dem Browser zusammenarbeiten (in diesem Kapitel), verwenden.

Um aber jetzt eigene Clientanwendungen für MySQL zu entwickeln, benötigen Sie (vor allem) auch noch Kenntnisse der DML-Elemente zum Manipulieren von Daten.

Als Erstes wollen Sie wohl Datensätze in die Tabelle einfügen. Sie haben dabei mehrere Möglichkeiten – wobei Sie hier die einfachste verwenden werden, das Kommandozeilenwerkzeug mysql (wie gehabt). Auch hierbei können Sie gerne einen der grafischen Clients verwenden.

Datensätze einfügen können Sie mit dem SQL-Kommando INSERT. Zur Demonstration soll der erste Datensatz in die Tabelle adressen eingefügt werden:

mysql> USE adressen;
mysql> INSERT INTO privat(
    -> vname, nname, plz, ort, strasse, hausnr, phone )
    -> VALUES (
    -> 'Jürgen', 'Wolf', 86316, 'Friedberg', 'Musterweg',
    -> 123, 821123456 );
Query OK, 1 row affected (0.26 sec)

Es wird also der Tabellenname angegeben, gefolgt von den Tabellenspalten und den Werten (VALUES), die in den einzelnen Spalten gespeichert werden sollen. Beim Datentyp VARCHAR muss der String in einfache Hochkommata gesetzt werden. Die Tabellenspalten und Werte werden dabei durch Kommata getrennt. Wichtig dabei ist, dass Sie die Reihenfolge der Tabellenspalten auch bei den Werten einhalten. Dabei müssen Sie die Reihenfolge nicht stur so einhalten, wie Sie die Tabellenstruktur definiert haben. Sie können z. B. auch alles in der umgekehrten Reihenfolge schreiben:

INSERT INTO privat(
    -> phone, hausnr, strasse, ort, plz, nname, vname)
    -> VALUES (
    -> 0821123456,  123, 'Musterweg', 'Friedberg', 86316,
    -> 'Wolf', 'Jürgen');

Wichtig ist einfach nur, dass die Reihe der Spalten und Werte eingehalten wird und die Namen der Tabellenstruktur in den Spalten auch existieren. MySQL erlaubt auch – entgegen dem SQL-Standard –, dass mehrere Datensätze auf einmal eingefügt werden können:

mysql> INSERT INTO privat(
    -> vname, nname, plz, ort, strasse, hausnr, phone )
    -> VALUES (
    -> 'Jonathan', 'Wolf', 12345, 'Musterhausen', 
    -> 'Strassenweg', 1, 9112341 ),
    -> ('Fatma', 'Wolf', 34344, 'Schlumpfhausen', 
    -> 'Schlumpfweg',33, 7122343 );
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

Natürlich lassen sich hier mithilfe von SELECT Subquery-Datensätze von anderen Tabellen übernehmen:

INSERT INTO <tabellenname> ( <spaltenname>, ...) 
    SELECT <auswahlbedingung>;

Natürlich gibt es auch beim Einfügen einiges zu beachten. Vor allem Probleme beim Einfügen doppelter Datensätze gilt es, Herr zu werden. Aber hierauf soll nicht näher eingegangen werden.

Wenn eine Person umgezogen ist, müssen Sie deren Daten verändern. Der SQL-Befehl hierfür lautet UPDATE. Hier ein Beispiel dazu:

mysql> UPDATE privat
    -> SET plz=23456, ort='München', strasse='Schleichweg',
    -> hausnr=12, phone=89123412
    -> WHERE vname='Jonathan' AND nname='Wolf' LIMIT 1;
Query OK, 0 rows affected (0.27 sec)
Rows matched: 0  Changed: 0  Warnings: 0

Hier wurde die Adresse von Jonathan Wolf geändert. Gesprochen heißt dies: Aktualisiere in der Datenbank privat (UPDATE privat), verändere/setze neue Werte (SET) für plz 23456, ort ist München etc., ändere aber nur dort, wo (WHERE) die Daten nname=Wolf und (AND) vname=Jonathan sind. Der Zusatz LIMIT 1 weist den Datenbankserver an, den Befehl nach dem ersten Treffer abzubrechen, was bei großen Datenbeständen erhebliche Performance bringen kann. Natürlich können Sie auch mehrere Daten in einem Rutsch verändern:

mysql> UPDATE privat
    -> SET hausnr=1
    -> WHERE nname='Wolf';
Query OK, 2 rows affected (0.00 sec)
Rows matched: 3  Changed: 2  Warnings: 0

Somit haben Sie bei allen Werten, wo die Spalte nname den Wert 'Wolf' hat, die Hausnummer (hausnr) auf 1 gesetzt. Mit SET können Sie also einer gewünschten Spalte einen neuen Wert setzen.

Daten löschen können Sie mit dem SQL-Befehl DELETE folgendermaßen:

mysql> DELETE FROM privat WHERE ort='Friedberg';
Query OK, 1 row affected (0.00 sec)

Natürlich können Sie hierbei auch mehrere Bedingungen mit AND oder OR verknüpfen.


Rheinwerk Computing

12.4.18 Daten importieredowntop

Ein häufiger Anwendungsfall ist es, die Daten aus einer anderen Anwendung nach MySQL zu importieren. Häufig handelt es sich dabei um eine sehr wackelige Angelegenheit, die schon einiges an Erfahrung fordert. Eine falsche Feldzuordnung, und Sie haben den (Daten-)Salat. Denn gewöhnlich sind die Tabellen der Datenbanken nicht so einfach aufgebaut, wie dies im Buch demonstriert wird. Um Daten zu importieren, haben Sie folgende Möglichkeiten:

gp  Import über den SQL-Befehl INSERT. Dabei müssen die Daten in einem SQL-String vorliegen, so wie dieser z. B. bei einem Dump mit mysqldump zurückgegeben wird.
gp  Import über so genannte Delimited-ASCII-Dateien (z. B. CSV-Datei aus einer Tabellenkalkulation). Für den Import solcher Dateien wird der SQL-Befehl LOAD DATA INFILE oder das Kommandozeilenwerkzeug mysqlimport verwendet.
gp  Die ODBC-Schnittstelle.
gp  ... und natürlich die vielen Tools, die für den Dateiimport entwickelt wurden.

Rheinwerk Computing

12.4.19 Datenausgabdowntop

Jetzt fehlt Ihnen nur noch die Kenntnis zur Ausgabe von Daten. Dabei bedienen Sie sich des mächtigen Befehls SELECT, der Ihnen je nach Inhalt kein, ein oder mehrere Ergebnisse zurückliefert. Um Ihnen die Vielseitigkeit von SELECT zu beschreiben, müssten noch mindestens 50 Seiten mehr für das Buch reserviert werden. Daher hierzu nur die grundlegenden SELECT-Operationen. Wollen Sie alle Daten einer Tabelle ausgeben lassen, gehen Sie wie folgt vor:

mysql> SELECT * FROM privat;
+--------+-----+-----+--------------+-----------+------+-------+
|vname   |nname|plz  |ort           |strasse    |hausnr| phone |    
+--------+-----+-----+--------------+-----------+------+-------+
|Jürgen  |Wolf |86316|Friedberg     |Musterweg  |   123| …     |
|Jonathan|Wolf |12345|Musterhausen  |Strassenweg|     1| …     |
|Fatma   |Wolf |34344|Schlumpfhausen|Schlumpfweg|     1| …     |
+--------+-----+-----+--------------+-----------+------+-------+
3 rows in set (0.00 sec)

Das Sternchen (Wildcard) wird hierbei als Platzhalter für alle in der Tabelle vorhandenen Spalten verwendet. Mit FROM geben Sie an, welche Tabelle Sie selektieren wollen. Benötigen Sie nur Daten von einer einzelnen Spalte, gehen Sie so vor:

mysql> SELECT ort FROM privat;
+----------------+
| ort            |
+----------------+
| Friedberg      |
| Musterhausen   |
| Schlumpfhausen |
+----------------+
3 rows in set (0.00 sec)

Sind Sie nur an ganz speziellen Inhalten von Spalten interessiert, können Sie auch hier wieder den SQL-Befehl WHERE verwenden:

mysql> SELECT * FROM privat WHERE vname='Jürgen';
+--------+-----+-----+--------------+-----------+------+-------+
|vname   |nname|plz  |ort           |strasse    |hausnr| phone |    
+--------+-----+-----+--------------+-----------+------+-------+
|Jürgen  |Wolf |86316|Friedberg     |Musterweg  |   123| …     |
+--------+-----+-----+--------------+-----------+------+-------+
1 row in set (0.00 sec)

Sie können mit SELECT natürlich noch viel mehr und genauere Anfragen stellen. Die Abfrage kann sich dabei über mehrere verschiedene Tabellen des relationalen Datenbankmodells beziehen. Hierzu eine vollständige Syntax von SELECT:

SELECT <ausdruck> 
   FROM <tabellennamen>
   WHERE <bedingung>
   GROUP BY <feldname>
   HAVING <bedingung>
   ORDER BY <feldname>;

Es müssen dabei nicht alle Angaben verwendet werden, allerdings muss die Reihenfolge eingehalten werden. Sie können somit nicht erst ORDER BY verwenden und anschließend WHERE.

Die Ausgabe sortieren können Sie mit:

mysql> SELECT * FROM privat ORDER BY vname;
+--------+-----+-----+--------------+-----------+------+-------+
|vname   |nname|plz  |ort           |strasse    |hausnr| phone |    
+--------+-----+-----+--------------+-----------+------+-------+
|Fatma   |Wolf |34344|Schlumpfhausen|Schlumpfweg|     1| …     |
|Jonathan|Wolf |12345|Musterhausen  |Strassenweg|     1| …     |
|Jürgen  |Wolf |86316|Friedberg     |Musterweg  |   123| …     |
+--------+-----+-----+--------------+-----------+------+-------+
3 rows in set (0.00 sec)

Wobei standardmäßig in aufsteigender Reihenfolge sortiert wird. Natürlich können Sie auch nach zwei Kriterien sortieren:

mysql> SELECT * FROM privat ORDER BY nname, vname;
+--------+-----+-----+--------------+-----------+------+-------+
|vname   |nname|plz  |ort           |strasse    |hausnr| phone |    
+--------+-----+-----+--------------+-----------+------+-------+
|Fatma   |Wolf |34344|Schlumpfhausen|Schlumpfweg|     1| …     |
|Jonathan|Wolf |12345|Musterhausen  |Strassenweg|     1| …     |
|Jürgen  |Wolf |86316|Friedberg     |Musterweg  |   123| …     |
+--------+-----+-----+--------------+-----------+------+-------+
3 rows in set (0.00 sec)

Hier wird erst nach Nachnamen und anschließend nach dem Vornamen sortiert, wie dies z. B. auch in Telefonbüchern der Fall ist. Schließlich gibt es von einem Nachnamen meistens mehrere, weshalb ein Sortieren nach dem Vornamen auch sinnvoll erscheint. Wollen Sie hingegen in absteigender Form sortieren, müssen Sie am Ende DESC hinzufügen:

mysql> SELECT * FROM privat ORDER BY nname, vname DESC;
+--------+-----+-----+--------------+-----------+------+-------+
|vname   |nname|plz  |ort           |strasse    |hausnr| phone |    
+--------+-----+-----+--------------+-----------+------+-------+
|Jürgen  |Wolf |86316|Friedberg     |Musterweg  |   123| …     |
|Jonathan|Wolf |12345|Musterhausen  |Strassenweg|     1| …     |
|Fatma   |Wolf |34344|Schlumpfhausen|Schlumpfweg|     1| …     |
+--------+-----+-----+--------------+-----------+------+-------+
3 rows in set (0.00 sec)

Wollen Sie den Inhalt der Daten für andere Programme exportieren, wie dies z. B. für Tabellenkalkulationsprogramme gerne gemacht wird, bietet sich folgender Lösungsweg an:

mysql> SELECT * INTO OUTFILE 'test.csv'
    -> FIELDS TERMINATED BY ';' LINES TERMINATED BY '%'
    -> FROM privat;
Query OK, 3 rows affected (0.00 sec)

Jetzt können Sie die Datei test.csv in einer tabellenkalkulationsüblichen Form mit z. B. Open Office Calc oder Kspread öffnen.


Rheinwerk Computing

12.4.20 NULL ist 0 oder undefiniertdowntop

Die NULL-Marke hat bei MySQL eine andere Bedeutung. NULL bedeutet, dass ein Wert für das Feld fehlt – sprich: Der Wert ist unbekannt oder leer. NULL ist somit nicht 0 und auch, im Falle eines Strings, kein leerer String.


Rheinwerk Computing

12.4.21 Unscharfe Suchtoptop

Manchmal fällt einem partout nicht der genaue Name oder die genaue Ortschaft ein. Oder wie hat sich 'Wolf' 'Jonathan' gleich wieder geschrieben – war es jetzt 'Wolff' oder 'Wolf' ... – oder wie kann ich E-Mail-Adressen von einem bestimmten Provider ausfiltern? Für solche und viele weitere Möglichkeiten gibt es die unscharfe Suche mit den SQL-Befehlen LIKE und IN.

Sie suchen z. B. nach einer bestimmten Postleitzahl:

mysql> SELECT * FROM privat WHERE plz LIKE '%63 %';
+--------+-----+-----+--------------+-----------+------+-------+
|vname   |nname|plz  |ort           |strasse    |hausnr| phone |    
+--------+-----+-----+--------------+-----------+------+-------+
|Jürgen  |Wolf |86316|Friedberg     |Musterweg  |   123| …     |
+--------+-----+-----+--------------+-----------+------+-------+
1 row in set (0.00 sec)

Hier wird eine Postleitzahl ausgegeben, welche die Zahlenfolge 63 enthält. % wird als Wildcard verwendet. Oder wie lautete denn nun gleich wieder die Ortschaft, die mit …berg endete?

mysql> SELECT * FROM privat WHERE ort LIKE '%berg';
+--------+-----+-----+--------------+-----------+------+-------+
|vname   |nname|plz  |ort           |strasse    |hausnr| phone |    
+--------+-----+-----+--------------+-----------+------+-------+
|Jürgen  |Wolf |86316|Friedberg     |Musterweg  |   123| …     |
+--------+-----+-----+--------------+-----------+------+-------+
1 row in set (0.00 sec)

Soll dabei auf Groß- und Kleinschreibung geachtet werden, müssen Sie nur vor LIKE das Schlüsselwort BINARY setzen.

Schluss, aus und Ende. Da der Crashkurs eh schon länger geworden ist, muss jetzt Schluss damit sein. Sie wollen schließlich auch etwas programmieren. Und sofern Sie bereits Kenntnisse in MySQL haben, möchte ich Ihre Geduld nicht überstrapazieren.

Sie kennen jetzt die grundlegenden Befehle, um recht gut mit der MySQL-Datenbank zu arbeiten und um eigene Clientprogramme zu entwickeln – daher soll jetzt auch damit begonnen werden.

 << zurück
  
  Zum Rheinwerk-Shop
Neuauflage: Linux-UNIX-Programmierung
Neuauflage:
Linux-UNIX-
Programmierung

bestellen
 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchtipps
Zum Rheinwerk-Shop: Linux-Server






 Linux-Server


Zum Rheinwerk-Shop: Das Komplettpaket LPIC-1 & LPIC-2






 Das Komplettpaket
 LPIC-1 & LPIC-2


Zum Rheinwerk-Shop: Linux-Hochverfügbarkeit






 Linux-
 Hochverfügbarkeit


Zum Rheinwerk-Shop: Shell-Programmierung






 Shell-
 Programmierung


Zum Rheinwerk-Shop: Linux Handbuch






 Linux Handbuch


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
Info





Copyright © Rheinwerk Verlag GmbH 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern