SQL, SO WIE ES MYSQL VERSTEHT

Die Seite wird erstellt Emilia Weise
 
WEITER LESEN
First
        Kapitel 3daß
                                                                                             KAPITEL 3
                                     SQL, so wie es MySQL versteht

        Die Structured Query Language (SQL) ist die Sprache, die zum Lesen und Schreiben von
        MySQL-Datenbanken verwendet wird. Mit SQL können Sie Daten suchen, neue Daten
        eingeben, Daten ändern und Daten löschen. SQL ist einfach das grundlegende Werk-
        zeug, das Sie zur Interaktion mit MySQL benötigen. Selbst wenn Sie irgendeine Anwen-
        dung oder eine grafische Benutzerschnittstelle für den Zugriff auf die Datenbank
        verwenden, wird irgendwo hinter den Kulissen der Anwendung SQL eingesetzt.
        SQL ist eine Art »natürliche« Sprache. Eine SQL-Anweisung liest sich – zumindest ober-
        flächlich betrachtet – wie ein Satz in englischer Sprache. Dieser Ansatz hat sowohl Vor-
        als auch Nachteile, das Endergebnis ist aber eine Sprache, die sich deutlich von traditio-
        nellen Programmiersprachen wie C, Java oder Perl unterscheidet.

        SQL-Grundlagen
        SQL ist in dem Sinne »strukturiert«, daß es einer Reihe von sehr genauen Regeln folgt.
        Ein Computerprogramm kann eine ausformulierte SQL-Abfrage auf einfache Weise ana-
        lysieren. So nutzt das O’Reilly-Buch lex & yacc von John Levine, Tony Mason und Doug
        Brown eine SQL-Grammatik, um den Prozeß zu beschreiben, der bei der Entwicklung
        eines Programms zur Interpretation einer Sprache notwendig ist. Eine Abfrage ist ein
        vollständiger Befehl, der an den Datenbank-Server gesendet wird, und dort die angefor-
        derte Operation durchführt. In der folgenden Zeile sehen Sie ein Beispiel für eine SQL-
        Abfrage:
            SELECT name FROM people WHERE name LIKE 'Stac%'

        Wie Sie sehen können, liest sich diese Anweisung wie eine Art gebrochenes Englisch:
        »Select names from a list of people where the names are like Stac« (zu deutsch etwa:
        »Wähle Namen aus der Tabelle people, deren Namen mit Stac anfangen«). SQL verwen-
        det nur sehr wenig von der Formatierung und den Sonderzeichen, die man typischer-
Max.    weise mit Computersprachen verbindet.                                                               Max.
Linie                                                                                                       Linie
                                                                                                   |   25
                                  This is the Title of the Book, eMatter Edition
                         Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Links
        Die Geschichte von SQL
        IBM führte SQL in den siebziger Jahren ein, und zwar kurze Zeit nachdem Dr. E. F.
        Codd erstmals das Konzept einer relationalen Datenbank vorgestellt hatte. Von Anfang
        an war SQL eine leicht zu erlernende und doch leistungsfähige Sprache. Sie ähnelte einer
        natürlichen Sprache wie dem Englischen, so daß sie weniger Ängste bei technisch nicht
        so bewanderten Personen auslöste. In den siebziger Jahren war das, mehr noch als heute,
        ein sehr wichtiger Vorteil.
        In den frühen siebziger Jahren gab es keine Freizeit-Hacker. Niemand wuchs mit BASIC
        oder dem Aufbau von Webseiten in HTML auf. Die Leute, die Computer programmier-
        ten, wußten alles über die Funktionsweise von Computern. SQL war für die Heerscharen
        nichttechnischer Buchhaltungs-, Sach- und Verwaltungsmitarbeiter gedacht, die davon
        profitieren würden, wenn sie die Leistungsfähigkeit einer relationalen Datenbank nutzen
        könnten.
        SQL war bei seiner Zielgruppe dann auch tatsächlich so populär, daß die Oracle-Corpo-
        ration in den achtziger Jahren das erste allgemein verfügbare, kommerzielle SQL-System
        auf den Markt brachte. Oracle SQL wurde ein großer Erfolg und Auslöser für eine ganze
        Industrie, die um SQL herum entstand. Sybase, Informix, Microsoft und viele andere
        Unternehmen haben seitdem ihre eigenen SQL-basierten relationalen Datenbank-Mana-
        gement-Systeme (RDBMS) vorgestellt.
        Als Oracle und die ersten Mitbewerber die Bühne betraten, war SQL immer noch relativ
        neu, und es gab keinen Standard. Es dauerte noch bis 1989, bis die ANSI den ersten SQL-
        Standard veröffentlichte. Heutzutage wird dieser Standard SQL89 genannt. Dieser neue
        Standard ging aber leider nicht soweit, die technische Struktur der Sprache zu definieren.
        Obwohl die verschiedenen kommerziellen SQL-Sprachen näher zusammenrückten,
        machten es die Unterschiede in der Syntax zu einem nicht gerade trivialen Problem, zwi-
        schen den Implementierungen zu wechseln. Erst 1992 wurde ein umfassenderer ANSI-
        SQL-Standard veröffentlicht.
        Der Standard von 1992 wird sowohl SQL92 als auch SQL2 genannt. Der SQL2-Standard
        nahm so viele proprietäre Erweiterungen der kommerziellen Implementierungen wie
        möglich in die Sprache auf. Die meisten DBMS-übergreifenden Tools verwenden nun
        SQL2, um mit relationalen Datenbanken zu kommunizieren. Aufgrund der recht
        umfangreichen Natur des SQL2-Standards sind relationale Datenbanken, die den Stan-
        dard vollständig implementieren, aber sehr komplex und ressourcenintensiv.

                          SQL2 ist nicht das letzte Wort in Sachen SQL-Standard. Mit der wachsen-
                          den Verbreitung objektorientierter (OODBMS) und objektrelationaler Da-
                          tenbank-Management-Systeme (ORDBMS) steigt der Druck, den objekt-
                          orientierten Datenbankzugriff im SQL-Standard zu berücksichtigen. Die
                          Antwort auf dieses Problem ist der junge SQL3-Standard.
Max.                                                                                                 Max.
Linie                                                                                                Linie
        26 |   Kapitel 3: SQL, so wie es MySQL versteht
                                         This is the Title of the Book, eMatter Edition
                            Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Rechts
         Als MySQL auftauchte, wurde bei seiner Entwicklung des Datenbank-Servers ein völlig
         neuer Ansatz verfolgt. Anstatt ein neues, riesiges RDBMS herzustellen und auf diese
         Weise zu riskieren, sich in keiner Weise von den Großen zu unterscheiden, entwickelte
         Monty eine kleine, schnelle Implementierung der am häufigsten genutzten SQL-Funktio-
         nen. Diese Basisfunktionalität wuchs im Laufe der Jahre, um nun fast all die Funktionen
         zu bieten, die man in den meisten Datenbank-Anwendungen benutzen möchte.

         Das Design von SQL
         Wie bereits erwähnt wurde, ähnelt SQL mehr einer menschlichen als einer Computer-
         sprache. SQL erreicht dies durch eine einfache, imperative Struktur. Wie bei einem engli-
         schen Satz können einzelne SQL-Befehle, sogenannte »Queries« (Abfragen), in einzelne
         Sprachbestandteile zerlegt werden. Betrachten Sie die folgenden Beispiele:
              CREATE    TABLE                people (name CHAR(10))
              Verb      Object               Adjektivgruppe

              INSERT    INTO people       VALUES ('me')
              Verb      indirektes Objekt direktes Objekt

              SELECT    name                 FROM people                 WHERE name LIKE '%e'
              Verb      direktes Objekt      indirektes Objekt           Adjektivgruppe

         Die meisten SQL-Implementierungen, einschließlich MySQL, unterscheiden nicht zwi-
         schen Klein- und Großbuchstaben. Insbesondere spielt es keine Rolle, wie Sie die SQL-
         Schlüsselwörter eingeben, solange Sie nur die Buchstabenfolge beachten. Das obige
         CREATE-Beispiel hätte also durchaus auch wie folgt eingegeben werden können:
              cREatE TAblE people (name cHaR(10))

         Das Ignorieren der Groß-/Kleinschreibung erstreckt sich aber nur auf SQL-Schlüsselwör-
         ter.1 Bei MySQL wird bei Namen von Datenbanken, Tabellen und Spalten sehr wohl auf
         die Groß-/Kleinschreibung geachtet. Das gilt nicht notwendigerweise bei anderen Daten-
         bank-Engines. Wenn Sie also eine Anwendung entwickeln wollen, die mit allen Daten-
         banken funktionieren soll, dann sollten Sie davon ausgehen, daß bei Namen auf die
         Groß-/Kleinschreibung geachtet wird.
         Das erste Element einer SQL-Abfrage ist immer ein Verb. Dieses Verb drückt die Opera-
         tion aus, die die Datenbank-Engine durchführen soll. Während sich der Rest der Anwei-
         sung von Verb zu Verb unterscheidet, wird doch immer das gleiche allgemeine Schema
         verfolgt: Sie benennen das Objekt, mit dem Sie arbeiten, und beschreiben dann die
         Daten, die für die Operation verwendet werden sollen. So verwendet beispielsweise die
         Abfrage CREATE TABLE people (name CHAR(10)) das Verb CREATE, gefolgt vom Objekt

         1   Der besseren Lesbarkeit halber schreiben wir alle SQL-Schlüsselwörter in diesem Buch groß. Wir empfehlen
 Max.        Ihnen diese Konvention als in der Praxis bewährte Technik.
                                                                                                                        Max.
 Linie                                                                                                                  Linie
                                                                                           SQL-Grundlagen |       27
                                      This is the Title of the Book, eMatter Edition
                             Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Links
        TABLE. Der Rest der Abfrage beschreibt die zu erzeugende Tabelle und eine darin anzule-
        gende Spalte.
        Eine SQL-Abfrage wird von einem Client gestartet – der Anwendung, die die Fassade lie-
        fert, durch die ein Benutzer mit der Datenbank arbeitet. Der Client erzeugt eine Abfrage
        auf Grundlage der Benutzeroperationen und sendet diese an den SQL-Server. Der Server
        muß die Abfrage dann verarbeiten und die gewünschte Operation durchführen. Sobald
        der Server seine Aufgabe erledigt hat, gibt er einen Wert bzw. eine Reihe von Werten an
        den Client zurück.
        Da die primäre Ausrichtung von SQL darin besteht, Operationen an den Datenbank-Ser-
        ver zu übermitteln, besitzt SQL nicht die Flexibilität einer Allzwecksprache. Ein Großteil
        der Funktionalität von SQL beschäftigt sich mit der Ein- und Ausgabe von Daten an die
        Datenbank: Hinzufügen, Ändern, Löschen und Lesen von Daten. SQL stellt noch andere
        Funktionen zur Verfügung, aber immer in Hinblick auf die Möglichkeit, Daten innerhalb
        der Datenbank zu manipulieren.

        SQL an MySQL senden
        SQL kann durch verschiedene Mechanismen an MySQL geschickt werden. Am häufig-
        sten geschieht dies durch eine der Programmiersprachen-APIs, die im Teil III beschrieben
        werden. Für die Beispiele in diesem Kapitel empfehlen wir jedoch, das interaktive Kom-
        mandozeilenprogramm mysql zu nutzen. Wenn Sie dieses Programm auf der Komman-
        dozeile ausführen, wartet es auf Ihre SQL-Eingaben:
            [09:04pm] carthage$ mysql -u root -p
            Enter password:
            Welcome to the MySQL monitor. Commands end with ; or \g.
            Your MySQL connection id is 3 to server version: 3.22.29

            Type 'help' for help.

            mysql>

        Der obige mysql-Befehl verbindet sich als Benutzer root (mit der Option -u) mit dem
        MySQL-Server auf dem lokalen Rechner, wobei der Client nach einem Paßwort fragt (die
        Option -p). Eine andere Option, -h, erlaubt es, eine Verbindung zu MySQL-Servern auf
        anderen Rechnern herzustellen:
            [09:04pm] carthage$ mysql -u root -h db.imaginary.com -p

        Es gibt absolut keine Beziehung zwischen den Benutzernamen des Betriebssystems und
        den MySQL-Benutzernamen. Mit anderen Worten: MySQL verwaltet seine eigene Benut-
        zerliste, und der MySQL-Administrator muß neue Benutzer zu MySQL hinzufügen,
        unabhängig von dem Rechner, auf dem der MySQL-Server läuft. Somit hat auf einer fri-
        schen MySQL-Installation niemand außer root einen Account. Dieser root ist ein anderer
Max.    root als der Benutzer root unter UNIX. Generell sollte man sich bei MySQL nie als root       Max.
        anmelden, es sei denn, man bearbeitet administrative Aufgaben für Datenbanken. Wenn
Linie                                                                                                Linie
        28 |   Kapitel 3: SQL, so wie es MySQL versteht
                                         This is the Title of the Book, eMatter Edition
                            Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Rechts
         Sie eine frische MySQL-Installation haben, die hinterher wieder gelöscht werden kann,
         wäre es sinnvoll, sich für die Beispiele in diesem Kapitel als root anzumelden, damit
         Datenbanken erstellt und gelöscht werden können. Anderenfalls müssen Sie sich bei
         MySQL unter dem Benutzernamen anmelden, der Ihnen zugeteilt wurde.
         Sobald mysql läuft, können Sie SQL-Befehle in jeweils einer einzigen Zeile eingeben oder
         die Befehle auf mehrere Zeilen aufspalten. MySQL wartet auf ein Semikolon, bevor die
         SQL-Anweisung ausgeführt wird:1
              mysql> SELECT buch_nummer
                  -> FROM buecher
                  -> ;
              +-------------+
              | buch_nummer |
              +-------------+
              |           1 |
              |           2 |
              |           3 |
              +-------------+
              3 rows in set (0.00 sec)

         Die mysql-Kommandozeile stellt generell eine Liste bereits eingegebener Befehle zur Ver-
         fügung, je nachdem, wie Ihre Client-Werkzeuge kompiliert wurden. Wenn Ihr mysql-
         Client solche Befehlsspeicher zur Verfügung stellt, können Sie mit den Pfeil-nach-oben/
         unten-Tasten durch schon einmal eingegebene Befehle blättern.

         Datenbanken erstellen
         Um MySQL jetzt auch nutzen zu können, muß zuerst eine Datenbank erstellt werden.
         Zuerst werfen wir jedoch einen Blick auf die Datenbanken, die sich bereits auf einer fri-
         schen MySQL-Installation befinden. Geben Sie hierzu den Befehl SHOW DATABASES ein.
         Direkt nach der Installation von MySQL 3.23.40 existieren bereits die folgenden Tabel-
         len:
              mysql> SHOW DATABASES;
              +----------+
              | Database |
              +----------+
              | mysql    |
              | test     |
              +----------+
              2 rows in set (0.37 sec)

         Die erste Datenbank, mysql, ist die Systemdatenbank von MySQL, die wir in Kapitel 5
         näher behandeln werden. Die zweite Datenbank, test, ist eine Spielwiese, die dazu
         genutzt werden kann, um sich mit MySQL vertraut zu machen und um Testprogramme

 Max.    1   MySQL akzeptiert auch ein \g am Ende einer SQL-Aussage, um anzudeuten, daß die Befehlsausführung begin-   Max.
             nen kann.
 Linie                                                                                                                 Linie
                                                                                      Datenbanken erstellen   |   29
                                      This is the Title of the Book, eMatter Edition
                             Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Links
        darin laufen zu lassen. Sie werden wahrscheinlich auch andere Datenbanken auf dem
        Server vorfinden, wenn Sie nicht mit einer frischen MySQL-Installation arbeiten. Jetzt
        wollen wir aber eine neue Datenbank erstellen, um die Wirkungsweise des MySQL-
        Befehls CREATE vorzuführen:
            CREATE DATABASE TEMPDB;

        Um in der neuen Datenbank TEMPDB zu arbeiten, geben Sie folgendes ein:
            USE TEMPDB;

        Schließlich kann die Datenbank mit dem Befehl DROP DATABASE wieder gelöscht werden:
            DROP DATABASE TEMPDB;

        Neue Objekte können also mit dem CREATE-Befehl erzeugt und mit dem DROP-Befehl wie-
        der gelöscht werden, so wie wir es eben demonstriert haben.

        Tabellenverwaltung
        Zu diesem Zeitpunkt sollten Sie keine Probleme damit haben, sich mit einem MySQL-
        Server zu verbinden. Für den Rest dieses Kapitels können Sie entweder die test-Daten-
        bank, die zusammen mit MySQL eingerichtet wurde, oder Ihre eigene Übungsdatenbank
        benutzen. Mit dem SHOW-Befehl können Sie sich die Tabellen in der aktuellen Datenbank
        auflisten lassen, genauso wie wir uns die Datenbanken haben anzeigen lassen. In einer
        frischen Installation enthält die test-Datenbank keine Tabellen. Im Folgenden wird die
        Ausgabe von SHOW TABLES gezeigt, wenn die mysql-Systemdatenbank genutzt wird:
            mysql> USE mysql;
            Database changed
            mysql> SHOW TABLES;
            +-----------------+
            | Tables_in_mysql |
            +-----------------+
            | columns_priv    |
            | db              |
            | func            |
            | host            |
            | tables_priv     |
            | user            |
            +-----------------+
            6 rows in set (0.00 sec)

        Dies sind die sechs Systemtabellen, die MySQL benötigt, um funktionieren zu können.
        Um sich eine Beschreibung einer dieser Tabellen ausgeben zu lassen, können Sie den
        Befehl DESCRIBE benutzen:

Max.                                                                                             Max.
Linie                                                                                            Linie
        30 |   Kapitel 3: SQL, so wie es MySQL versteht
                                         This is the Title of the Book, eMatter Edition
                            Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Rechts
             mysql> DESCRIBE db;
             +-----------------+-----------------+------+-----+---------+-------+
             | Field           | Type            | Null | Key | Default | Extra |
             +-----------------+-----------------+------+-----+---------+-------+
             | Host            | char(60) binary |      | PRI |         |       |
             | Db              | char(64) binary |      | PRI |         |       |
             | User            | char(16) binary |      | PRI |         |       |
             | Select_priv     | enum('N','Y') |        |     | N       |       |
             | Insert_priv     | enum('N','Y') |        |     | N       |       |
             | Update_priv     | enum('N','Y') |        |     | N       |       |
             | Delete_priv     | enum('N','Y') |        |     | N       |       |
             | Create_priv     | enum('N','Y') |        |     | N       |       |
             | Drop_priv       | enum('N','Y') |        |     | N       |       |
             | Grant_priv      | enum('N','Y') |        |     | N       |       |
             | References_priv | enum('N','Y') |        |     | N       |       |
             | Index_priv      | enum('N','Y') |        |     | N       |       |
             | Alter_priv      | enum('N','Y') |        |     | N       |       |
             +-----------------+-----------------+------+-----+---------+-------+
             13 rows in set (0.36 sec)

         Diese Ausgabe beschreibt jede Spalte der Tabelle. Es wird der Datentyp angezeigt, ange-
         geben, ob die Spalte NULL-Werte aufnehmen darf und von welchem Schlüsseltyp sie ist,
         sowie zusätzliche Informationen dargestellt. Machen Sie sich keine Gedanken, wenn
         Ihnen das alles gar nichts sagt. Jedes dieser Elemente wird noch im Laufe dieses Kapitels
         beschrieben.
         Sie sollten nun in der Lage sein, Ihre erste Tabelle zu erstellen. Zuerst müssen Sie sich
         wieder mit der test-Datenbank verbinden, die mit einer frischen MySQL-Installation
         mitgeliefert wird:
             USE test;

         Stellen Sie jedoch vorher sicher, daß Sie mit der test-Datenbank arbeiten, da Sie ganz
         bestimmt keine weiteren Tabellen in die mysql-Datenbank hinzufügen wollen. Eine
         Tabelle ist ein strukturiertes Datenbehältnis und stellt das grundlegendste Konzept einer
         relationalen Datenbank dar. Bevor einer Tabelle Daten hinzugefügt werden, muß die
         Struktur der Tabelle definiert werden. Betrachten Sie das folgende Layout:
             +---------------------------------+
             |             personen            |
             +-------------+-------------------+
             | name        | char(10) not null |
             | adresse     | text(100)         |
             | id          | int               |
             +-------------+-------------------+

         Die Tabelle enthält nicht nur die Namen der Spalten, sondern auch die Datentypen jedes
         Feldes sowie alle Zusatzinformationen, die ein Feld aufweisen kann. Der Datentyp eines
         Feldes legt fest, welche Art von Daten ein Feld enthalten kann. SQL-Datentypen sind den
         Datentypen anderer Programmiersprachen ähnlich. Der vollständige SQL-Standard
 Max.    erlaubt eine große Zahl von Datentypen. MySQL implementiert die meisten von ihnen,                        Max.
 Linie   außerdem einige MySQL -spezifische Datentypen.                                                            Linie
                                                                                     Tabellenverwaltung   |   31
                                   This is the Title of the Book, eMatter Edition
                          Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Links
        Die allgemeine Syntax für die Erzeugung einer Tabelle lautet:
            CREATE TABLE tabellenname (
                                     spaltenname1 typ [modifikatoren]
                                  [, spaltenname2 typ [modifikatoren]]
            )

                          Was einen gültigen Identifier (Bezeichner) – also den Namen einer Tabelle
                          oder Spalte – ausmacht, variiert von DBMS zu DBMS. MySQL erlaubt es,
                          bis zu 64 Zeichen für einen Identifier anzugeben. Das ’$’ ist in Identifiern
                          erlaubt, und Identifier können auch mit einer gültigen Ziffer beginnen.
                          Was aber noch wichtiger ist, ist die Tatsache, daß MySQL jeden Buchsta-
                          ben Ihres lokalen Zeichensatzes als gültigen Buchstaben für Identifier
                          akzeptiert.

        Eine Spalte bildet die einzelne Dateneinheit innerhalb einer Tabelle. Eine Tabelle kann
        eine beliebige Anzahl von Spalten enthalten, allerdings können große Tabellen ineffizient
        sein. An dieser Stelle wird gutes Datenbank-Design, das wir in Kapitel 7 erläutern wer-
        den, zu einem wichtigen Faktor. Durch korrekt normalisierte Tabellen können wir
        Tabellen verknüpfen (join), um eine einzelne Suche nach Daten vorzunehmen, die in
        mehreren Tabellen enthalten sind. Wir beschreiben die Mechanismen eines »Joins« spä-
        ter in diesem Kapitel.
        Betrachten wir den folgenden CREATE-Befehl:
            CREATE TABLE BENUTZER (
                BENUTZER_ID    BIGINT UNSIGNED NOT NULL PRIMARY KEY,
                BENUTZER_NAME CHAR(10)         NOT NULL,
                NACHNAME VARCHAR(30),
                VORNAME    VARCHAR(30),
                BUERO      CHAR(2)         NOT NULL DEFAULT 'NY');

        Dieser Befehl erstellt eine Tabelle namens BENUTZER mit fünf Spalten: BENUTZER_ID,
        BENUTZER_NAME, NACHNAME, VORNAME und BUERO. Nach jedem Spaltennamen folgt der Daten-
        typ der Spalte sowie, falls vorhanden, weitere Modifikatoren.
        Der Modifikator NOT NULL gibt an, daß eine Spalte keine NULL-Werte enthalten darf.
        Wenn dennoch versucht wird, dieser Spalte einen NULL-Wert zuzuweisen, erzeugt SQL
        einen Fehler. Es gibt jedoch einige Ausnahmen zu dieser Regel. Wenn die Spalte einer-
        seits als AUTO_INCREMENT definiert ist, erzeugt die Zuweisung eines NULL-Wertes automa-
        tisch den entsprechenden Wert. (Die automatische Inkrementierung behandeln wir
        später in diesem Kapitel.) Wenn andererseits ein Standardwert für eine Spalte definiert
        ist, wie in der BUERO-Spalte im obigen Beispiel, wird bei der Zuweisung des NULL-Wertes
        der Standardwert, 'NY' im Beispiel, gespeichert. (Datentypen und der Modifikator
        PRIMARY KEY werden später in diesem Kapitel behandelt.)

Max.                                                                                                     Max.
Linie                                                                                                    Linie
        32 |   Kapitel 3: SQL, so wie es MySQL versteht
                                         This is the Title of the Book, eMatter Edition
                            Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Rechts
         Wie bei den meisten Dingen im Leben ist das Zerstören wesentlich einfacher als das
         Erschaffen. Der Befehl, mit dem eine Tabelle aus einer Datenbank entfernt wird, lautet:
                DROP TABLE tabellenname

         Dieser Befehl entfernt alle Spuren der Tabelle aus der Datenbank. MySQL befördert alle
         Daten der gelöschten Tabelle ins Daten-Nirvana. Wenn Sie keine Backups der Tabelle
         besitzen, gibt es absolut keine Möglichkeit, diese Operation ungeschehen zu machen.
         Die Moral von der Geschicht’ lautet, immer Backups anzulegen und beim Löschen von
         Tabellen sehr vorsichtig zu sein. Sie werden sich eines Tages selbst dafür danken.
         Bei MySQL können Sie mehr als eine zu löschende Tabelle angeben, indem Sie die
         Namen der Tabellen durch Kommata voneinander trennen. So würde zum Beispiel DROP
         TABLE people, animals, plants die drei angegebenen Tabellen löschen. Sie können unter
         MySQL auch den Modifikator IF EXISTS nutzen, um eine Fehlermeldung zu vermeiden,
         falls die von Ihnen angegebene Tabelle nicht existiert. Dieser Modifikator ist in langen
         Skripten hilfreich, die zum Anlegen einer Datenbank und all ihrer Tabellen gedacht sind.
         Vor dem Anlegen führen Sie ein DROP TABLE IF EXISTS table_name aus.

         MySQL-Datentypen
         In einer Tabelle besitzt jede Spalte einen Typ. Wie bereits erwähnt wurde, ähnelt ein
         SQL-Datentyp dem Datentyp traditioneller Programmiersprachen. Während viele Spra-
         chen nur ein absolutes Minimum an Datentypen definieren, geht SQL weiter und stellt
         Datentypen wie DATE zur Verfügung, die dem Alltagsnutzer behilflich sein können. Sie
         könnten einen DATE-Typ auch in einem einfacheren numerischen Typ aufnehmen, aber
         ein Datentyp, der auf die Nuancen der Verarbeitung von Daten abgestimmt ist, macht
         SQL einfacher in der Handhabung – und das ist eines der primären Ziele von SQL.
         In Kapitel 16 finden Sie eine umfassende Referenz aller SQL-Datentypen, die von MySQL
         unterstützt werden. Tabelle 3-1 enthält eine gekürzte Aufstellung der gängigsten Typen.

         Tabelle 3-1: Die gängigsten MySQL-Datentypen (siehe Kapitel 16 für eine vollständige Liste)

          Datentyp                Beschreibung
          INT                     Ein ganzzahliger Wert. Bei MySQL darf INT mit oder ohne Vorzeichen angegeben werden.
          REAL                    Ein Fließkomma-Wert. Dieser Typ bietet einen größeren Wertebereich und eine größere Genauigkeit
                                  als der INT-Typ, besitzt aber nicht die Exaktheit von INT.
          CHAR (length)           Ein Zeichenwert fester Länge. Ein CHAR-Feld kann nur Strings aufnehmen, die nicht länger als der
                                  festgelegte Wert sind. Kürzere Felder werden mit Leerzeichen aufgefüllt. Dieser Typ ist wohl der in
                                  jeder SQL-Implementierung am häufigsten verwendete Typ.
          VARCHAR(length)         Ein Zeichenwert variabler Länge.

 Max.                                                                                                                                        Max.
 Linie                                                                                                                                       Linie
                                                                                         MySQL-Datentypen |                             33
                                      This is the Title of the Book, eMatter Edition
                             Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Links
        Tabelle 3-1: Die gängigsten MySQL-Datentypen (siehe Kapitel 16 für eine vollständige Liste) (Forts.)

         Datentyp                 Beschreibung
         TEXT(length)             Ein Zeichenwert variabler Länge.
         DATE                     Ein Standard-Datumswert. Der DATE-Typ speichert beliebige Datumswerte aus der Vergangenheit,
                                  Gegenwart und Zukunft.
         TIME                     Ein Standard-Zeitwert. Dieser Typ speichert eine Uhrzeit unabhängig von einem bestimmten Datum.
                                  Zusammen mit einem Datumswert können ein bestimmtes Datum und eine bestimmte Uhrzeit
                                  abgelegt werden. MySQL kennt zusätzlich den Typ DATETIME, bei dem Datum und Uhrzeit in einem
                                  gemeinsamen Feld gespeichert werden.

        MySQL unterstützt das UNSIGNED-Attribut für alle numerische Typen. Dieser Modifikator
        läßt in der Spalte nur positive (vorzeichenlose) Werte zu. Felder ohne Vorzeichen haben
        einen maximalen Wert, der doppelt so groß ist wie der Maximalwert seines vorzeichen-
        behafteten Gegenstücks. Beispielsweise hat der vorzeichenlose TINYINT-Typ – MySQLs
        ein Byte großer numerischer Datentyp – ein Werteintervall von 0 bis 255 anstelle des
        Intervalls von -128 bis 127 seines vorzeichenbehafteten Gegenstücks.
        MySQL unterstützt mehr als die in Tabelle 3-1 aufgeführten Datentypen. Bei der tägli-
        chen Programmierung werden Sie aber meist die oben aufgeführten Typen verwenden.
        Die Größe der zu speichernden Daten spielt beim Entwurf von MySQL-Tabellen eine
        große Rolle.

        Numerische Typen
        Bevor Sie eine Tabelle anlegen, sollten Sie eine recht genaue Vorstellung davon haben,
        welche Art von Daten in der Tabelle abgelegt werden soll. Neben offensichtlichen Ent-
        scheidungen darüber, ob die Daten zeichenbasiert oder numerisch sind, sollten Sie auch
        die ungefähre Größe der zu speichernden Daten kennen. Wenn es sich um ein numeri-
        sches Feld handelt, wie hoch ist dann der maximal mögliche Wert? Wie sieht es mit dem
        kleinstmöglichen Wert aus? Könnte sich das in Zukunft ändern? Wenn das Minimum
        immer positiv ist, sollten Sie über einen vorzeichenlosen Typ nachdenken. Sie sollten
        immer den kleinsten numerischen Typ wählen, der den von Ihnen erwarteten Maximal-
        wert noch aufnehmen kann. Wenn Sie zum Beispiel ein Feld hätten, das die Einwohner-
        zahl eines Landes angibt, sollten Sie ein vorzeichenloses INT-Feld verwenden. Kein Land
        hat eine negative Einwohnerzahl. Darüber hinaus müßte die Bevölkerungszahl eines Lan-
        des etwa so hoch sein wie die der ganzen Welt, bevor sie von einem vorzeichenlosen INT-
        Feld nicht mehr aufgenommen werden könnte.

        Zeichenorientierte Typen
        Die Wahl der zeichenorientierten Typen ist etwas komplizierter. Sie müssen sich nicht
        nur über die minimale und maximale Länge der Strings Gedanken machen, sondern auch
Max.    über deren durchschnittliche Länge und den Grad an wahrscheinlicher Abweichung. Bei                                         Max.
Linie                                                                                                                               Linie
        34 |    Kapitel 3: SQL, so wie es MySQL versteht
                                          This is the Title of the Book, eMatter Edition
                             Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Rechts
         unseren momentanen Ansprüchen ist ein Index ein Feld oder eine Kombination von Fel-
         dern, in dem bzw. denen wir suchen wollen – grundsätzlich handelt es sich dabei um die
         Felder in Ihrer WHERE-Klausel. Die Indizierung ist allerdings wesentlich komplizierter,
         weswegen wir uns der Indizierung später in diesem Kapitel noch genauer widmen wer-
         den. Wichtig ist an dieser Stelle die Tatsache, daß die Indizierung eines Zeichenfeldes am
         besten funktioniert, wenn das Feld eine feste Länge hat. Wenn sich die Länge Ihres zei-
         chenorientierten Feldes nur wenig – oder am besten gar nicht – ändert, dann ist ein CHAR-
         Typ wahrscheinlich die richtige Wahl. Ein Beispiel für einen ausgezeichneten Kandidaten
         für ein CHAR-Feld ist der Ländercode. Die ISO (International Organisation for Standards)
         stellt eine umfassende Liste der üblichen Zwei-Zeichen-Ländercodes (US für die U.S.A.,
         FR für Frankreich etc.) zur Verfügung.1 Da diese Codes immer aus genau zwei Zeichen
         bestehen, ist CHAR(2) für dieses Feld immer die richtige Wahl.
         Ein Wert muß nicht unbedingt eine feste Länge aufweisen, um ein Kandidat für ein CHAR-
         Feld zu sein. Er sollte allerdings nur eine sehr kleine Varianz in der Länge haben. So kön-
         nen Telefonnummern ruhig in einem Feld vom Typ CHAR(13) abgelegt werden, auch
         wenn sich die Länge der Telefonnummern von Land zu Land unterscheidet. Die Varianz
         ist hier einfach nicht so groß, daß es sich lohnen würde, ein Feld variabler Länge zu ver-
         wenden. Das Wichtige im Zusammenhang mit einem CHAR-Feld ist die Tatsache, daß das
         Feld, unabhängig von der tatsächlichen Länge des Strings, immer genau die Anzahl der
         Zeichen belegt, die in der Feldgröße festgelegt ist – nicht mehr und nicht weniger. Jegli-
         cher Unterschied zwischen der Länge des zu speichernden Textes und der Feldlänge wird
         durch Leerzeichen aufgefüllt (padding). Obwohl die wenigen Zeichen, die bei der Spei-
         cherung von Telefonnummern unnötig verbraucht werden, kaum der Rede wert sind,
         sollte man doch nicht zu viel Platz verschwenden.
         Textfelder variabler Länge erfüllen diesen Wunsch. Ein gutes Beispiel für ein Feld, das
         sich für einen Datentyp variabler Länge eignet, ist eine Web-URL. Die meisten Web-
         Adressen nehmen nur relativ wenig Raum ein – http://www.ora.com, http://www.hughes.
         com.au, http://www.mysql.com – und stellen daher auch kein Problem dar. Gelegentlich
         haben Sie es aber auch mit Web-Adressen wie dieser zu tun:
              http://www.winespectator.com/Wine/Spectator/
              _notes|5527293926834323221480431354?Xv11=&Xr5=&Xv1=&type-region-
              search-code=&Xa14=flora+springs&Xv4=
         Wenn Sie ein CHAR-Feld verwenden, das groß genug ist, um diese URL aufzunehmen,
         dann verschwenden Sie für die meisten anderen abzuspeichernden URLs eine große
         Menge an Speicherplatz. Mit Feldern variabler Länge können Sie gelegentliche lange
         Werte abspeichern, ohne bei den üblichen kürzeren Werten Platz zu verschwenden.

         1   Glauben Sie nicht, daß das mit Staaten bzw. Provinzen auf diese Weise funktioniert. Wenn Sie eine Anwen-
             dung entwickeln, die in einer internationalen Umgebung läuft und Länder-/Provinzcodes speichert, sollten Sie
 Max.        mit CHAR(3) arbeiten, da Australien beispielsweise aus drei Zeichen bestehende Staatencodes verwendet.
             Beachten Sie auch, daß es einen ISO-Standard für Drei-Buchstaben-Ländercodes gibt.
                                                                                                                            Max.
 Linie                                                                                                                      Linie
                                                                                          MySQL-Datentypen |          35
                                       This is the Title of the Book, eMatter Edition
                              Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Links
        Der Vorteil von Textfeldern variabler Länge bei MySQL ist, daß solche Felder exakt den
        minimal notwendigen Speicherplatz verbrauchen, der zur Aufnahme des jeweiligen Wer-
        tes notwendig ist. Die VARCHAR(255)-Spalte, die den String »Hallo Welt« enthält, benötigt
        beispielsweise nur 11 Byte (ein Byte für jedes Zeichen und ein zusätzliches Byte für die
        Länge).

                           Im Gegensatz zum ANSI-Standard wird VARCHAR bei MySQL-Feldern nicht
                           aufgefüllt. Alle unnötigen Leerzeichen werden aus dem Wert entfernt,
                           bevor er abgespeichert wird.

        Sie können keine Strings ablegen, die länger sind als die von Ihnen festgelegte Feldlänge.
        Bei einem VARCHAR(4)-Feld können Sie also maximal vier Zeichen ablegen. Wenn Sie ver-
        suchen, den String »Happy Birthday« zu speichern, kürzt MySQL den String auf »Happ«.
        Der Nachteil ist, daß es keine Möglichkeit gibt, einen String zu speichern, der die vorge-
        gebene Feldgröße überschreitet. Tabelle 3-2 zeigt den Speicherbedarf für die oben ange-
        gebene, 144 Zeichen lange Wine-Spectator-URL, zusammen mit einer durchschnittlich
        langen 30-Zeichen-URL sowie die maximale String-Länge für den Datentyp.

        Tabelle 3-2: . Der Speicherbedarf für die verschiedenen MySQL-Zeichentypen

                                  Speicherbedarf für einen   Speicherbedarf für einen 30-
         Datentyp                 144-Zeichen-String         Zeichen-String                 Maximale String-Länge
         CHAR(150)                150                        150                            255
         VARCHAR(150)             145                        31                             255
         TINYTEXT(150)            145                        31                             255
         TEXT(150)                146                        32                             65535
         MEDIUMTEXT(150)          147                        33                             16777215
         LONGTEXT(150)            148                        34                             4294967295

        Beachten Sie, daß in dieser Tabelle der Speicherplatzbedarf für die Typen mit variabler
        Länge, MEDIUMTEXT und LONGTEXT, in 1-Byte Stufen wächst. Dieser Zuwachs ist darauf
        zurückzuführen, daß die Größe der Felder mit variabler Länge gespeichert werden muß.
        TEXT benutzt ein zusätzliches Byte, um sich die möglicherweise größere Länge des gespei-
        cherten Textes zu merken. MEDIUMTEXT nutzt analog 2 Byte mehr als VARCHAR und LONGTEXT
        zusätzliche 3 Byte.
        Wenn sich nach einigen Betriebsjahren herausstellt, daß sich die Welt verändert hat, und
        ein Datenbankfeld, das bislang mit VARCHAR(25) wunderbar zurechtkam, nun doch 30
        Zeichen aufnehmen muß, dann stehen Sie nicht im Regen. MySQL stellt einen Befehl
        namens ALTER TABLE zur Verfügung, mit dem die Änderung von Feldtypen ohne Daten-
        verlust möglich ist:
Max.        ALTER TABLE meinetabelle MODIFY meinespalte LONGTEXT
                                                                                                                    Max.
Linie                                                                                                               Linie
        36 |   Kapitel 3: SQL, so wie es MySQL versteht
                                         This is the Title of the Book, eMatter Edition
                            Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Rechts
         Binäre Datentypen
         MySQL stellt eine Reihe binärer Datentypen zur Verfügung, die sich stark an den zei-
         chenorientierten Typen orientieren. Die binären Datentypen von MySQL sind CHAR
         BINARY, VARCHAR BINARY, TINYBLOB, BLOB, MEDIUMBLOB und LONGBLOB. Der praktische Unter-
         schied zwischen den zeichenorientierten Typen und ihren binären Gegenstücken ist
         deren Kodierung. Binärdaten sind grundsätzlich nur eine Ansammlung von Daten, die
         MySQL in keiner Weise interpretiert. Bei zeichenorientierten Daten wird andererseits
         davon ausgegangen, daß sie Textdaten enthalten, die auf unseren Alphabeten basieren.
         Sie werden daher gemäß dem in Frage kommenden Zeichensatz kodiert und sortiert.
         MySQL sortiert binäre Daten auf einem ASCII-System in ASCII-Reihenfolge, wobei zwi-
         schen Groß- und Kleinschreibung unterschieden wird.

         Aufzählungen und Mengen
         MySQL stellt zwei weitere spezielle Datentypen zur Verfügung. Der Aufzählungstyp ENUM
         erlaubt es Ihnen, beim Anlegen der Tabelle eine Liste von Werten anzugeben, die in die-
         ses Feld eingetragen werden dürfen. Besitzen Sie zum Beispiel eine Spalte namens frucht,
         in der nur die Werte apfel, orange, kiwi oder banane erlaubt sein sollen, würden Sie die-
         ser Spalte den Typ ENUM zuweisen:
             CREATE TABLE essen(essen_id INT NOT NULL PRIMARY KEY,
                               frucht ENUM('apfel', 'orange', 'kiwi',
                                           'banane'))

         Wenn Sie einen Wert in diese Spalte einfügen, muß es sich um eine der angegebenen
         Früchte handeln. Da MySQL im voraus weiß, welche Werte in dieser Spalte gültig sind,
         kann es sie zu einem numerischen Typ abstrahieren. Anstatt also den String apfel in der
         Spalte abzulegen, wird eine einzelne Zahl gespeichert. Sie verwenden jedoch apfel in ei-
         ner Query oder wenn Sie sich Ergebniswerte aus MySQL ausgeben lassen. apfel wird
         aber auch benutzt, wenn Sie die Tabelle nutzen oder wenn Sie sich Ergebnisse in dieser
         Tabelle ansehen.
         Der MySQL-Mengentyp SET funktioniert auf die gleiche Weise, ermöglicht es Ihnen aber,
         mehrere Werte gleichzeitig in einem Feld abzulegen, und nutzt intern Bits anstelle von
         Bytes.

         Andere Arten von Daten
         Jede Art von Daten, die Ihnen jemals begegnet, kann in numerischen oder zeichenorien-
         tierten Typen abgelegt werden. Technisch gesehen können Sie Zahlen sogar in Zeichen-
         typen speichern. Daß man das machen kann, bedeutet andererseits aber nicht, daß man
         es auch machen sollte. Nehmen wir zum Beispiel die Speicherung von Datumsangaben in
         der Datenbank. Sie könnten diese Werte als BIGINT im Unix-Stil abspeichern oder als
 Max.    Kombination von einzelnen Spalten für den Tag, den Monat und das Jahr. Wie sucht                       Max.
 Linie                                                                                                          Linie
                                                                                      MySQL-Datentypen |   37
                                   This is the Title of the Book, eMatter Edition
                          Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Links
        man nun nach den Datensätzen mit einem Datum, die vor einem gegebenen Zeitpunkt
        liegen? Entweder muß die numerische Darstellung dieses Datums berechnet werden,
        oder es wird eine komplexe Operation benötigt, die Tag, Monat und Datum aus den ein-
        zelnen Spalten zusammenfügt.
        Ist das nicht eine echte Qual? Wäre es nicht schön, wenn MySQL irgendeinen Datentyp
        kennen würde, der Ihnen diese Aufgaben abnimmt? Tatsächlich stellt MySQL spezielle
        Datentypen zur Verfügung, mit denen übliche, abstrakte Datentypen gespeichert werden
        können. Es unterstützt das Datumskonzept durch den DATE-Datentyp. Andere Datenty-
        pen sind DATETIME und TIMESTAMP.

        Indizierung
        Obwohl MySQL eine bessere Performance bietet als irgendeiner der großen Datenbank-
        Server, verlangen einige Probleme dennoch ein sorgfältiges Datenbank-Design. So würde
        beispielsweise die Suche nach einer bestimmten Spalte in einer Tabelle mit Millionen von
        Datensätzen sehr lange dauern. Die meisten Datenbank-Engines nutzen einen Index, um
        bei der Suche zu helfen.
        Indizes ermöglichen es der Datenbank, Daten in einer Weise abzulegen, die Suchopera-
        tionen beschleunigt. Leider müssen Sie für den Vorteil schneller Suchoperationen Plat-
        tenplatz opfern und Einbußen in der Modifikationsgeschwindigkeit hinnehmen. Die
        effektivste Anwendung von Indizes besteht darin, einen Index für Spalten aufzubauen, in
        denen Sie am häufigsten suchen. MySQL unterstützt die folgende, gängige Syntax für die
        Erzeugung eines Index für eine Tabelle:
            CREATE INDEX index_name ON tabellenname (spalte1,
                                                     spalte2,
                                                         ...,
                                                     spalteN)

        MySQL erlaubt es Ihnen auch, einen Index gleich dann anzulegen, wenn Sie die Tabelle
        erzeugen. Die Syntax sieht wie folgt aus:
            CREATE TABLE material (id         INT      NOT NULL,
                                   name       CHAR(50) NOT NULL,
                                   widerstand INT,
                                   schmelzpunkt REAL,
                                   INDEX index1 (id, name),
                                   UNIQUE INDEX index2 (name))

        In diesem Beispiel werden zwei Indizes für die Tabelle angelegt. Der erste Index, index1,
        setzt sich aus den Feldern id und name zusammen. Der zweite Index besteht nur aus dem
        Feld name und legt fest, daß das name-Feld immer eindeutig sein muß. Wenn Sie versu-
        chen, einen Eintrag vorzunehmen, bei dem der name bereits in einem Datensatz vor-
        kommt, dann schlägt die Einfügeoperation fehl. Alle Felder in einem eindeutigen Index
Max.    sollten als NOT NULL deklariert werden.                                                     Max.
Linie                                                                                               Linie
        38 |   Kapitel 3: SQL, so wie es MySQL versteht
                                         This is the Title of the Book, eMatter Edition
                            Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Rechts
         Obwohl wir einen Index für name erzeugt haben, haben wir keinen Index für id angelegt.
         Würden wir einen solchen Index benötigen, müßten wir ihn nicht anlegen – er ist bereits
         da. Enthält ein Index mehr als eine Spalte (zum Beispiel name, rang und seriennummer),
         liest MySQL die Spalten nacheinander von links nach rechts. Aufgrund der von MySQL
         verwendeten Index-Struktur werden alle Untergruppen der Spalten von links nach rechts
         automatisch als Indizes innerhalb des »Haupt«-Index angelegt. So sind name für sich und
         name zusammen mit rang beides »kostenlose« Indizes, die bei der Erzeugung des Index
         name, rang, seriennummer angelegt wurden. Ein Index für rang selbst oder für name und
         seriennummer zusammen wird aber nicht erzeugt. Das müssen Sie explizit selbst erledi-
         gen.
         MySQL unterstützt auch die ANSI-SQL-Semantik für einen besonderen Index namens
         Primärschlüssel (PS). Bei MySQL ist ein Primärschlüssel ein eindeutiger Schlüssel mit
         dem Namen PRIMARY. Indem Sie eine Spalte bei der Erzeugung als Primärschlüssel
         bezeichnen, machen Sie ihn zu einem eindeutigen Index, der die Verknüpfung (Join) von
         Tabellen unterstützt. Das folgende Beispiel erzeugt eine stadt-Tabelle mit dem Primär-
         schlüssel id:
             CREATE TABLE stadt (id      INT NOT NULL PRIMARY KEY,
                                 name    VARCHAR(100),
                                 bev     MEDIUMINT,
                                 gegr    DATE)

         Bevor Sie eine Tabelle anlegen, sollten Sie bestimmen, welche Felder die Schlüssel sein
         sollen (falls es welche gibt). Wie oben bereits erwähnt, sind alle Felder, die Joins unter-
         stützen, gute Kandidaten für Primärschlüssel. In Kapitel 7 werden wir ausführlich erläu-
         tern, wie Ihren Tabellen gute Primärschlüssel zugeordnet werden können.

                         ANSI SQL unterstützt einen besonderen Schlüsseltyp, einen sogenannten
                         foreign key (Fremdschlüssel). Fremdschlüssel helfen die Datenbankintegri-
                         tät zu erhalten, indem sie es der Datenbank ermöglichen, gewisse Dinge zu
                         tun, wie zum Beispiel Datensätze zu löschen, von denen Datensätze in
                         anderen Tabellen abhängen. Obwohl MySQL die ANSI-Syntax für Fremd-
                         schlüssel unterstützt, nutzt es die Fremdschlüssel jedoch nicht, um die
                         Integrität der Datenbank zu erhalten. Dies ist eine Situation, in der das
                         Einführen eines Features einen Geschwindigkeitsverlust ohne echten Nut-
                         zen bedeuten würde. Die Anwendungen sollten sich im Allgemeinen selbst
                         um die Integrität von Fremdschlüsseln kümmern.

 Max.                                                                                                                Max.
 Linie                                                                                                               Linie
                                                                                              Indizierung   |   39
                                   This is the Title of the Book, eMatter Edition
                          Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Links
        Daten verwalten
        Wenn Sie eine Tabelle neu angelegt haben, nehmen Sie natürlich zunächst Daten auf.
        Sobald die Daten einmal aufgenommen wurden, werden Sie Änderungen vornehmen
        und manche Datensätze auch löschen wollen.

        Einfügen (Insert)
        Das Hinzufügen von Daten in eine Tabelle ist eines der einfachsten Konzepte von SQL.
        Sie haben in diesem Buch bereits mehrere Beispiele gesehen. MySQL unterstützt die übli-
        che INSERT-Syntax von SQL:
            INSERT INTO tabellenname (spalte1, spalte2, ..., spalteN)
            VALUES (wert1, wert2, ..., wertN)

        Mit dieser Syntax werden zuerst die Spalten angegeben, gefolgt von den Werten, die
        diese Spalten im neuen Datensatz füllen sollen. Wenn Sie Daten in numerische Felder
        eingeben, können Sie die Werte so angeben, wie sie sind. Bei allen anderen Feldern müs-
        sen Sie Hochkommata verwenden. Um beispielsweise eine Datenzeile in eine Tabelle mit
        Adressen einzufügen, könnten Sie den folgenden Befehl eingeben:
            INSERT INTO addressen (name, addresse, stadt, staat, tel, alter)
            VALUES('Irving Forbush', '123 Mockingbird Lane', 'Corbin', 'KY',
                   '(800) 555-1234', 26)

        Zusätzlich können Sie mit einer Escape-Sequenz (standardmäßig \) Hochkommata und
        andere Vorkommen der Escape-Sequenz selbst schützen:
            # Informationen zu Stacies Verzeichnis, das in c:\Perosonal\Stacie liegt,
            # in der Tabelle ablegen
            INSERT INTO datei (beschreibung, ort)
            VALUES ('Stacie\'s Verzeichnis', 'C:\\Personal\\Stacie')

        Bei MySQL können Sie die Spaltennamen auch weglassen, solange Sie die Werte für die
        einzelnen Spalten in der Tabelle in genau der gleichen Reihenfolge und der passenden
        Anzahl angeben, die auch beim CREATE-Aufruf für die Tabelle verwendet wurde. Wenn
        Sie aber die Standardwerte für eine Spalte verwenden wollen, müssen Sie die Namen der
        Spalten angeben, für die Sie vom Standard abweichende Werte eintragen wollen. Wenn
        es beispielsweise in der Tabelle datei eine Spalte grösse gäbe, so wäre hier der Standard-
        wert für Stacie’s Verzeichnis genommen worden. MySQL erlaubt es Ihnen, einen eigenen
        Standardwert festzulegen, während Sie die Tabelle mit CREATE anlegen. Wenn kein Stan-
        dardwert für eine Spalte festgelegt wurde und wenn diese Spalte NOT NULL ist, müssen Sie
        die Spalte in der INSERT-Anweisung mit einem Wert ungleich NULL angeben.
        Neuere MySQL-Versionen unterstützen einen im Standard nicht vorgesehenen INSERT-
        Aufruf, bei dem mehrere Zeilen auf einmal übergeben werden können:

Max.        INSERT INTO essen VALUES (NULL, 'Orangen', 133, 0, 2, 39),
                                     (NULL, 'Bananen', 122, 0, 4, 29),                               Max.
Linie                                (NULL, 'Leber', 232, 3, 15, 10)
                                                                                                     Linie
        40 |   Kapitel 3: SQL, so wie es MySQL versteht
                                         This is the Title of the Book, eMatter Edition
                            Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Rechts
                         Obwohl die von MySQL unterstützte, vom Standard abweichende Syntax
                         für schnelle Administrationsaufgaben sehr nützlich ist, sollten Sie sie bei
                         der Entwicklung von Datenbank-Anwendungen nicht verwenden, solange
                         Sie nicht wirklich auf die von ihr gebotenen Geschwindigkeitsvorteile
                         angewiesen sind. Generell sollten Sie sich, soweit es MySQL erlaubt, an
                         den ANSI-SQL2-Standard halten. Auf diese Weise stellen Sie sicher, daß
                         Sie in Zukunft problemlos auf eine andere Datenbank umsteigen können.
                         Diese Flexibilität ist besonders für Leute mit mittelgroßen Datenbanken
                         wichtig, da hier die Möglichkeit besteht, daß diese Leute irgendwann ein-
                         mal High-End-Datenbank-Ansprüche haben.

         MySQL unterstützt eine weitere nicht dem Standard entsprechende Syntax, die es
         erlaubt, den Spaltennamen und den dazugehörigen Wert gemeinsam anzugeben:
             INSERT INTO buch SET titel='The Vampire Lestat', autor='Anne Rice';

         Außerdem können Sie Daten auch noch einfügen, indem Sie die Daten aus einer anderen
         Tabelle (oder Gruppe von Tabellen) nehmen, um mit ihnen Ihre Tabelle zu füllen:
             INSERT INTO essen (name, fett)
             SELECT essen_name, gramm_fett FROM rezepte

         Beachten Sie, daß die Anzahl der Spalten in INSERT der Anzahl der Spalten in SELECT ent-
         spricht. Darüber hinaus müssen die Datentypen der INSERT-Spalten mit denen der ent-
         sprechenden SELECT-Spalten übereinstimmen. Abschließend sei noch erwähnt, daß die
         SELECT-Klausel in einer INSERT-Anweisung keinen Modifikator ORDER BY enthält, und
         nicht aus der gleichen Tabelle stammen darf wie das INSERT.

         Das Erzeugen von Sequenzen
         Der beste Primärschlüssel ist einer, der für die Datenbank absolut keine Bedeutung hat,
         außer der, als Primärschlüssel zu dienen. Primärschlüssel sind die Hilfsmittel, die dazu
         genutzt werden, um Datensätze in einer relationalen Datenbank eindeutig zu identifizie-
         ren. Wenn also ein Benutzername oder eine E-Mail-Adresse als Primärschlüssel verwen-
         det werden, sagen Sie im Prinzip aus, daß der Benutzername oder die E-Mail-Adresse Teil
         dieser Person sind. Wenn diese Person jemals ihren Benutzernamen oder ihre E-Mail-
         Adresse ändert, wird es Sie einige Anstrengung kosten, die Integrität der Datenbank
         sicherzustellen. Es ist daher besser, im Entwurf eine bedeutungslose Zahl als Primär-
         schlüssel zu benutzen.
         Das erreicht man am besten mit einem numerischen Primärschlüssel, der beim Einfügen
         einer neuen Zeile automatisch inkrementiert wird. Wenn wir uns die stadt-Tabelle von
         eben noch einmal ansehen, hätte die erste eingefügte Stadt also die id 1, die zweite 2, die
         dritte 3 und so weiter. Um diese Sequenzierung eines Primärschlüssels erfolgreich verwal-
         ten zu können, müssen Sie irgendwie garantieren können, daß eine Zahl von jeweils
 Max.    genau einem Client zur Zeit gelesen und inkrementiert werden kann. Dies erreichen Sie                     Max.
         dadurch, daß die Spalte des Primärschlüssels als AUTO_INCREMENT deklariert wird.
 Linie                                                                                                             Linie
                                                                                        Daten verwalten   |   41
                                   This is the Title of the Book, eMatter Edition
                          Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Links
        Wenn Sie eine Tabelle bei MySQL anlegen, können Sie maximal eine der Spalten als
        AUTO_INCREMENT festlegen. Wenn Sie das tun, wird automatisch der aktuelle Wert plus 1
        in dieser Spalte abgelegt, wenn Sie einen neuen Datensatz einfügen und NULL oder 0 als
        Wert angeben. Die AUTO_INCREMENT-Spalten müssen indiziert sein. Der folgende Befehl
        erzeugt die stadt-Tabelle mit dem id-Feld als AUTO_INCREMENT:1
             CREATE TABLE stadt     (id       INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
                                     name     VARCHAR(100),
                                     bev      INT,
                                     gegr     DATE)

        Wenn Sie das erste Mal eine Zeile einfügen, enthält das id-Feld des ersten Datensatzes
        den Wert 1, solange Sie NULL oder 0 für dieses Feld in der INSERT-Anweisung verwenden.
        So nutzt der folgende Befehl beispielsweise das AUTO_INCREMENT-Feature:
             INSERT INTO stadt (id, name, bev)
             VALUES (NULL, 'Houston', 3000000)

        Liegen keine anderen Werte in der Tabelle vor, wenn der Befehl eingegeben wird, setzt
        MySQL den Feldwert auf 1, nicht auf NULL (erinnern Sie sich daran, daß er nicht NULL sein
        kann). Sind bereits Werte in der Tabelle enthalten, ist der eingefügte Wert um eins höher
        als der aktuelle Maximalwert für id.
        Eine andere Möglichkeit, Sequenzen zu implementieren, besteht darin, sich auf den von
        der Funktion LAST_INSERT_ID() zurückgegebenen Wert zu beziehen, und eins zu addie-
        ren:
             UPDATE tabellenname SET id=LAST_INSERT_ID( id+1 );

        Das Attribut AUTO_INCREMENT darf für höchstens eine Spalte mit ganzzahligem Datentyp in
        einer Tabelle genutzt werden. Zusätzlich zur Einschränkung auf einen ganzzahligen
        Datentyp muß die Spalte entweder ein Primärschlüssel oder die einzige Spalte in einem
        eindeutigen Index sein. Wenn Sie in eine Tabelle mit einem solchen ganzzahligen Feld
        Werte eingeben und für dieses Feld keinen Wert (oder NULL) angeben, wird hier automa-
        tisch der um eins größere Wert als das aktuelle Spaltenmaximum eingefügt.
        Kapitel 17 enthält Referenzmaterial für die Funktion LAST_INSERT_ID( ).

        Aktualisieren (Update)
        Das Einfügen neuer Datensätze in die Datenbank ist nur der Anfang vom Datenmanage-
        ment. Solange die Datenbank nicht nur gelesen werden darf, werden Sie die Daten wahr-
        scheinlich in regelmäßigen Abständen ändern. Gemäß dem SQL-Standard sieht die
        Modifikationsanweisung wie folgt aus:

        1   Man kann einen beliebigen Startwert für AUTO_INCREMENT angeben, indem der Startwert am Ende der CREATE-
Max.        Anweisung angegeben wird. Um beispielsweise bei 1025 mit der Inkrementierung anzufangen, wird AUTO_
            INCREMENT = 1025 nach der letzten schließenden Klammer des CREATE TABLE-Befehls angegeben.
                                                                                                                      Max.
Linie                                                                                                                 Linie
        42 |    Kapitel 3: SQL, so wie es MySQL versteht
                                          This is the Title of the Book, eMatter Edition
                             Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Rechts
             UPDATE tabellenname
             SET spalte1=wert1, spalte2=wert2, ..., spalteN=wertN
             [WHERE klausel]

         Sie geben explizit den Namen der zu aktualisierenden Tabelle, und die zuzuweisenden
         Werte in der SET-Klausel an und wählen die zu bearbeitenden Datensätze mit der WHERE-
         Klausel aus. Wird keine WHERE-Klausel angegeben, so aktualisiert MySQL alle Datensätze
         in der angegebenen Tabelle.
         Sie können einer Spalte nicht nur explizite Werte zuweisen, sondern auch Werte berech-
         nen lassen. Dabei können Sie sich sogar auf eine andere Spalte beziehen:
             UPDATE jahre
             SET end_jahr = start_jahr+5

         Dieser Befehl berechnet den Wert für die end_jahr-Spalte jeder Zeile dieser Tabelle aus
         dem Wert der jeweiligen start_jahr-Spalte plus 5.

         Die WHERE-Klausel
         Der letzte Abschnitt stellte eines der wichtigsten SQL-Konzepte vor: die WHERE-Klausel.
         Bei SQL ermöglicht es Ihnen die WHERE-Klausel, bestimmte Zeilen aus der Tabelle auszu-
         wählen, bei denen bestimmte von Ihnen festgelegte Werte in bestimmten Spalten enthal-
         ten sind. Ein Beispiel:
             UPDATE band
             SET lead_saenger = 'Ian Anderson'
             WHERE band_name = 'Jethro Tull'

         Dieses UPDATE legt fest, daß die Spalte lead_saenger nur in der Zeile geändert werden soll,
         in der der band_name identisch mit »Jethro Tull« ist. Wenn die fragliche Spalte kein ein-
         deutiger Index ist, kann diese WHERE-Klausel auf mehrere Datensätze zutreffen. Viele SQL-
         Befehle nutzen WHERE-Klauseln als Hilfsmittel, um genau die Datensätze auszuwählen,
         mit denen Sie arbeiten wollen. Da die Spalten der WHERE-Klausel durchsucht werden, soll-
         ten Sie generell Indizes für die bei Ihnen üblichen Kombinationen anlegen. Wir werden
         die verschiedenen Arten der Vergleiche, die mit der WHERE-Klausel durchgeführt werden
         können, später in diesem Kapitel behandeln.

         Löschen (Delete)
         Das Löschen von Daten ist eine sehr einfache Operation. Sie geben einfach eine Tabelle
         an, aus der Sie Daten löschen möchten, und hängen eine WHERE-Klausel an, die die zu
         löschenden Datensätze spezifiziert:
             DELETE FROM tabellenname [WHERE klausel]

         Wie bei allen Befehlen, die die WHERE-Klausel akzeptieren, ist der WHERE-Teil optional.
         Falls Sie die WHERE-Klausel weglassen, werden alle Datensätze der Tabelle gelöscht! Von
 Max.    allen destruktiven SQL-Befehlen kann dieser am einfachsten versehentlich ausgeführt
                                                                                                                   Max.
 Linie   werden.                                                                                                   Linie
                                                                                        Daten verwalten   |   43
                                   This is the Title of the Book, eMatter Edition
                          Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Links
        MySQL 4.0 führt eine neue, gefährliche Form von DELETE ein, die das gleichzeitige
        Löschen aus mehreren Tabellen mittels eines einzigen Befehls ermöglicht:
            DELETE tabelle1, tabelle2, ..., tabelleN
            FROM tabelle1, tabelle2, ... tabelleN
            [WHERE klausel]

        In dieser Syntax hat die FROM-Klausel nicht dieselbe Bedeutung wie in der einfacheren
        Form. Die Klausel gibt nämlich nicht die Tabellen an, aus denen gelöscht werden soll,
        sondern vielmehr, welche Tabellen mit der WHERE-Klausel angesprochen werden. Sie hat
        dieselben Auswirkungen wie die FROM-Klausel im SELECT-Befehl, für den Fall, daß Sie mit
        diesem Befehl vertraut sind. Die Namen der Tabellen, aus denen gelöscht werden soll,
        werden direkt nach der DELETE-Anweisung angegeben:
            DELETE Autor, Adresse
            FROM Autor, Buch, Adresse
            WHERE Autor.autor_id = Adesse.adresse_id
            AND Autor.autor_id = Buch.autor_id
            AND Buch.veroeffentlichung < 1980;

        Diese Anweisung löscht alle Autoren und jegliche Adress-Informationen über diese Auto-
        ren in der Adresse-Tabelle für jeden Autor, der Bücher vor 1980 veröffentlicht hat. Die
        alten Bücher hingegen bleiben in der Buch-Tabelle, da Buch nicht nach dem DELETE-
        Schlüsselwort aufgeführt wurde. Auf die komplexe Natur der WHERE-Klauseln wird noch
        später in diesem Kapitel eingegangen.

        Abfragen (Queries)
        Der letzte übliche SQL-Befehl wird verwendet, um sich die Daten in der Datenbank
        anzusehen: SELECT. Diese Operation ist die bei weitem am häufigsten durchgeführte
        SQL-Operation. Während die Eingabe und Modifikation von Daten nur gelegentlich vor-
        kommen, verbringen die meisten Datenbanken einen Großteil ihres Lebens mit der
        Rückgabe von angeforderten Daten. Die allgemeine Form der SELECT-Anweisung sieht
        wie folgt aus:
            SELECT spalte1, spalte2, ..., spalteN
            FROM tabelle1, tabelle2, ..., tabelleN1
            [WHERE klausel]

        Diese Syntax ist die üblichste Form, über die Daten aus einer beliebigen SQL-Datenbank
        abgefragt werden können. Der erste Teil einer SELECT-Anweisung zählt die Spalten einer
        oder mehrerer Tabellen auf, die Sie betrachten wollen. Die WHERE-Klausel filtert die unge-
        wünschten Datensätze heraus.
        Natürlich gibt es Variationen, um komplexe und mächtige Abfragen zu gestalten. Wir
        behandeln alle Aspekte der SELECT-Syntax in Kapitel 15. Die einfachste Form von SELECT
        ist:
Max.        SELECT 1;
                                                                                                     Max.
Linie                                                                                                Linie
        44 |   Kapitel 3: SQL, so wie es MySQL versteht
                                         This is the Title of the Book, eMatter Edition
                            Copyright © 2002 O’Reilly & Associates, Inc. All rights reserved.
Sie können auch lesen