Praxis mit MySQL


Nun wollen wir den MySQL Datenbank Server auch praktisch einsetzen. Um den MySQL Datenbank Server im Alltag anzusprechen, müssen wir die standardisierte Datenbanksprache "SQL" einsetzen. An dessen Handhabung muß man sich erst gewöhnen. Dazu haben wir ein Beispiel ausgearbeitet, welches SQL in der Praxis zeigt.

Basics

MySQL stellt eine Reihe von Klientprogrammen zur Verfügung. Wir benötigen hier nur das SQL-Interpreter. Dieses Programm setzt einzelne SQL-Kommandos an den MySQLDatenbankserver ab. Damit wir uns um keine Benutzerrechte kümmern brauchen, arbeiten wir als root-Benutzer. Dies ist zwar nicht elegant, aber als Beispiel zweckmäßig. Zuerst benötigen wir mal eine Datenbank. Unsere Datenbank hat die Aufgabe die Daten der aktuellen Hotel-Kunden zu verwalten. Gewöhnlich mietet jeder Kunde ein bestimmtes Zimmer für einen gewissen Zeitraum. Zur Absicherung läßt man sich überlicherweise den kompletten Namen und seine Telefon-Nummer geben. Diese Daten werden dann in der Datenbank abgelegt. Also erzeugen wir jetzt solch eine MySQL Datenbank.

MySQL-Datenbanken anlegen

Eine relationale Datenbank ist einfach zu erzeugen. Mittels des Kommandos CREATE DATABASE der SQL-Datenbanksprache kann man eine Datenbank anlegen. Dabei muß der Datenbankname als Parameter mit angegeben werden. Sollte diese Datenbank bereits existieren, gibt der SQL-Interpreter eine Fehlermeldung zurück. Nun legen wir mit CREATE DATABASE DB_HOTEL die Datenbank »db_hotel« an. Welche Datenbanken auf dem MySQLDatenbankserver bereitstehen, kann über das SQL-Statement SHOW DATABASES erfragt werden. Dort sollte jetzt auch unsere Datenbank vorzufinden sein. Im Detail sind das Ganze dann so aus:

mysql> create database db_hotel;
Query OK, 1 row affected (0.02 sec)
mysql> show databases;
+-----------+
| Database |
+-----------+
| db_hotel |
| mysql |
| test |
+-----------+
3 rows in set (0.00 sec)

Die Datenbanken »mysql« und »test« legt MySQL standardmäßig an. Während in derDatenbank mysql die Benutzerrechte hinterlegt sind, ist die Datenbank »test« leer. Konnte die Datenbank erfolgreich angelegt werden, ist dies an der Meldung »Query OK« zu erkennen. Allerdings haben wir hiermit noch keinen Zugriff auf diese Datenbank. Maß muß die betreffende Datenbank zuerst auswählen. Mittels des SQL-Statements USE DB_HOTEL ist dies schnell erledigt. Jetzt wollen wir natürlich auch Daten ablegen. Dazu muß bei jeder Datenbank eine konkrete interne Tabellenstruktur definiert werden. Darüber gibt man an, wie die Datenbank intern aufgebaut ist. Innerhalb solch einer Tabelle werden abgrenzbare Einheiten (Entitäten) abgelegt. In unserem Beispiel entspricht jeder Hotelkunde einer konkreten Entität oder Einheit. Zu jedem Hotelkunden gehören sein Name, die Telefonnummer, die Zeitspanne und sein Zimmertyp. Laut der Datenbanktheorie muß jede Tabelle standardmäßig über einen Primärschlüssel verfügen. Darüber wird intern die Verwaltung ermöglicht. Jeder Primärschlüssel entspricht einer einwandfrei identifizierbaren Kennung, welche nur einmal vorkommt. In jeder Tabelle kann es maximal ein einzigen Primärschlüssel geben. Mit Hilfe des Attributes PRIMARY KEY wird der eindeutiger Primärschlüssel festgelegt. Für den Primärschlüssel legen wir das separate Datenfeld ID an. Also legen wir die Datenbanktabelle »db_hotel_daten« an. Diese Tabelle enthält die Datenbankfelder Nachname, Vorname, Telefon-Nummer, Aufenthaltsdauer und den Zimmertyp Als Datentyp für die einzelnen Felder wird der Typ CHAR verwendet. So läßt sich auch die Länge des Datenfeldes konkret bestimmen. Über die Datenbanksprache SQL lässt sich über CREATE TABLE so eine Tabelle erzeugen. Hier die detailiertere Vorgehensweise:

mysql> use db_hotel;
Database changed
mysql> create table db_hotel_daten (
id char(3) not null,
nachname char(20),
vorname char(20),
telnr char(20),
zimmer char(20),
dauer char(3),
primary key (id));
Query OK, 0 rows affected (0.00 sec)

Ob die Tabelle erfolgreich angelegt werden konnte, ist an der Meldung »Query OK« zu erkennen. Alle Tabellen die in einer bestimmten Datenbank enthalten sind, lassen sich in SQL über SHOW TABLES auflisten. Dort sollte unsere neue Tabelle jetzt auftauchen.

mysql> show tables;
+---------------------+
| Tables in db_hotel |
+---------------------+
| db_hotel_daten |
+---------------------+
1 row in set (0.00 sec)

Der Datenbank-Tabellenaufbau

Jetzt ist natürlich ebenso wichtig, ob die Tabellenstruktur von MySQL auch korrekt angelegt

werden konnte. Dies kann über das SQL-Statement DESCRIBE DB_HOTEL_DATEN in

Erfahrung bringen. Dadurch wird der konkrete Aufbau der Tabelle angezeigt. Dort sind die

einzelnen Tabellenfelder mit ihren Datentypen aufgelistet. Ebenso ist dort angegeben,

welches Datenfeld als Verwaltungsschlüssel dient und ob ein Datenfeld zwigend einen Inhalt

besitzen muß. Zusätzlich gibt es Beschreibungstext für jedes Datenfeld.

mysql> describe db_hotel_daten;

+----------+----------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+----------+----------+------+-----+---------+-------+

| id | char(3) | | PRI | | |

| nachname | char(20) | YES | | NULL | |

| vorname | char(20) | YES | | NULL | |

| telnr | char(10) | YES | | NULL | |

| zimmer | char(20) | YES | | NULL | |

| dauer | char(3) | YES | | NULL | |

+----------+----------+------+-----+---------+-------+

6 rows in set (0.00 sec)

Datenbank-Tabellen anpassen

Sollte die Datenbanktabelle fehlerhaft sein oder doch anders aussehen, kann dies

nachträglich geändert werden. Über die Datenbanksprache SQL läßt sich über ALTER TABLE

die Tabellenstruktur noch entsprechend anpassen. Hierüber läßt sich der Tabellenname noch

abändern. Ebenso kann ein hierüber geändert oder sogar gelöscht werden. Angenommen

man will den Tabellenname geändern haben. Über ALTER TABLE DB_HOTEL_DATEN

RENAME DB_HOTEL ist dies eine Leichtigkeit. Ebenso lassen sich einzelne Tabellenfelder

auch wieder löschen. Um das Tabellenfeld »vorname« zu löschen, hilft folgende

Kommandoanweisung ALTER TABLE DB_HOTEL DROP VORNAME. Genauso läßt sich der

Name eines Tabellenfeldes abändern. Dies geht über das Kommando ALTER DB_HOTEL

CHANGE ZIMMER AS ZIMMERTYP. Im Detail sieht das dann so aus:

mysql> alter table db_hotel_daten rename db_hotel;

Query OK, 0 rows affected (0.01 sec)

mysql> alter table db_hotel drop vorname;

Query OK, 0 rows affected (0.00 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> alter table db_hotel change zimmer zimmertyp char(20);

Query OK, 0 rows affected (0.01 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> describe db_hotel;

+-----------+----------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+-----------+----------+------+-----+---------+-------+

| id | char(3) | | PRI | | |

| nachname | char(20) | YES | | NULL | |

| telnr | char(20) | YES | | NULL | |

| zimmertyp | char(20) | YES | | NULL | |

| dauer | char(3) | YES | | NULL | |

+-----------+----------+------+-----+---------+-------+

5 rows in set (0.00 sec)

Tabelle mit Daten bestücken

Nun sollte die Datenbanktabelle noch mit entsprechenden Daten gefüllt werden. Diese

Datenbasis kann mit Hilfe von SQL-Statements dann konkret analysiert werden. So kann

man verschiedene Sichten auf eine Datenbank aufbauen. Je nach Anwendungsbereich kann

man sich die Daten flexibel anzeigen lassen. Einzelne Datensätze lassen sich mit Hilfe des

SQL-Kommandos INSERT INTO in eine bestimmte Tabelle einfügen. Als Parameter muß der

Tabellenname dabei angegeben werden. Mit Hilfe des Attributes VALUES wird der Datensatz

konkret definiert. Dies ist die einfachste Variante. Es ist aber auch möglich über

INSERT...SELECT zu gehen. Hierbei werden die Informationen des Datensatzes über eine

Unterabfrage erzeugt und in die Tabelle geschrieben. Mittels des Kommandos SET läßt sich

angeben, in welche Tabellenfelder die Daten hineingeschrieben werden sollen. Wir legen

hier die Daten nach der einfachen Variante an. Dies sieht im Detail dann so aus:

mysql> insert into db_hotel values ("1","Peters","022854321","Doppel-

Deluxe","2Wochen");

Query OK, 1 row affected (0.00 sec)

mysql> insert into db_hotel values ("2","Frenkens","022889653","Einzel-

Einfach","1Wochen");

Query OK, 1 row affected (0.00 sec)

mysql> insert into db_hotel values ("3","Schnitzer","022856842","Einzel-

Einfach","1Tag");

Query OK, 1 row affected (0.00 sec)

mysql> insert into db_hotel values ("4","Altermann","022848765","Doppel-

Deluxe","5Tag");

Query OK, 1 row affected (0.00 sec)

Konnten die einzelnen Datensätze angelegt werden, ist dies an der Erfolgsmeldung »Query

OK« ersichtlich. Hiermit verrfügt unsere MySQL-Datenbank über vier Datensätze. Allerdings

ist es ziemlich umständlich alle SQL-Statements eingeben zu müssen. Es geht auch

einfacher.

Die Aufgaben einfacher machen

Der MySQL Interpreter kann aber auch Textdateien verarbeiten. Es ist kein Problem eine

bestimmte Textdatei in die Datenbank hineinzuladen. Hiermit läßt sich eine Menge Arbeit

komfortabel einsparen. Dazu steht das Kommando LOAD DATA INFILE bereit. Damit dies

auch funktioniert, muß die Textdatei einen bestimmten Aufbau besitzen. Hierfür sind die

einzelnen Dateninformationen für einen Datensatz durch ein Komma voneinander zu

trennen. Zusätzlich muß jedes Zeilenende überall mit einem Carried Return (\n)

abgeschlossen sein. Durch das Schlüsselwort LOCAL wird angegeben, daß sich die Datei im

lokalen Dateisystem befindet. Hierüber läßt sich ein konkretes Verzeichnis angeben. Eine

entsprechende Textdatei für unsere Tabelle »db_hotel«"könnte so aussehen:

Datei: db_hotel.txt

Peters,022854321,Doppel-Deluxe,2Wochen

Frenkens,022889653,Einzel-Einfach,1Wochen

Schnitzer,022856842,Einzel-Einfach,1Tag

Altermann,022848765,Doppel-Deluxe,5Tag

Mit dem folgenden SQL-Kommando ist es kein Problem die Textdatei »db_hotel.txt« mit

ihren Datensätzen in unsere Datenbanktabelle »db_hotel« reinzuladen. In welche

Tabellenfelder die Daten übernommen werden, wird über das Schlüsselwort FIELDS

TERMINATED BY angegeben. Das komplette Kommando hierzu sieht so aus:

mysql> load data local infile "/root/tmp/db_hotel.txt" into table db_hotel

fields terminated by","(nachname,telnr,zimmertyp,dauer);

Query OK, 4 rows affected (0.00 sec)

Records: 4 Deleted: 0 Skipped: 0 Warnings: 0

Datenbank-Abfragen definieren

Der Hauptnutzen einer Datenbank ist aber , daß man konkrete Abfragen definieren kann

und so verschiedene Sichten des Datenbestandes als Ergebnis erhält. Die Abfragen

definieren einen konkrete Fragestellung in einen bestimmten Kontext. Beispielsweise:

Wieviel Kunden haben ein Hotelzimmer laut der Tabelle »db_hotel« bestellt. Mittels einer

Abfrage in SQL läßt sich leicht eine Antwort hierauf finden. Über das Kommando SELECT *

FROM db_hotel werden uns alle Datensätze der Datenbanktabelle aufgelistet. Hieran sehen

wir, daß unsere eingegebenen Datensätze auch auf dem MySQL-Datenbankserver abgelegt

worden sind.

mysql> select * from db_hotel;

+----+-----------+-----------+----------------+-------+

| id | nachname | telnr | zimmertyp | dauer |

+----+-----------+-----------+----------------+-------+

| 1 | Peters | 022854321 | Doppel-Deluxe | 2Wo |

| 2 | Frenkens | 022889653 | Einzel-Einfach | 1Wo |

| 3 | Schnitzer | 022856842 | Einzel-Einfach | 1Ta |

| 4 | Altermann | 022848765 | Doppel-Deluxe | 5Ta |

+----+-----------+-----------+----------------+-------+

4 rows in set (0.00 sec)

Komplexe SQL-Abfragen definieren

Je nach Situation lassen sich noch komplexere SQL-Abfragen definieren. Dies ist in der

Praxis häufig notwendig. Oft wird als Ergebnismenge eine Reihe von Datensätzen oder

Entitäten zurückgeliefert.

In unserer Tabelle db_hotel haben zwei Personen den Zimmertyp Doppel-Deluxe vorbestellt.

Wenn jedoch nicht genug Zimmer frei sind, kann dies zu Problemen führen. Also muß man

im Praxisalltag nachfragen, wieviel Personen einen bestimmten Zimmertyp bestellt haben.

Über die SQL Datenbanksprache ist dies einfach formuliert. Das folgende SQL-Statement

führt dies aus:

SELECT * FROM db_hotel WHERE zimmertyp = »Doppel-Deluxe«;

Die Anzahl der Ergebniszeilen gibt an, wieviel Personen diesen Zimmertyp bestellt haben.

Die Ausgabe der Ergebnismenge läßt sich dabei gezielt steuern. Beispielsweise kann man

angeben, daß die Ergebnismenge nach Nachnamen sortiert ausgegeben werden soll. Dies ist

nützlich, wenn die Ergebnismenge sehr groß ist und es nicht möglich ist den Überblick zu

wahren. Bei größeren Datenbanken kann schnell zu Ergebnismenge über 100

Datensatzeinträgen kommen. Beispielsweise können in einer Versicherungsdatenbank leicht

einige Einträge mit dem Famliennamen Müller zusammenkommen. So sehen die

entsprechenden SQL-Statements hierzu aus:

mysql> select * from db_hotel where zimmertyp = "Doppel-Deluxe";

+----+-----------+-----------+---------------+-------+

| id | nachname | telnr | zimmertyp | dauer |

+----+-----------+-----------+---------------+-------+

| 1 | Peters | 022854321 | Doppel-Deluxe | 2Wo |

| 4 | Altermann | 022848765 | Doppel-Deluxe | 5Ta |

+----+-----------+-----------+---------------+-------+

2 rows in set (0.00 sec)

mysql> select * from db_hotel where zimmertyp = "Doppel-Deluxe" order by

nachname;

+----+-----------+-----------+---------------+-------+

| id | nachname | telnr | zimmertyp | dauer |

+----+-----------+-----------+---------------+-------+

| 4 | Altermann | 022848765 | Doppel-Deluxe | 5Ta |

| 1 | Peters | 022854321 | Doppel-Deluxe | 2Wo |

+----+-----------+-----------+---------------+-------+

2 rows in set (0.00 sec)

Die Abfrage sieht zuerst sehr komplex aus, ist aber insgesamt leicht zu verstehen. Auch

sogenannte Wildcards lassen sich in SQL-Abfragen verwenden. Somit stellt es kein Problem

dar nachzufragen, welche Personen mit einem »M« im Nachnamen anfangen. Die

betreffende SQL Abfrage hierzu sieht so aus: SELECT * FROM db_hotel WHERE NACHNAME

= »P%«; Als Wildcard kommt hier das Zeichen »%« vor, womit alle Zeichen nach dem

Anfangsbuchstaben »M« akzeptiert werden. Hierüber lassen sich wirklich flexible Abfragen

sehr einfach realisieren. Bis jetzt waren die Abfrage-Definitionen leicht. Schwieriger wird es,

wenn Verknüpfungen innerhalb von SQL-Abfragen vorkommen. Beispielsweise wenn die

Datensätze gesucht werden sollen, wo eine Person den Namen »Peters« trägt und

gleichzeitig den Zimmertyp »Doppel-Deluxe« bestellt hat. Hierzu wird der UND-Operator

(&&) in der SQL-Abfrage verwendet. Die Abfrage dafür dürfte dann so aussehen: SELECT *

FROM db_hotel WHERE (nachname = »Peters«) && where (zimmertyp = »Doppel-Deluxe«).

Im Detail sehen die einzelnen Abfrageergebnisse dann so aus:

mysql> select * from db_hotel where (nachname like "P%");

+----+----------+-----------+---------------+-------+

| id | nachname | telnr | zimmertyp | dauer |

+----+----------+-----------+---------------+-------+

| 1 | Peters | 022854321 | Doppel-Deluxe | 2Wo |

+----+----------+-----------+---------------+-------+

1 row in set (0.00 sec)

select * from db_hotel where (nachname="Peters") && (zimmertyp="Doppel-

Deluxe");

+----+----------+-----------+---------------+-------+

| id | nachname | telnr | zimmertyp | dauer |

+----+----------+-----------+---------------+-------+

| 1 | Peters | 022854321 | Doppel-Deluxe | 2Wo

+----+----------+-----------+---------------+-------+

1 row in set (0.00 sec)

Mit SQL einfacher arbeiten

Die Arbeit braucht man aber nicht unbedingt über den mysql Client abzuwickeln. Denn dies

ist ziemlich umständlich und zeitraubend, da alle SQL-Kommandos am Prompt einzutippen

sind. Viel eleganter ist es über das Datenbankwerkzeug phpMyAdmin zu gehen. Über eine

grafische Oberfläche geht halt alles komfortabler. Dieses erlaubt einzelne SQL-Kommandos

innerhalb einer Textdatei abzulegen. So lassen sich komplette Vorgänge in Form von

einzelnen Abfragen zusammen an den MySQL-Datenbankserver übermitteln. Diese

einzelnen Kommandos werden dann zeilenweise vom MySQL Datenbankserver abgearbeitet.

Die MySQL-Befehle:

Mysql Dies ist der MySQL-Klient. Mit diesem können alle Adminstrationsaufgaben erledig

Mysql.server Dies ist das Start/Stop Skript. Hiermit wird der Server gestartet

Mysql_install_db Dies ist das Skript, welches zu Beginn die MySQL-Datenbank installiert

Mysql_set_permissio

n

Dies ist ein Perl-Skript, welche auf einfache Art die Rechte der MySQL-Datenbank

Mysqlshow Dies zeigt alle installierten Datenbanken des MySQL-Servers an

Mysql_access Dies ist ein Werkzeug, um die Rechte innerhalb von MySQL zu vergeben

Mysqdump Dies ist ein Werkzeug, um die Datenbankdaten oder auch einzelne Tabellen auf de

sichern

Mysqlimport Dies ist ein Werzeug, um ASCII Dateninhalte in eine Tabelle hineinzulesen