SQL, SO WIE ES MYSQL VERSTEHT
←
→
Transkription von Seiteninhalten
Wenn Ihr Browser die Seite nicht korrekt rendert, bitte, lesen Sie den Inhalt der Seite unten
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