Virtual OS/2 International Consumer Education
VOICE-Homepage: http://de.os2voice.org
April 2004

Inhaltsverzeichnis
< Vorherige Seite | Nächste Seite >
Artikelverzeichnis

editor@os2voice.org


Auf gute Zusammenarbeit: MySQL und OS/2
Teil 3: Consolen- und SQL-Befehle

Von Wolfgang Draxler © April 2004

Nun kommen wir zum dritten Teil meines Artikels. Diesmal werden wir uns näher mit den Console-Befehlen und mit der Therorie von SQL beschäftigen. Als Beispiel werden wir eine Adreßdatenbank erstellen.

Für die Erstellung der Datenbank "Adressen" werden wir das WPS-Objekt Create Database, das wir im letzten Artikel erstellt haben, verwenden.

Nach dem Drücken von Öffnen bzw. open wird die Datenbank erstellt. Nun öffnen Sie die MySQL-Console und geben folgenden Befehl ein:

mysql> show databases;
+------------+
| Database   |
+------------+
| adressen   |
| mysql      |
| test       |
+------------+
3 rows in set (0.00 sec)

Wie Sie sehen, hat das Erstellen der Datenbank funktioniert. Nun wechseln Sie mit dem Befehl "use" in die neu angelegte Datenbank "adressen":

mysql> use adressen;
Database changed

Um weiterzumachen ist es jetzt notwendig, ein bißchen Theorie durchzunehmen. Prinzipiell unterscheiden wir in der Console zwei Arten von Befehlen:

  1. Die Console-Befehle (anzuzeigen mit dem Befehl Help)
  2. Die SQL-Befehle

Die Console-Befehle

Besprechen wir kurz die Console-Befehle. Dafür werden wir - wie oben bereits erwähnt - den Befehl "Help" eingeben. Damit erhalten wir folgende Ausgabe:

mysql> help
help    (\h)    Display this help.
?       (\?)    Synonym for `help'.
clear   (\c)    Clear command.
connect (\r)    Reconnect to the server. Optional arguments are db and host.
edit    (\e)    Edit command with $EDITOR.
ego     (\G)    Send command to mysql server, display result vertically.
exit    (\q)    Exit mysql. Same as quit.
go      (\g)    Send command to mysql server.
nopager (\n)    Disable pager, print to stdout.
notee   (\t)    Don't write into outfile.
pager   (\P)    Set PAGER [to_pager]. Print the query results via PAGER.
print   (\p)    Print current command.
quit    (\q)    Quit mysql.
rehash  (\#)    Rebuild completion hash.
source  (\.)    Execute a SQL script file. Takes a file name as an argument.
status  (\s)    Get status information from the server.
tee     (\T)    Set outfile [to_outfile]. Append everything into given outfile.
use     (\u)    Use another database. Takes database name as argument.
help, \h, \?
Ausgabe bzw. Anzeigen der Hilfe
clear, \c

Wenn Sie einen Befehl (egal ob Console- oder SQL-Befehl) eingeben und an einer beliebigen Stelle darin den Befehl \c verwenden, wird die aktuelle Eingabe ignoriert und es erscheint wieder der Prompt:

mysql> select * from \c
mysql>

Wie wir sehen, wird der eingegebene Befehl ignoriert.

connect, \r
Baut wieder eine Verbindung zur Datenbank auf.
edit, \e
Ruft einen Editor auf (in meinem Fall ist es vi.exe). Damit können Sie diverse SQL-Befehle bzw. SQL-Skripts bearbeiten. Mit der Enviroment-Variable set Editor gibt man an, welcher Editor aufgerufen wird. z.B. set editor=d:\os2\e.exe. Wenn Sie nun die Console aufrufen und den Befehl edit ausführen, erscheint der OS/2-Systemeditor.
ego, \G
Schickt einen SQL-Befehl an die Datenbank und gibt dessen Ergebnis zeilenweise aus.
exit, \q
Beendet die Console.
go, \g, ;
Schickt einen SQL-Befehl an die Datenbank und gibt dessen Ergebnis in Tabellenform aus.
tee, \T und notee, \t
Mit diesen Befehle können Sie das Protokollieren ein- bzw. ausschalten. Bei eingeschaltetem Protokollieren werden alle Ein- und Ausgaben in die mit angegebene Datei geschrieben. z.B. tee d:\mysql.log
pager, \P, nopager
Wird unter OS/2 nicht unterstützt.
print, \p
Bei diesem Befehl bin ich etwas überfragt. Ich habe einiges probiert, aber nicht herausfinden können, wie der Befehl unter OS/2 funktionieren soll.
quit, \q
Macht das gleiche wie der Befehl exit: Die Console wird beendet.
rehash, \#
Damit wird der Hash-Mechanismus der Datenbank neu aufgebaut.
source, \.
Führt die angegebene Datei aus. Erstellen Sie mit einem Editor eine Datei (z.B. F:\os2_prog\datenbank\mysql\bin\test.sql) mit dem Inhalt show databases; Dann geben Sie in der Console den Befehl source test.sql ein. Wie Sie sehen, werden die in der Datei angegebenen Befehle ausgeführt.
status, \s
Damit werden diverse Informationen über eine Datenbank-Verbindung angezeigt.
use, \u
Diesen Befehl haben wir schon öfters verwendet. Damit wird die zu verwendende Datenbank ausgewählt.

Die SQL-Befehle

Nun wenden wir uns den SQL-Befehlen zu. In SQL (und so auch in MySQL) gibt es eine Handvoll Befehle, die sich in drei Bereiche unterteilen lassen.

  1. In DDL (Data Definition Language): Diese Befehle erstellen, ändern oder löschen die Struktur der Datenbank. Z.B.:

    create
    Erstellt ein Datenbank-Objekt (z.B. Datenbank, Tabelle, Index usw.). create Database haben wir beispielsweise indirekt schon bei der Erstellung der Datenbank "Adressen" verwendet.
    drop
    Löschen von Datenbank-Objekten
    alter
    Ändern von Datenbank-Objekten
  2. In DCL (Data Control Language): Diese Befehle steuern die Rechte und Zugriffe auf die Datenbank. Z.B.:

    grant
    Rechte vergeben.
    revoke
    Rechte wieder entziehen.
  3. Der letzte Bereich nennt sich DML (Data Manipulation Language). Diese Befehle lesen, löschen oder ändern Sätze in einer oder mehreren Tabellen. (Bei anderen Datenbanken, wie z.B. Oracle, können sich diese Befehle auch auf sogenannte Views/Abfragen beziehen. Momentan gehe ich nicht näher darauf ein, weil MySQL für OS/2 diese Views nicht unterstützt.) Zu dieser Gruppe gehören folgende Befehle:

    select
    Liest Daten aus einer oder mehren Tabellen anhand angegebener Kriterien.
    insert
    Speichert einen oder mehrere neuen Sätze in eine Tabelle.
    update
    Ändert einen oder mehrere Sätze in einer Tabelle.
    delete
    Löscht einen oder mehrere Sätze aus einer Tabelle.

Eine Tabelle ist Bestandteil einer Datenbank (oder, um es so zu sagen: Eine Datenbank enthält eine beliebige Anzahl von Tabellen). Eine Tabelle ist dabei nichts anderes als eine zweidimensionale Liste. Tabellen können verschiedenartige Typen von Werten (also Zahlen, Texte, Datum, Bilder usw.) speichern.

Der Name der Tabelle ist innerhalb der Datenbank eindeutig. Es ist aber möglich, daß Tabellen mit gleichen Namen in mehreren Datenbanken existieren dürfen.

Eine Tabelle kann mehrere Indizes besitzen. Ein Index hilft MySQL bei der Suche nach Datensätzen in Tabellen. Man könnte dies mit dem Stichwortverzeichnis eines Buchs vergleichen. Um einen Begriff im Buch zu suchen, schauen Sie vorher im Verzeichnis nach und schlagen dann die entsprechend angegebene Seite auf. Sie könnten theoretisch auch das Buch von vorne bis hinten (oder umgekehrt) nach dem Begriff durchsuchen. Nur dauert das bei einem dicken Buch sehr lange. Probieren Sie das mal bei einem 500seitigen Buch. Da werden Sie wahrscheinlich Tage wenn nicht sogar Wochen brauchen.

Laut meinen Informationen kann MySQL bis zu 32 Indizes pro Tabelle verwenden. Um den Index zu bilden, können ein oder mehrere Felder verwendet werden. Der aus den Feldern zusammengesetzte Begriff wird auch Key (Schlüssel) genannt.

Ein besonderer Index ist der Primärindex ("primary index"). Dieser darf nur einmal pro Tabelle angelegt werden, und seine "Keys" müssen eindeutig sein, d.h. es dürfen keine doppelten Einträge im Index vorkommen.

Um dies gleich zu veranschaulichen, werden wir jetzt eine Tabelle "Land" anlegen. Als erstes sollte man sich immer überlegen, welche Felder (inklusive Typ und Länge), Primärindex und andere Indizes für die Tabelle benötigt werden. Eine spätere Änderung ist zwar möglich, produziert aber einen größeren Aufwand.
Für unsere Adreßdatenbank reicht folgende Struktur.

Feldnr Bezeichnung Typ Länge Beispiel Index
1 Kurzbezeichnung Alphanumerisch 3 AT, DE, ... Ja, PK
2 Bezeichnung Alphanumerisch 45 Österreich Ja
3 Landesvorwahl Alphanumerisch 10 ++43 nein

Wie Sie in der letzten Spalte erkennen, haben wir die Kurzbezeichnung als Primärschlüssel bzw. Primärindex gewählt (PK: "Primary Key"). Der Grund dafür ist, daß es nicht mehrere Länder auf dieser Welt gibt, die die gleichen Kurzbezeichnungen besitzen. Dadurch ist auch gewährleistet, daß man keine Länder doppelt eingibt.

Nun bleibt nur noch die Frage, wie man so eine Tabelle erstellt. Als erstes müssen wir in die Datenbank »Adressen« wechseln (falls Sie dies nicht schon getan haben):

mysql> use adressen;
Database changed

Um eine Tabelle anzulegen, verwenden wir den Befehl Create Table. Dieser Befehl hat prinzipiell folgenden Aufbau:

create table <Tabellenname>
   (<Feldname> <Typ> (<Länge>) [null|not null] [Defaultwert] [Autowert],
   (<Feldname> <Typ> (<Länge>) [null|not null] [Defaultwert] [Autowert],
   .....
   (<Feldname> <Typ> (<Länge>) [null|not null] [Defaultwert] [Autowert],
   primery key (Feldname, Feldname, ....));

Sieht ein bißchen kompliziert aus, ist es aber nicht. Schauen Sie sich einfach das folgende Beispiel an und vergleichen Sie es mit unserem obigen Entwurf.

mysql> create table Land (
    ->   kurzbez char(3) not null,
    ->   bezeichnung varchar(45) not null,
    ->   vorwahl varchar(10),
    ->   primary key(kurzbez));
Query OK, 0 rows affected (0.13 sec)

Was bedeuten nun die einzelnen Zeilen des Befehls?
Die 1. Zeile fängt an mit create table Land. Diese Zeile sagt dem Server, das eine Tabelle mit dem Namen »Land« anzulegen ist. Ab dem Zeichen »Klammer auf« werden die Spalten definiert.
Die nächste Zeile kurzbez char(3) not null, bewirkt, daß diese Tabelle eine Spalte hat mit dem Namen "Kurzbez" hat. Das Feld dient zur Aufnahme einer Zeichenkette ("char"). Die Inhalte, die in diesem Feld gespeichert werden, können maximal 3 Zeichen aufnehmen. Der Text "not null" heißt, daß dieses Feld nicht leer sein darf.

Bei der nächsten Zeile des Befehls (der nächsten Spalte der Tabelle) ist es ähnlich. Nur der Name des Feldes ist "Bezeichnung" und die maximale Länge beträgt 45 Zeichen. Ein weiterer Unterschied ist, daß hier der Typ "Varchar" ("variable") verwendet wird. "Char" und "Varchar" sind fast identisch. Beide können alphanumerische Werte (Buchstaben und Ziffern) mit einer Länge von bis zu 255 Zeichen aufnehmen. Der Unterschied ist, daß bei "Char" die Spalte bis zur angegebene Länge mit Leerzeichen bei jedem Satz aufgefüllt wird (dies macht z.B. auch dBase), d.h. wenn jetzt z.B. der Wert "AT" gespeichert werden soll, wird daraus intern "AT " (Beachten Sie das Leerzeichen!). Bei "Varchar" ist dies nicht der Fall, hier wird wirklich nur der Text in seiner echten Länge gespeichert und es erfolgt keine Auffüllung mit Leerzeichen. Beispielsweise wird "Österreich" intern als "Österreich" gespeichert. Auch hier geben Sie eine maximale Länge der Feldinhalte an - in unseren Beispiel also 45. Die tatsächliche Länge der Feldinhalte wird automatisch intern von der Datenbank-Engine gespeichert.

Sie müssen immer überlegen, welcher Datentyp für ein Feld verwendet werden soll und wie man dieses Feld auch in der Zukunft verwenden möchte. Meine eigene Faustregel lautet: Felder bis zu einer maximalen Länge von fünf Zeichen können ruhig mit "Char" definiert werden, darüber hinaus mit "Varchar".

Bei der nächsten Zeile vorwahl varchar(10), ist es ähnlich. Nur verzichten wir diesmal auf "not null". Dadurch darf das Feld auch leer sein (es könnte ja sein, daß man die Vorwahl eines Landes nicht kennt).

Bei der letzten Zeile primary key(kurzbez)); wird es schon interessanter, denn es fängt mit dem Schlüsselwort "primary key" an und sagt MySQL, daß jetzt der Primärindex definiert wird. In der Klammer stehen alle Felder, die zur Bildung des Schlüssels dienen. Die Felder müssen durch einen Beistrich getrennt sein und bereits vorher (innerhalb des Befehls) definiert worden sein. Für unser Beispiel brauchen wir nur die Kurzbezeichnung als Primärindex.

Nach dem Drücken der Eingabetaste wird eine Bestätigung oder Fehlermeldung von MySQL geliefert.

Wenn alles korrekt gelaufen ist, haben Sie nun eine neue Tabelle mit dem Namen "Land". Ob das auch wirklich stimmt, können wir relativ leicht herausfinden - und zwar mit dem bekannten Befehl show tables:

mysql> show tables;
+--------------------+
| Tables_in_adressen |
+--------------------+
| land               |
+--------------------+
1 row in set (0.00 sec)

Bevor ich nun zum Schluß komme, werde ich nur ganz kurz zeigen, wie man einen Datensatz in die Tabelle einfügt. Dies geschieht durch den Befehl Insert into.

mysql> insert into land values ('A','Oesterreich','+43');
Query OK, 1 row affected (0.03 sec)

Schauen Sie sich dazu auch nochmals den Befehl create table aus unserem Beispiel weiter oben an. Um nachzuschauen, ob unser Datensatz jetzt auch wirklich in der Tabelle enthalten ist, geben Sie den folgenden Befehl ein:

mysql> select * from land;
+---------+-----------------+---------+
| kurzbez | bezeichnung     | vorwahl |
+---------+-----------------+---------+
| A       | Oesterreich     | +43     |
+---------+-----------------+---------+
1 row in set (0.04 sec)

Im nächsten Teil werden wir den Befehl Insert into genauer anschauen.

Weitere Informationen finden Sie unter der folgenden Webadresse: http://www.mysql.com/doc/de/index.html http://www.rent-a-database.de/mysql/

Daten und Quellen:

MySQL: http://www.mysql.de
MySQL für OS/2 (Yuri Dario): http://os2power.dnsalias.com/index.html
MySQL für OS/2 (Netlabs): http://mysql.netlabs.org
MySQL-Dokumentation: http://www.mysql.com/doc/de/index.html
Weitere MySQL-Dokumentation: http://www.rent-a-database.de/mysql/


Wolfgang Draxler lebt mit seiner Ehefrau Yvonne in Wien. Er ist für eine Softwareentwicklungs- und Beratungsfirma im Bereich der Organisations- und Datenbankprogrammierung tätig. Privat arbeitet er unter anderem an der Weiterentwicklung von Sibyl für OS/2, einer Delphi-ähnlichen Programmiersprache.

Artikelverzeichnis
editor@os2voice.org
< Vorherige Seite | Inhaltsverzeichnis | Nächste Seite >
VOICE-Homepage: http://de.os2voice.org