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

## Auf gute Zusammenarbeit: MySQL und OS/2
Teil 4: Insert- und Select-Befehl

Von Wolfgang Draxler © Mai 2004

Im letzten Artikel habe ich kurz den Befehl Insert angeschnitten. Heute werden wir uns diesen Befehl genauer anschauen. Wie schon letztesmal beschrieben, fügt Insert einen oder mehrere Datensätze ein.

Der prinzipielle Aufbau ist:

    Insert into <Tabelle> [(Feld, Feld, ...)]
       values (Wert [, Wert, Wert, ...), ....]

Wie Sie sehen, können auch mehrere Sätze eingefügt werden. Aber bevor wir mit komplizierten Dingen anfangen, schauen wir uns als erstes den Befehl des letzten Monats an.

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

Mit diesem Befehl wird ein Satz mit den Werten Österreichs eingefügt. Wie Sie sicherlich bemerkt haben, wurden keine Felder angegeben. Dies kann ruhig wegfallen, wenn man alle Felder speichern möchte. Die Reihenfolge der Felder ist so, wie man es beim Befehl »Create Table« angegeben hatte. In diesem Fall hätte man auch folgendes schreiben können:

    mysql> insert into land (kurzbez, bezeichnung, vorwahl) values ('A','Oesterreich','+43');

Wenn Sie diesen Befehl ausführen, werden Sie wahrscheinlich eine Fehlermeldung erhalten, die aussagt, daß schon ein Eintrag existiert. Der Grund hierfür ist ganz einfach: Wir haben bei der Tabellen-Definition angegeben, daß die Kurzbezeichnung der primäre Schlüssel ist, und dadurch darf der Wert »A« nicht noch einmal eingefügt werden. Sie müßten hergehen und den Datensatz löschen. Nur dies wird erst später erklärt. Aber Sie könnten natürlich auch andere Werte nehmen. Beispielsweise für Deutschland.

    mysql> insert into land (kurzbez, bezeichnung, vorwahl) values ('D','Deutschland','+49');
    Query OK, 1 row affected (0.03 sec)

Wenn Sie nachschauen wollen, welche Sätze gespeichert sind, dann geben Sie folgenden Befehl ein:

    mysql> select * from land;
    +---------+-------------+---------+
    | kurzbez | bezeichnung | vorwahl |
    +---------+-------------+---------+
    | A       | Oesterreich | +43     |
    | D       | Deutschland | +49     |
    +---------+-------------+---------+
    2 rows in set (0.02 sec)

(Falls ein Datensatz fehlt, dann fügen Sie diesen bitte hinzu.)

Mit dem Insert-Befehl lassen sich auch mehrere Datensätze auf einmal einfügen.

    mysql> insert into land (kurzbez, bezeichnung, vorwahl) values
        ->   ('CH','Schweiz','+41'),
        ->   ('GB','Grossbritannien','+44'),
        ->   ('USA','United State of America','+1');
    Query OK, 3 rows affected (0.00 sec)
    Datensätze: 3  Duplikate: 0  Warnungen: 0

Natürlich kann man auch hier die Feldliste weglassen. Aber nur dann, wenn man die Feldreihenfolge kennt. Beispielsweise:

    mysql> insert into land values
        ->   ('I','Italien','+39'),
        ->   ('H','Ungarn','+36');
    Query OK, 2 rows affected (0.02 sec)
    Datensätze: 2  Duplikate: 0  Warnungen: 0

Nun werden wir Datensätze ohne Vorwahl anlegen:

    mysql> insert into land (kurzbez, bezeichnung) values
        ->   ('L','Luxemburg'),
        ->   ('NL','Niederlande'),
        ->   ('B','Belgien');
    Query OK, 3 rows affected (0.05 sec)
    Datensätze: 3  Duplikate: 0  Warnungen: 0

Da wir jetzt einige Datensätze mit »Insert« eingegeben haben, wollen wir uns sicherlich auch die Sätze anschauen bzw. auch diverse Abfragen an die Datenbank schicken. Dies geschieht mit dem mächtigen Befehl »Select«. Diesen Befehl haben wir schon für diverse Informationen verwendet.

Der Aufbau von Select ist folgender:

    Select <Feld> [, <Feld>, ...] || *
       from <Tabelle> [, <Tabelle>, ...]
       [where {Bedingung}]
       [order by [<Feld> [,<Feld>, ...]]]

Sieht doch einfach aus, oder? ;-)

Wie auch immer, betrachten wir dazu gleich ein kleines Beispiel:

    mysql> select kurzbez, bezeichnung, vorwahl from land;
    +---------+-------------------------+---------+
    | kurzbez | bezeichnung             | vorwahl |
    +---------+-------------------------+---------+
    | A       | Oesterreich             | +43     |
    | D       | Deutschland             | +49     |
    | CH      | Schweiz                 | +41     |
    | GB      | Grossbritannien         | +44     |
    | USA     | United State of America | +1      |
    | I       | Italien                 | +39     |
    | H       | Ungarn                  | +36     |
    | NL      | Niederlande             | NULL    |
    | L       | Luxemburg               | NULL    |
    | B       | Belgien                 | NULL    |
    +---------+-------------------------+---------+
    10 rows in set (0.08 sec)

Wie Sie sicherlich erkennen können, wurden sämtliche Datensätze und Felder, die wir gespeichert haben, angezeigt. Um alle Felder anzusprechen, kann man auch den Platzhalter »*« verwenden. Dann sieht das ganze so aus:

    mysql> select * from land;
    +---------+-------------------------+---------+
    | kurzbez | bezeichnung             | vorwahl |
    +---------+-------------------------+---------+
    | A       | Oesterreich             | +43     |
    | D       | Deutschland             | +49     |
    | CH      | Schweiz                 | +41     |
    | GB      | Grossbritannien         | +44     |
    | USA     | United State of America | +1      |
    | I       | Italien                 | +39     |
    | H       | Ungarn                  | +36     |
    | NL      | Niederlande             | NULL    |
    | L       | Luxemburg               | NULL    |
    | B       | Belgien                 | NULL    |
    +---------+-------------------------+---------+
    10 rows in set (0.00 sec)

Natürlich kann man auch ein oder mehrere Felder weglassen. Probieren Sie es einfach aus. Im Prinzip kann dabei nichts passieren, außer daß MySQL eine Fehlermeldung ausgibt.

Als nächstes werden wir die Where-Bedingung in die Abfrage einbauen. Bei einer Where-Bedingung überprüft der MySQL-Server, ob die Bedingung »wahr« ist. Ist dies der Fall, dann gibt der Server diesen Datensatz aus, ansonsten wird der nächste Datensatz verarbeitet. So ein Befehl sieht dann beispielsweise so aus:

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

Wie Sie sehen, wird nach der Kurzbez mit dem Inhalt »A« gesucht. Da es nur ein Land mit der Kurzbez »A« gibt, wird hier Österreich ausgegeben. Der Grund für dieses Verhalten ist das Statement `where kurzbez='A'`. Das Gleichheitszeichen nennt man hier Vergleichsoperator. Es gibt eine Menge Vergleichsoperatoren (und diese Operatoren sind bei fast allen SQL-Datenbanken gültig):

Vergleichs- operator: | Beschreibung: | Beispiel:
--- | --- | ---
= | Dieser Operator prüft die beiden Ausdücke darauf, ob sie genau übereinstimmen. Auch die Groß- und Kleinschreibung wird beachtet. | Kurzbez='A'
< | Der linke Ausdruck muß kleiner als der rechte Ausdruck sein. | Kurzbez<'D'
<= | Der linke Ausdruck muß kleiner oder gleich dem rechten Ausdruck sein. | Kurzbez<='D'
> | Der linke Ausdruck muß größer als der rechte Ausdruck sein. | Kurzbez>'D'
>= | Der linke Ausdruck muß größer oder gleich dem rechten Ausdruck sein. | Kurzbez>='D'
!= oder <> | Die beiden Ausdrücke dürfen nicht gleich sein. | Kurzbez<>'D'
like | Der rechte Ausdruck kann die Platzhalter »_« (für ein Zeichen) oder »%« (für mehrere Zeichen) beinhalten. Wenn die restlichen Zeichen gleich sind, dann wird der Datensatz ausgegeben. Die Platzhalter können auch mehrmals verwendet werden. Wenn Sie »not« vor dem »like« verwenden, dann passiert genau das Gegenteil. | Bezeichnung like '%l%' Bezeichnung like '%land_' Bezeichnung not like '%land_' Vorwahl like '+_9' Vorwahl not like '+_9'
in | Dieser Operator macht im Prinzip das gleiche wie der Operator »=«, aber bei »in« ist der rechte Operator eine Liste von Werten. Wie bei »like« können Sie hier auch den Operator »not« verwenden. | kurzbez in ("A", "D") kurzbez not in ("A", "D")
is null is not null | Bei diesem Operator sucht MySQL nach Datensätzen, bei denen der Ausdruck leer bzw. nicht leer ist. | Vorwahl is null Vorwahl is not null
Beetween <Wert1> and <Wert2> | Bei diesem Operator wird nach Datensätzen durchsucht, die zwischen <Wert2> und <Wert2> liegen. Funktioniert auch mit »not«. | Kurzbez between 'A' and 'D' Kurzbez not between 'A' and 'D'

Um eine oder mehrere Bedingungen zu verknüpfen, gibt es die »logischen Verknüpfungsoperatoren«.

Operator | Beschreibung
--- | ---
and | Dieser Operator ist dann erfüllt, wenn beide Bedingungen erfüllt sind.
or | Dieser Operator ist dann erfüllt, wenn eine der beiden oder beide Bedingungen erfüllt sind.
not | Der Not-Operator dreht das Ergebnis (also »wahr« oder »falsch«) der Bedingung um. D.h. wenn die Bedingung das Ergebnis »wahr« zurückgeliefert hat, dann wird mit »Not« daraus das Ergebnis »falsch«.

Nun werden wir uns einige Beispiele anschauen:

Als erstes werden wir alle Länder anzeigen, deren Kurzbezeichnung alphabetisch kleiner ist als »GB«.

    mysql> select * from land where kurzbez < 'GB';
    +---------+-------------+---------+
    | kurzbez | bezeichnung | vorwahl |
    +---------+-------------+---------+
    | A       | Oesterreich | +43     |
    | D       | Deutschland | +49     |
    | CH      | Schweiz     | +41     |
    | B       | Belgien     | NULL    |
    +---------+-------------+---------+
    4 rows in set (0.05 sec)

Nun werden wir alle Länder anzeigen lassen, deren Kurzbezeichnung alphabetisch größer ist als »GB«.

    mysql> select * from land where kurzbez > 'GB';
    +---------+-------------------------+---------+
    | kurzbez | bezeichnung             | vorwahl |
    +---------+-------------------------+---------+
    | USA     | United State of America | +1      |
    | I       | Italien                 | +39     |
    | H       | Ungarn                  | +36     |
    | NL      | Niederlande             | NULL    |
    | L       | Luxemburg               | NULL    |
    +---------+-------------------------+---------+
    5 rows in set (0.00 sec)

Jetzt werden die beiden Bedingungen verknüpfen. Dazu gibt es 2 Möglichkeiten.

    mysql> select * from land where kurzbez < 'GB' or kurzbez > 'GB';
    +---------+-------------------------+---------+
    | kurzbez | bezeichnung             | vorwahl |
    +---------+-------------------------+---------+
    | A       | Oesterreich             | +43     |
    | D       | Deutschland             | +49     |
    | CH      | Schweiz                 | +41     |
    | USA     | United State of America | +1      |
    | I       | Italien                 | +39     |
    | H       | Ungarn                  | +36     |
    | NL      | Niederlande             | NULL    |
    | L       | Luxemburg               | NULL    |
    | B       | Belgien                 | NULL    |
    +---------+-------------------------+---------+
    9 rows in set (0.01 sec)

... oder die elegantere Methode:

    mysql> select * from land where kurzbez <> 'GB';
    +---------+-------------------------+---------+
    | kurzbez | bezeichnung             | vorwahl |
    +---------+-------------------------+---------+
    | A       | Oesterreich             | +43     |
    | D       | Deutschland             | +49     |
    | CH      | Schweiz                 | +41     |
    | USA     | United State of America | +1      |
    | I       | Italien                 | +39     |
    | H       | Ungarn                  | +36     |
    | NL      | Niederlande             | NULL    |
    | L       | Luxemburg               | NULL    |
    | B       | Belgien                 | NULL    |
    +---------+-------------------------+---------+
    9 rows in set (0.00 sec)

Nun mal das Beispiel mit dem Operator »Like«:

    mysql> select * from land where Bezeichnung like '%land%';
    +---------+-------------+---------+
    | kurzbez | bezeichnung | vorwahl |
    +---------+-------------+---------+
    | D       | Deutschland | +49     |
    | NL      | Niederlande | NULL    |
    +---------+-------------+---------+
    2 rows in set (0.00 sec)

Oder alle anderen Länder:

    mysql> select * from land where Bezeichnung not like '%land%';
    +---------+-------------------------+---------+
    | kurzbez | bezeichnung             | vorwahl |
    +---------+-------------------------+---------+
    | A       | Oesterreich             | +43     |
    | CH      | Schweiz                 | +41     |
    | GB      | Grossbritannien         | +44     |
    | USA     | United State of America | +1      |
    | I       | Italien                 | +39     |
    | H       | Ungarn                  | +36     |
    | L       | Luxemburg               | NULL    |
    | B       | Belgien                 | NULL    |
    +---------+-------------------------+---------+
    8 rows in set (0.00 sec)

Ein Beispiel für den Operator »in«:

    mysql> select * from land where kurzbez in ('A','D','GB');
    +---------+-----------------+---------+
    | kurzbez | bezeichnung     | vorwahl |
    +---------+-----------------+---------+
    | A       | Oesterreich     | +43     |
    | D       | Deutschland     | +49     |
    | GB      | Grossbritannien | +44     |
    +---------+-----------------+---------+
    3 rows in set (0.03 sec)

Nun werden wir alle Länder anzeigen lassen, deren Vorwahl wir nicht kennen:

    mysql> select * from land where vorwahl is null;
    +---------+-------------+---------+
    | kurzbez | bezeichnung | vorwahl |
    +---------+-------------+---------+
    | NL      | Niederlande | NULL    |
    | L       | Luxemburg   | NULL    |
    | B       | Belgien     | NULL    |
    +---------+-------------+---------+
    3 rows in set (0.02 sec)

... und zum Schluß alle Länder, die wir zwischen Großbrittannien und Luxemburg gespeichert haben. Auch hierführ gibt es zwei Möglichkeiten:

    mysql> select * from land where kurzbez >= 'GB' and kurzbez <= 'L';
    +---------+-----------------+---------+
    | kurzbez | bezeichnung     | vorwahl |
    +---------+-----------------+---------+
    | GB      | Grossbritannien | +44     |
    | H       | Ungarn          | +36     |
    | I       | Italien         | +39     |
    | L       | Luxemburg       | NULL    |
    +---------+-----------------+---------+
    4 rows in set (0.00 sec)

... oder:

    mysql> select * from land where kurzbez between 'GB' and 'L';
    +---------+-----------------+---------+
    | kurzbez | bezeichnung     | vorwahl |
    +---------+-----------------+---------+
    | GB      | Grossbritannien | +44     |
    | H       | Ungarn          | +36     |
    | I       | Italien         | +39     |
    | L       | Luxemburg       | NULL    |
    +---------+-----------------+---------+
    4 rows in set (0.00 sec)

Wie bereits oben gesagt, probieren Sie einfach einiges aus. Beispielsweise alle Länder, die zwischen »C« und »Z« liegen und keine Vorwahl haben.

Das wäre erst einmal das wichtigste über die Bedingungen und wie man diese verknüpft. Im nächsten Artikel werden wir besprechen, wie man das Ergebnis sortiert. Dann werden wir noch die Befehle »update« und »delete« behandeln.

Daten und Quellen: MySQL: http://www.mysql.de MySQL für OS/2 (Yuri Dario): http://www.os2power.com/yuri/ 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