selfsql

58
SelfSQL: SQL - Tutorial für Anfänger Klaus Becker, [email protected], http://www.becker-k.de/

Upload: geraldatdsa

Post on 19-Dec-2015

215 views

Category:

Documents


3 download

DESCRIPTION

First steps with SQL Databases

TRANSCRIPT

  • SelfSQL: SQL Tutorial fr AnfngerKlaus Becker, [email protected], http://www.beckerk.de/

  • SelfSQL: Table of ContentSQL ?..................................................................................................................................................1

    Datenbanken?....................................................................................................................................2

    Select Statement.............................................................................................................................4

    Insert Statement.............................................................................................................................8

    Update Statement.........................................................................................................................12

    Delete Statement..........................................................................................................................13

    WhereKlausel.................................................................................................................................14

    Order By...........................................................................................................................................18

    Group By..........................................................................................................................................19

    Create Table Statement................................................................................................................20

    Alter Table Statement...................................................................................................................24

    Rename Table Statement.............................................................................................................28

    Drop Table Statement..................................................................................................................29

    Show Tables Statement...............................................................................................................30

    Describe Table Statement............................................................................................................31

    Optimize Table Statement............................................................................................................33

    Repair Table Statement................................................................................................................34

    Backup Table Statement..............................................................................................................35

    Restore Table Statement.............................................................................................................36

    Use Statement...............................................................................................................................37

    Create Database Statement.........................................................................................................38

    Drop Database Statement............................................................................................................39

    Show Databases Statement.........................................................................................................40

    Funktionen in MySQL......................................................................................................................41

    SelfSQL: SQL Tutorial fr Anfnger 17.05.2001 22:44:24

    SelfSQL: SQL Tutorial fr Anfnger 17.05.2001 22:44:24

  • SelfSQL: Table of ContentINDEX / INDIZIES in MySQL............................................................................................................47

    FULLTEXT Index...........................................................................................................................49

    Feldtypen in MySQL........................................................................................................................52

    Kontakt.............................................................................................................................................55

    SelfSQL: SQL Tutorial fr Anfnger 17.05.2001 22:44:24

    SelfSQL: SQL Tutorial fr Anfnger 17.05.2001 22:44:24

  • SQL ?Diese kurze Einfhrung in SQL (Structured Query Language) soll einige "Basics" dieser Spracheerklren damit der praktische Einstieg in SQL fr Anfnger einfacher wird. Nicht mehr.Fortgeschrittene Anwender werden hier deshalb vieles vermissen.

    Die Beispiele beziehen sich auf die fr einige Betriebssysteme frei erhltliche Datenbank "MySQL"der Firma "MySQL AB". Aber auch ohne diese Datenbank ist man nicht aufgeschmissen. Dieallermeisten Beispiele funktionieren auch mit anderen Datenbanken (z.B. Microsoft Access,MSSQL Server).

    Detailliertere Informationen zu MySQL sowie die jeweils aktuellen Installationsdateien fr Windows,Linux und diverse UNIXDerivate findet man unter http://www.mysql.com/downloads/. Bitteunbedingt die Lizenzbestimmungen beachten!

    Wer weitergehende Fragen zu SQL bzw. zum Funktionsumfang von MySQL hat findet unter derAdresse http://www.mysql.com/documentation/ umfangreiche Dokumentationen.

    Was ist SQL?Der Begriff SQL steht fr Structured Query Language. bersetzt bedeutet das soviel wie"Strukturierte Abfrage Sprache". SQL sollte zumindest von der Idee her die Abfrage vonDatenbanken standardisieren. Allerdings gibt es bei vielen Datenbanken mehr oder weniger groeAbweichungen. U.a. auch bei MySQL.

    Man kann SQL in zwei Teilbereiche unterteilen:

    SQL (Structured Query Language)`. DML (Data Manipulation Language)a.

    Die Unterscheidung spielt in der Praxis allerdings kaum eine Rolle.

    Letzte nderung: 17. Mai 2002, 21:26 Uhr 2001, Klaus Becker, [email protected], www.beckerk.de/mysql/

  • Datenbanken?Wie sieht eine Datenbank aus?Fast alle gngigen Datenbank sind relationale Datenbanken. Objektorientierte Datenbankenspielen momentan noch keine groe Rolle. Hier soll es nur um die relationalen Kollegen gehen.

    Eine Datenbank besteht aus mindestens einer meistens jedoch mehrerer mit einander inBeziehung stehenden Tabellen. In den Tabellen sind die Daten "organisiert". In den Spaltenkpfender Tabellen stehen die Feldnamen und in den Zeilen, genauer gesagt in den einzelnen Zellen, dieWerte. Jede Zeile enthlt einen Datensatz.

    Beispiel:

    id anrede vorname nachname strasse plz ort

    1 Herr Ludwig Laberbacke Laberstrasse 11 27861 Lordhausen

    2 Frau Paula Tratschig Sonnenstrae 56 89894 Augustburg

    3 Frau Petra Timmers Feldweg 1 65323 Langenort

    ... ... ... ... ... ... ...

    Jeder Wert (jedes Feld!) ist hnlich wie beim Schachbrett eindeutig bestimmbar. So ist z.B. derWert "Timmers" ber die dritte Spalte im Feld "nachname" definiert. Aus der Definition "zweiteSpalte plz" ergibt sich der Wert "89894". Diese Eindeutigkeit ist sehr zentral fr das Verstndnisvon SQL.

    Formen des DatenhandlingsBeim Umgang mit Daten in einer Datenbank kennt SQL vier Grundspielarten:

    SELECTAnweisung: Ausqahl von Daten aus einer Tabelle bzw. aus mehreren Tabellen INSERTAnweisung: Schreiben von Daten in eine Tabelle DELETEAnweisung: Lschen von Daten aus einer Tabelle UPDATEAnweisung: Verndern von Daten in einer Tabelle

    Fr jede dieser vier Anweisungsarten gilt, da der Name der von der Anweisung betroffenenTabelle mit angegeben werden mu.

    Hinweise zur SyntaxUm die folgenden Beispiele leichter lesbar und nachvollziehbar zu machen, habe ich mich anfolgende Syntax gehalten: Alle "SQLBegriffe" sind gro geschrieben; alle Begriffe die Tabellenentstammen (z.B. der Name der Tabelle, die Feldnamen) sind grundstzlich klein geschrieben.

    Beispiel:

    SELECT vorname, nachname FROM adressen WHEREnachname='Becker'

  • Hinweis: Es empfiehlt sich, beim Anlegen einer Tabelle in einer Datenbank alle Feldnamen klein zuschreiben. Umlaute in den Feldnamen sollten vermieden werden (lieber oe statt ). Gleiches gilt frdie Benennung der Tabellen selbst. So kann man vermeiden, da man spter stndig in derTabelle nachsehen mu, wie sich der Feldname, bzw. der Tabellenname denn nochmal schreibt...

    Letzte nderung: 17. Mai 2002, 21:26 Uhr 2001, Klaus Becker, [email protected], www.beckerk.de/mysql/

  • Select Statement

    Alle Daten aus einer Tabelle holen1.

    Eine bestimmte Spalte aus einer Tabelle holen2.

    Mehrere bestimmte Spalten aus einer Tabelle holen3.

    Spalten aus mehreren Tabellen holen4.

    Mehrere Tabellen aus verschiedenen Datenbanken abfragen5.

    Tabellen exportieren: SELECT * INTO OUTFILE6.

    Einschrnken von Ergebnismengen7.

    Bedeutung:Mit der SELECTAnweisung lassen sich alle oder bestimmte Daten aus einer oder mehrerenTabellen holen.

    Alle Daten aus einer Tabelle holenAllgemeine Form:

    SELECT * FROM tabelle

    Im Beispiel werden alle Daten aus der Tabelle adressen geholt (alle Werte aus allen Spalten). DasSternchen in derAnweisung fungiert als Platzhalter. Da alle Daten aus der Tabelle geholt werdenist das Ergebnis dieser Abfrage identisch mit der Tabelle adressen.

    SELECT * FROM adressen

    Eine bestimmte Spalte aus einer Tabelle holenHufig bentigt man aber garnicht alle Daten aus einer Tabelle sondern nur einige Spalten. Indiesem Fall mu der Name des gewnschten Feldes (Spalte) explizit angegeben werden.

    SELECT nachname FROM adressen

    Als Ergebnis der obigen Abfrage werden alle Werte des Feldes nachname der Tabelle adressenausgegeben. Kurz: Alle Nachnamen werden ausgegeben. Das Ergebnis knnte dann z.B. wie in

  • der folgenden Abbildung aussehen.

    Beispiel:nachname

    Laberbacke

    Tratschig

    Timmers

    Mehrere bestimmte Spalten aus einer Tabelle holenWill man mehrere Felder gleichzeitig abfragen mssen die Feldnamen durch Komma undLeerzeichen getrennt hintereinander geschrieben werden.

    SELECT anrede, vorname, nachname, strasse, ort FROMadressen

    Als Ergebnis der obigen Abfrage werden alle Werte der angegebenen Felder der Tabelle adressenausgegeben. Folgendes Ergebnis wre denkbar:

    Beispiel:anrede vorname nachname strasse ort

    Herr Ludwig Laberbacke Laberstrasse 11 Lordhausen

    Frau Paula Tratschig Sonnenstrae 56 Augustburg

    Frau Petra Timmers Feldweg 1 Langenort

    Auer den Feldern id und plz sind alle Felder wie in der Anweisung angegeben in der Abfrageenthalten.

    Spalten aus mehreren Tabellen holenWill man mehrere Felder aus mehreren Tabellen in einem Statement abfragen mssen die Namender Tabellen durch Komma und Leerzeichen getrennt hintereinander (hinter FROM) geschriebenwerden.

    Beispiel:SELECT vorname, nachname, verein, pkw FROM adressen,interessen

    Kommt ein Feld in beiden Tabellen vor, so muss jedem Feld der Tabellenname vorangestelltwerden da der Feldname ansonsten nicht eindeutig ist.

    Beispiel:SELECT adressen.vorname, nachname,interessen.vorname, verein, pkw FROM adressen,interessen

  • Es knnen auch mehr als zwei Tabellen in einer Abfrage angesprochen werden. Hier ist jedochVorsicht angesagt: Je grer die abgefragten Tabellen sind und je mehr Tabellen und Felderabgefragt werden desto grer die Ergebnismengen. Hier knnen schnell riesengroeErgebnismengen entstehen.

    Beispiel:SELECT adressen.vorname, adressen.nachname,interessen.vorname, interessen.nachname,interessen.verein, beruf.gehaltFROM adressen, interessen, beruf

    Mehrere Tabellen aus verschiedenen Datenbanken abfragenUm Tabellen aus verschiedenen Datenbanken auf dem selben MySQLServer abzufragen muden einzelnen Tabellen ein Prfix mit dem Namen der Datenbanken vorangestellt werden.

    Allgemeine Form:SELECT db1.tabelle3.feldname, db2.tabelle2.feldnameFROM db1.tabelle3, db2.tabelle2.feldname

    Tabellen exportieren: SELECT * INTO OUTFILEMit MySQL ist es mglich, ganze Tabelleninhalte (oder auch Teile) in Textdateien zu exportieren.Und das in einer hohen Geschwindigkeit. Diese Dateien knnen dann als Sicherungsdatei dienenoder aber auch in Access, StarCalc oder hnliches importiert werden.

    Die grundstzliche Syntax ist recht einfach:SELECT * INTO OUTFILE 'C:/temp/data.csv' FROM tabelle

    Es ist auch mglich, die Trennzeichen zwischen den Feldwerten und am Ende jedes Datensatzeszu bestimmen:SELECT * INTO OUTFILE 'C:/temp/data.csv'FIELDS TERMINATED BY ';'LINES TERMINATED BY '\n'FROM tabelle

    Das obige Beispiel wrde eine CSVDatei (Felder getrennt durch Semikolon, Zeilenende durchZeilenumbruch) generieren, die spter z.B. mit Excel weiter bearbeitet werden kann.

    Hinweis: Der Name der Datei, in der das Ergebnis der Abfrage gespeichert werden soll, mu vorFROM stehen. Wenn die Datei nicht existiert versucht MySQL sie anzulegen.

    Beim Exportieren von Daten knnen wie beim 'normalen' SELECT alle Optionen benutzt werden.Im folgenden Beispiel werden nur bestimmte Spalten aus zwei Tabellen exportiert.

  • SELECT tabelle1.feld1, tabelle1.feld2, tabelle2.feld1INTO OUTFILE 'C:/temp/data.csv'FIELDS TERMINATED BY ';'LINES TERMINATED BY '\n'FROM tabelle

    Einschrnken von ErgebnismengenWenn man Tabellen abfragt will man im seltensten Fall den gesamten Tabelleninhalt anzeigen. InMySQL gibt es dazu (wie bei anderen Datenbanken auch) weitere Mglichkeiten, die u.a. inKombination mit dem SELECTStatement benutzt werden knnen:

    WHERE DISTINCT GROUP BY Vergleichsoperatoren wie '=', '!=', '>=', '

  • Insert Statement

    Einen Datensatz in eine Tabelle einspielen1. Mehrere Datenstze auf einmal in eine Tabelle einspielen2. Fehler bei doppelten Werten vermeiden (INSERT IGNORE INTO...)3. Daten aus einer bereits bestehenden Tabelle in eine andere Tabelle bernehmen4. Daten aus einer CSVDatei in eine Tabelle bernehmen5.

    Bedeutung:Mit der INSERTAnweisung lassen sich neue Datestze in eine Tabelle einspielen.

    Allgemeine Form:

    a) Kurzform

    INSERT INTO tabelle ('wert1', 'wert2', 'wert3','wert4')

    b) Vollstndige FormINSERT INTO tabelle(feld1, feld2, feld3, feld4)VALUES('wert1', 'wert2', 'wert3', 'wert4')

    Bei der Kurzform muss die Anzahl der Werte genau der Anzahl der Felder in der Tabelleentsprechen. Die Werte werden in der Reihenfolge der in der Tabelle vorkommenden Felder in dieTabelle eingespielt. Um Fehler zu vermeiden sollte man hier immer auf die vollstndige Form derINSERTAnweisung zurckgreifen.

    Einen Datensatz in eine Tabelle einspielenBeispiel:In folgende Tabellenstruktur soll ein Datensatzeingefgt werden. Das Feld id ist einINTEGERFeld, das eine eindeutige Nummer die automatisch von MySQL vergeben wird(Autoincrement) fr jeden Datensatz enthlt.

    id anrede vorname nachname strasse ort

    1 Herr Ludwig Laberbacke Laberstrasse 11 Lordhausen

    2 Frau Paula Tratschig Sonnenstrae 56 Augustburg

    3 Frau Petra Timmers Feldweg 1 Langenort

    Die Verwendung der folgenden Kurzform wird hier fehlschlagen:

  • INSERT INTO adressen('Herr', 'Klaus', 'Becker', 'Feldweg 1', 'Berlin')

    Grund: Der Wert fr das Feld id ist in der Werteliste nicht vorhanden. Die Anzahl der Werte stimmtnicht mit der Anzahl der Felder berein.

    Aber auch wenn der Wert fr das Feld id mit angegeben wird kann die INSERTAnweisungfehlschlagen. Da man nicht immer sicher sein kann, welche Werte in der Spalte id bereitsvergeben sind kann es passieren, da man versucht einen in der Spalte bereits vergebenen Werteinzufgen. Dies fhrt zu einem Fehler und damit auch dazu, da die Anweisung nicht ausgefhrtwird.

    Die vollstndige Anweisung wrde hier in jedem Fall eher zum Erfolg fhren:

    INSERT INTO adressen('anrede', 'vorname', 'nachname', 'strasse', 'ort')VALUES('Herr', 'Klaus', 'Becker', 'Feldweg 1', 'Berlin')

    Der Wert fr das Feld id braucht hier nicht mit angegeben werden da klar ist welcher Wert inwelches Feld eingespielt werden soll. MySQL wrde automatisch einen DEFAULTWert fr allenicht im Statement genannten Felder mit einfgen, in diesem Fall also auch fr das Feld id.

    Mehrere Datenstze auf einmal in eine Tabelle einspielenHat man sehr viele Datenstze in eine Tabelle einzuspielen kann man sich einiges anSchreibarbeit sparen indem man einfach alle Wertelisten jeweils durch Komma getrennthintereinander schreibt. Auch hier kann man entweder die Kurzfrm oder die vollstndige Formverwenden.

    a) KurzformINSERT INTO tabelle('wert1', 'wert2', 'wert3', 'wert4'),('wert1', 'wert2', 'wert3', 'wert4'),('wert1', 'wert2', 'wert3', 'wert4')

    b) Vollstndige FormINSERT INTO tabelle(feld1, feld2, feld3, feld4)VALUES('wert1', 'wert2', 'wert3', 'wert4'),('wert1', 'wert2', 'wert3', 'wert4'),('wert1', 'wert2', 'wert3', 'wert4')

    Hinweis:"Multiple Inserts" werden wesentlich schneller abgearbeitet als einzelne Inserts (vorrausgesetzt dieAnzahl der einzufgenden Datenstze ist gleich).

  • Fehler bei doppelten Werten vermeiden (INSERT IGNORE INTO...)Wenn Daten in eine Tabelle mit eindeutigen Schlsseln eingespielt werden kommt es zu Fehlern,wenn versucht wird einen bereits enthaltenen Wert erneut in die Tabelle bzw. Spalte einzufgen.Diese Fehler und damit den Abbruch der SQLAnweisung kann man vemeiden wenn man imStatement IGNORE verwendet.

    INSERT IGNORE INTO tabelle (...) VALUES (...)

    Die einzufgende Zeile, die den Wert in einer Spalte verdoppeln wrde, wird bei IGNOREverworfen. Dabei wird keine Fehlermeldung ausgegeben.

    Daten aus einer bereits bestehenden Tabelle in eine andere Tabelle bernehmenMit dem folgenden Statement kann man MySQL anweisen, die Daten aus einer bereitsbestehenden Tabelle in eine andere einzufgen. Voraussetzung dafr ist allerdings, da diebetroffenen Tabellen eine idetische Struktur besitzen.

    INSERT INTO tabelleEinsSELECT * FROM tabelleZwei

    Selbstverstndlich kann man alle Mglichkeiten des SELECTStatements wie z.B. dieWHEREBedingung, die GROUP BYKlausel oder auch ORDER BY hier auch nutzen:

    INSERT INTO tabelleEinsSELECT * FROM tabelleZweiWHERE feld1 = 'wert'

    Daten aus einer CSVDatei in eine Tabelle bernehmenIn MySQL gibt es die Mglichkeit, Daten aus einer CSVDatei in eine bestehende Tabelle zubernehmen. Jede Zeile in der CSVDatei entspricht spter einem Datensatz in der Tabelle.

    LOAD DATA INFILE 'C:/temp/data.csv'INTO TABLE tabelleFIELDS TERMINATED BY ';'ENCLOSED BY '"'LINES TERMINATED BY '\n'

    Wichtig:Die Datenstruktur in der Datei muss der der Tabelle entsprechen (Anzahl der Werte pro Zeile mussder Anzahl der Felder in der Tabelle entsprechen).

    Als Feldtrenner und als Zeilenbegrenzer sollte man solche Zeichen verwenden, die mit Sicherheitnicht in den Daten der Datei vorkommen. Ist 'ENCLOSED BY' angegeben, so nimmt MySQL an,dass die Daten in der Datei jeweils in das angegebene Begrenzungszeichen eingeschlossen sind.Die Angabe ist optional.

    Letzte nderung: 17. Mai 2002, 21:26 Uhr

  • 2001, Klaus Becker, [email protected], www.beckerk.de/mysql/

  • Update Statement

    Bedeutung:Mit der UPDATEAnweisung lassen sich alle oder bestimmte Werte bestimmter Felder in einerTabelle abndern.

    Allgemeine Form:UPDATE tabelle SET feld1 = 'wert1', feld2 = 'wert2'

    Ganz wichtig (!) bei der Ausfhrung von UPDATEStatements ist eine angehangene'WHEREBedingung'. Gibt man diese nicht an so werden immer alle Werte in den angegebenenFeldern abgendert. Durch ein unbedacht abgeschicktes UPDATEStatement kann es passieren,da alle Daten in der Tabelle unbrauchbar werden!

    Allgemeine Form mit WHEREBedingung:UPDATE tabelle SET feld1 = 'wert1', feld2 = 'wert2'WHERE feld3 = 'XYZ'

    Beispiel:UPDATE adressen SET vorname = 'Paul', nachname ='Timmers'

    Im Beispiel werden alle Werte in den Feldern vorname und nachname in Paul bzw. Timmersabgendert. Dies wird in den wenigsten Fllen gewnscht sein. Was hier fehlt ist eineentsprechende WHEREBedingung'. Die Tabelle adressen knnte in diesem Fall so aussehen:anrede vorname nachname strasse ort

    Herr Paul Timmers Laberstrasse 11 Lordhausen

    Frau Paul Timmers Sonnenstrae 56 Augustburg

    Frau Paul Timmers Feldweg 1 Langenort

    Um das ndern aller Werte in den Feldern vorname und nachname zu verhindern knnte man zumBeispiel die Bedingung 'wo strasse gleich Sonnenstrae 56' hinzufgen:

    UPDATE adressen SET vorname = 'Paul', nachname ='Timmers'WHERE strasse = 'Sonnenstrae 56'

    Letzte nderung: 17. Mai 2002, 21:26 Uhr 2001, Klaus Becker, [email protected], www.beckerk.de/mysql/

  • Delete Statement

    Bedeutung:Mit der DELETEAnweisung lassen sich alle oder bestimmte Werte in einer Tabelle lschen.

    Allgemeine Form:DELETE FROM tabelle

    Ganz wichtig (!) bei der Ausfhrung von DELETEStatements ist eine angehangene'WHEREBedingung'. Gibt man diese nicht an so werden immer alle Werte in der Tabellegelscht. Die Tabelle ist dann komplett leer!

    Allgemeine Form mit WHEREBedingung:DELETE FROM tabelle WHERE feld1 = 'XYZ'

    Beispiel:DELETE FROM adressen

    Im Beispiel werden alle Werte in der Tabelle adressen gelscht. Dies wird in vielen Fllen nichtgewnscht sein. Was hier fehlt ist wieder eine entsprechende 'WHEREBedingung'.

    Um z.B. in der untenstehenden Tabelle nur die weiblichen Personen zu lschen mte dasStatement um eine entsprechende 'WHEREBedingung' erweitert werden:

    DELETE FROM adressen WHERE anrede = 'Frau'

    anrede vorname nachname strasse ort

    Herr Ludwig Laberbacke Laberstrasse 11 Lordhausen

    Frau Paula Tratschig Sonnenstrae 56 Augustburg

    Frau Petra Timmers Feldweg 1 Langenort

    Letzte nderung: 17. Mai 2002, 21:26 Uhr 2001, Klaus Becker, [email protected], www.beckerk.de/mysql/

  • WhereKlausel

    Bedeutung:Die WHEREKlausel wird in Verbindung mit dem UPDATE und dem SELECTStatementverwendet. Mit ihr lassen sich Bedingungen formulieren, mit denen die Anzahl der betroffenenDatenstze (Zeilen) eingeschrnkt werden. Innerhalb der WHEREKlausel lassen sichBoolscheOperatoren wie 'AND' oder 'OR' verwenden. Mit dem Klammern von Bedingungen kannman die Ergebnismenge genauer spezifizieren.

    Allgemeine Form:SELECT:SELECT * FROM tabelle WHERE feld1 = 'wert1'

    UPDATE:UPDATE tabelle SET feld1 = 'wert1' WHERE feld1 ='wert1'

    Um zwei oder mehrere Bedingungen zu formulieren kann man 'AND' und/oder 'OR' benutzen:

    SELECT * FROM tabelleWHERE feld1 = 'wert1'AND ( feld2 = 'wert2' OR feld3 = 'wert3' )

    Neben dem oben mehrmals verwendeten Operator '=' gibt es noch weitere wichtige Operatoren:

    '!=' (ungleich) bzw. 'NOT' '>=' (grer gleich) '

  • Die Verwendung der WHEREKlausel ist bei SELECT und UPDATE identisch. Die Beispielebeziehen sich daher nur auf das SELECTStatement.

    Tipp:Mchte man per UPDATEStatement eine Anzahl von Spalten in einer Tabelle ndern so kannman sich wenn man das Statement zu einer SELECTAbfrage umformuliert erst einmalansehen, welche Datenstze von dieser ndrung betroffen sein wrden. Vorraussetzung dafr istallerdings, das die Bedingungen in der WHEREKlausel identisch sind.

    a) Selektierung von Datenstzen ber '=':SELECT vorname, nachname, ortFROM adressenWHERE anrede = 'Frau'

    Die Ergebnismenge enthlt genau zwei Datenstze: Paula und Petra jeweils mit denentsprechenden Nachnamen und den Orten. Das gleiche Resultat lsst sich ber folgenden zweiAbfragen realisieren:

    b) Selektierung von Datenstzen ber '!=':SELECT vorname, nachname, ortFROM adressenWHERE anrede != 'Herr'

    c) Selektierung von Datenstzen ber 'NOT':SELECT vorname, nachname, ortFROM adressenWHERE NOT anrede = 'Herr'

    Die Abfrage b) ist im Grunde identisch mit der Abfrage c). Nur die Schreibweise ist verkrzt.Wichtig bei der Verwendung von 'NOT' ist, da 'NOT' vor dem Feldnamen steht, fr den dieBedingung gelten soll.

    d) Selektierung von Datenstzen ber den Operator 'LIKE':SELECT vorname, nachname, ortFROM adressenWHERE ort LIKE '%g%'

    Der Operator 'LIKE' unterscheidet sich insofern von den bisher dargestellten als dass er 'Wildcards'zult. So werden mit dem obigen Statement z.B. alle Datenstze ausgegeben, die irgendwo(!) imOrtsnamen ein 'g' enthalten. Also Augustburg und Langenort inklusive der zum Datensatzgehrenden Vor und Nachnamen.

    Wichtig:Bei der Verwendung von 'LIKE' ist die Angabe der 'Wildcards'. In diesem Fall das Prozentzeichenvor und nach dem gesuchten Wert (g). Lt man diese Prozentzeichen weg, so verhlt sich dieSuche mit 'LIKE' genauso wie die mit '='. Die Ergebnismenge wre dieselbe. Aus der obigenTabelle wrde kein Datensatz ausgewhlt da kein Ort g in der Tabelle vorhanden ist.

  • Bedeutung der Wildcards:

    % (Prozent) steht fr beliebig viele Zeichen _ (Unterstrich) steht fr genau ein Zeichen

    Beispiel fr die Wildcard '?':

    SELECT vorname, nachname, ortFROM adressenWHERE vorname LIKE 'P____'

    Die Ergebnismenge wre wiederum identisch mit der aus den Abfragen a), b) und c).

    f) Selektierung von Datenstzen ber 'IN':SELECT vorname, nachname, ortFROM adressenWHERE vorname IN ('Paula', 'Petra')

    Bei der Verwendung von 'IN' gibt man die zugelassenen Werte als kommaseparierte Listeinnerhalb einer Klammer an. Die Ergebnismenge dieser Abfrage wre wiederum identisch mit deraus den Abfragen a), b), c) und dem letzten Beispiel in d).

    g) Selektierung von Datenstzen ber 'BETWEEN':SELECT vorname, nachname, ortFROM adressenWHERE plz BETWEEN '20000' AND 40000

    Die Ergebnismenge dieser Abfrage wre wiederum identisch mit der aus den Abfragen a), b), c), f)und dem letzten Beispiel in d).

    h) Selektierung von Datenstzen ber '>=' bzw. '

  • Letzte nderung: 17. Mai 2002, 21:26 Uhr 2001, Klaus Becker, [email protected], www.beckerk.de/mysql/

  • Order By

    Bedeutung:Mit der ORDER BYAnweisung lassen sich die Werte in der Ergebnismenge auf oder absteigendsortieren.

    Allgemeine Form:SELECT * FROM tabelle ORDER BY feld1

    Wichtig:ORDER BY kann nur dann ausgefhrt werden, wenn die gesamte Ergebnismenge bereitsfeststeht. Alle WHEREBedingungen, GROUP BY oder HAVINGAnweisungen mssen vorherausgefhrt worden sein!

    Falsch:SELECT * FROM adressenORDER BY nachnameWHERE vorname = 'Paula'

    Richtig:SELECT * FROM adressenWHERE vorname = 'Paula'ORDER BY nachname

    Die Sortierung kann auf oder absteigend erfolgen (ASC, DESC). Wenn weder ASC noch DESCangegeben ist verwendet MySQL ASC (aufsteigend). Die ORDER BYAnweisung funktioniertsowohl bei numerischen Werten, Datumsangaben als auch bei Zeichenketten. Es knnen auchmehrere Sortierungen in einem Statement gleichzeitig vorgenommen werden.

    Beispiel:SELECT * FROM adressenWHERE geburtsdatum > '19800101'ORDER BY geburtsdatum ASC, nachname DESC, vorname ASC

    Letzte nderung: 17. Mai 2002, 21:26 Uhr 2001, Klaus Becker, [email protected], www.beckerk.de/mysql/

  • Group By

    Bedeutung:Mit der GROUP BYAnweisung lassen sich Datenstze in der Ergebnismenge gruppieren.

    Allgemeine Form:SELECT * FROM tabelle GROUP BY feld1

    Beispiel:Aus der untenstehenden Tabelle sollen alle unterschiedlichen Straennamen selektiert werden

    anrede vorname nachname strasse plz ort

    Herr Ludwig Laberbacke Laberstrasse 11 11223 Lordhausen

    Frau Paula Tratschig Sonnenstrae 56 34567 Augustburg

    Frau Petra Timmers Sonnenstrae 56 23226 Langenort

    Das StatementSELECT strasse FROM adressen

    wrde sich nicht eignen da es alle drei Strassennamen als Ergebnis zurckliefern wrde. U.a. wrezweimal der Strassenname 'Sonnenstrae 56' im Ergebnis enthalten:

    strasse

    Laberstrasse 11

    Sonnenstrae 56

    Sonnenstrae 56

    Erst die Verwendung von 'GROUP BY' wrde hier zum gewnschten Ergebnis fhren:SELECT strasse FROM adressen GROUP BY strasse

    Das Ergebnis dieser Abfrage wrde wie folgt aussehen:

    strasse

    Laberstrasse 11

    Sonnenstrae 56

    Die Verwendung von 'GROUP BY' reduziert das Vorkommen von mehrfach vorhandenenStrassennamen auf ein einziges.

    Letzte nderung: 17. Mai 2002, 21:26 Uhr 2001, Klaus Becker, [email protected], www.beckerk.de/mysql/

  • Create Table Statement

    Eine neue Tabelle per SQLStatement erzeugen1. Eine neue Tabelle aus bereits bestehenden Tabellen erzeugen2. Beispiele zum Erstellen von Tabellen3.

    Bedeutung:Mit der CREATE TABLEAnweisung lassen sich Tabellen in einer bereits existierenden(!)Datenbank anlegen.

    Hinweis:Wegen der Flle von Optionen bei diesem Statement werde ich hier nur die grundlegensten (!)Mglichkeiten aufzeigen. Wichtig zum Verstndnis von CREATE TABLE sind vor allem dieDatentypen/Feldtypen von MySQL.

    Eine neue Tabelle per SQLStatement erzeugen

    Allgemeine Form:

    CREATE TABLE IF NOT EXISTS tabellenname( feld1 int(10) NOT NULL auto_increment, feld2 char(2) NOT NULL DEFAULT 'AB' , feld3 varchar(255) NOT NULL DEFAULT '' , feld4 text NOT NULL DEFAULT '' , PRIMARY KEY (feld1))

    Der optionale Zusatz IF NOT EXISTS verhindert die Ausgabe einer Fehlermeldung falls die Tabelletabellenname bereits besteht. Am Schlu des obigen Satements wird noch einPrimrschlssel/Index angelegt. Alle Feldnamen sowie der jeweilige Feldtyp stehen zwischen denbeiden Klammern. Hinter jedem Feldnamen steht die genauere Spezifizierung des Feldtyps.

    Hinter dem jeweiligen Feldtyp ist bei drei Feldern noch ein DEFAULTWert angegeben. Werdenspter Werte in die Tabelle eingefgt so brauchen diese Felder beim INSERTStatement nicht mitangegeben werden sofern der einzutragende Wert dem DEFAULTWert des Feldes entspricht.

    Das Feld feld1 ist als auto_increment spezifiziert. Dieses Feld wird bei spterenINSERTStatements automatisch mit einem (eindeutigen) Zahlenwert von 1 bis X gefllt. DiesesFeld braucht bei INSERTStatements deshalb nicht mit angegeben werden.

    Hinweis:Ein AUTO_INCREMENT Feld sollte in jeder Tabelle vorhanden sein. In vielen Fllen kann man beieinem spteren UPDATEStatement nur so jeden Datensatz wirklich eindeutig adressieren.

    Eine neue Tabelle aus einer bereits bestehenden Tabelle erzeugenEs ist auch mglich, aus einer bereits bestehenden Tabelle eine neue Tabelle zu erzeugen. Die

  • Daten der bereits bestehenden Tabelle knnen wahlweise mit bernommen werden.

    Allgemeine Form:Ohne DatenbernahmeCREATE TABLE IF NOT EXISTS tabelleNeuSELECT * FROM tabelleAltWHERE 0 = 1

    Da die WHEREBedingung niemals zutrifft wird auch kein Datensatz aus der bestehenden Tabelleausgewhlt. Deshalb wird nur die Struktur (alle Felder!) der alten Tabelle in die neue bernommen.

    Mit DatenbernahmeCREATE TABLE IF NOT EXISTS tabelleNeuSELECT * FROM tabelleAlt

    Hier werden sowohl die Struktur (alle Felder!) als auch die Daten der alten Tabelle bernommen.INDIZES werden nicht bernommen!

    Mchte man nur bestimmte Felder aus der bereits bestehenden Tabelle bzw. aus den bereitsbestehenden Tabellen bernehmen so mssen diese wie in einem normalen SELECTStatementmit angegeben werden.

    Beispiel:CREATE TABLE IF NOT EXISTS tabelleNeuSELECTtabelleAltEins.feld1,tabelleAltEins.feld2,tabelleAltZwei.feld1,tabelleAltZwei.feld4,tabelleAltZwei.feld5FROM tabelleAltEins, tabelleAltZweiWHERE tabelleAltZwei.feld4 = 'wert'

    Im obigen Beispiel werden nur die fnf angegebenen Felder in der neuen Tabelle angelegt. Eswerden nur die Daten aus den beiden bestehenden Tabellen bernommen, die dieWHEREBedingung erfllen.

    Beispiele zum Erstellen von TabellenUm den Einstieg in das Erstellen von Tabellen zu erleichtern sind unten beispielhaft dreiCREATEStatements wiedergegeben. Ich habe die Statements bewut nach Numerischen,String und Datumstypen getrennt. Natrlich kann man die Feldtypen auch zusammen verwenden.

    Teilweise sind optionale Angaben zu den jeweiligen Feldtypen gemacht worden. Jedes Statemententhlt einen PRIMARY KEY vom Typ tinyint(3). Dieses Feld ist jeweils zustzlich alsAUTOINCREMENT deklariert, wird also beim Fllen der Tabelle automatisch gefllt. Neben demPRIMARY KEY enthalten die beiden ersten Statements noch weitere INDIZES. Der eine INDEXdavon ist als UNIQUE deklariert.

    Hinter dem jeweiligen Feldnamen folgt der Feldtyp. Danach folgt entweder die maximale Lnge,

  • das Format oder die Liste der aufnehmbaren Werte. In vielen Fllen ist danach derDEFAULTWert angegeben. Am Schlu fast jeder FeldDefinition ist nochmal angegeben, ob dasFeld den Wert 'NULL' (nicht zu verwechseln mit mit der Zahl '0', NULL bedeutet hier soviel wie'Nichts') haben kann. Soweit mglich sollte man aus Performancegrnden alle Felder als NOTNULL deklarieren.

    a) Erstellen einer Tabelle mit numerischen Feldtypen:

    CREATE TABLE IF NOT EXISTS numerischeTabelle ( feld1 tinyint(4) NOT NULL auto_increment, feld2 mediumint(9) DEFAULT '0' NOT NULL, feld3 int(11) unsigned DEFAULT '0' NOT NULL, feld4 bigint(20) unsigned zerofill, feld5 float DEFAULT '0' NOT NULL, feld6 double(4,2) DEFAULT '0.00' NOT NULL, PRIMARY KEY (feld1), UNIQUE feld5 (feld5), KEY feld2 (feld2) )

    b) Erstellen einer Tabelle mit StringFeldtypen:

    CREATE TABLE IF NOT EXISTS stringTabelle ( feld1 tinyint(3) unsigned NOT NULL auto_increment, feld2 varchar(32) DEFAULT 'ABC', feld3 tinytext, feld4 mediumtext, feld5 text, feld6 longtext, feld7 tinyblob, feld8 mediumblob, feld9 blob, feld10 enum('A','B','C','D','E') DEFAULT 'A' NOTNULL, feld11 set('a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p'), PRIMARY KEY (feld1), KEY feld10 (feld10) )

    c) Erstellen einer Tabelle mit DatumsFeldtypen:

    CREATE TABLE IF NOT EXISTS datumTabelle ( feld1 tinyint(3) NOT NULL auto_increment, feld2 datetime DEFAULT '00000000 00:00:00' NOTNULL, feld3 timestamp(14), feld4 time DEFAULT '00:00:00' NOT NULL,

  • feld5 year(4) DEFAULT '0000' NOT NULL, PRIMARY KEY (feld1) )

    Letzte nderung: 17. Mai 2002, 21:26 Uhr 2001, Klaus Becker, [email protected], www.beckerk.de/mysql/

  • Alter Table Statement

    Tabellentyp umwandeln1. Tabelle umbenennen2. Felder in einer Tabelle umbenennen3. Feldtypen ndern4. Felder hinzufgen5. Felder lschen6. Indizes hinzufgen7. Indizes lschen8.

    Bedeutung:Mit der Anweisung ALTER TABLE lassen sich nderungen an einer Tabelle vornehmen: Tabelleumbenennen, Tabellentyp ndern, Felder umbenennen, Feldtypen ndern, Felder hinzufgen undlschen, Indizes hinzufgen und lschen sowie Primary Keys hinzufgen und lschen.

    Tabellentyp umwandelnIn MySQL gibt es verschiedene Tabellentypen. Momentan ist der Standardtyp MYISAM. FrhereMySQLVersionen verwendeten ISAM als Standard. Daneben gibt es noch die Typen'TEMPORARY' und 'HEAP' sowie einige andere. Legt man per CREATE TABLE eine neue Tabellean so ist diese sofern nichts anderes angegeben wurde vom Typ MYISAM. Um denTabellentyp in einen anderen umzuwandeln verwendet man ALTER TABLE.

    Allgemeine Form:

    ALTER TABLE tabelle TYPE = tabellentyp

    Beispiel:ALTER TABLE adressen TYPE = HEAP

    Tabelle umbenennenMit ALTER TABLE kann man wie mit der Anweisung RENAME TABLE auch Tabellenumbenennen.

    Allgemeine Form:ALTER TABLE tabelleAlt RENAME AS tabelleNeu

    Beispiel:ALTER TABLE adressen RENAME AS adressbuch

    Felder in einer Tabelle umbenennenAllgemeine Form:ALTER TABLE tabelle CHANGE feldnameAlt feldnameNeuTYPANGABE

  • Beispiel:ALTER TABLE adressen CHANGE ort stadt VARCHAR(32)DEFAULT ""

    Die Angabe des DEFAULTWertes ist optional. Die Angabe des Feldtyps dagegen nicht.

    Feldtypen ndernAllgemeine Form:ALTER TABLE tabelle MODIFY feldname TYPANGABE

    Beispiel:ALTER TABLE adressen MODIFY ort VARCHAR(64) DEFAULT"Berlin"

    Die Angabe des DEFAULTWertes ist auch hier wieder optional. Der Feldname braucht hier imGegensatz zum Umbenennen von Feldern nur einmal angegeben werden. Das SchlsselwortMODIFY weist schon darauf hin, dass nur der Typ gendert werden soll.

    Man kann auch mehrere Felder gleichzeitig ndern. Dazu listet man einfach alle zu nderndenFelder mit Komma getrennt an das Statement an:ALTER TABLE adressenMODIFY ort VARCHAR(64) DEFAULT "Berlin",strasse VARCHAR(100),plz VARCHAR(5),vorname VARCHAR(32) DEFAULT "Klaus"

    Eine nderung des Feldtyps lt sich auch mit dem folgenden Statement erreichen:ALTER TABLE adressen CHANGE ort ort VARCHAR(32)DEFAULT ""

    Angenommen der Typ des Feldes "ort" war vor der Ausfhrung des Statements VARCHAR(16) soist er nach der Ausfhrung vom Typ VARCHAR(32). Man beachte das doppelte Vorkommen desFeldnamens! (falls der nicht gendert werden soll).

    Felder hinzufgenAllgemeine Form:ALTER TABLE tabelle ADD feld4 TYPANGABE

    Beispiel:ALTER TABLE adressen ADD telefon INT(8) UNSIGNEDDEFAULT "1"

    Es knnen auch mehrere Felder gleichzeitig hinfugefgt werden. Die Felder sowie deren Typenmssen auch hier wieder durch Kommas getrennt hintereinander angegeben werden. Vor jedemFeldnamen muss das Schlsselwort ADD stehen:

  • ALTER TABLE adressenADD telefon INT(8) UNSIGNED DEFAULT "1",ADD fax INT(8) UNSIGNED DEFAULT "1"

    Felder lschenAllgemeine Form:ALTER TABLE tabelle DROP feldname

    Beispiel:ALTER TABLE adressen DROP strasse

    Will man mehrere Felder gleichzeitig lschen kommt wieder die altbekannte kommaseparierte Listezum Zuge. Diesmal mit dem Schlsselwort DROP vor jedem Feldnamen:

    ALTER TABLE lexikonklaus DROP telefon, DROP fax

    Anlegen von IndizesIn MySQL gibt es verschiedene Indizies: normaler INDEX, UNIQUE Index, PRIMARY KEY und neuerdings FULLTEXT. Alle drei Formen lassen sich mit ALTER TABLE anlegen und lschen.

    Allgemeine FormALTER TABLE tabelleADD INDEXTYP indexName (feld1, feld2, feld3)

    Hinter der Angabe des Indextyps folgt der Name des Index sowie die kommaseparierte Liste derFeldnamen, die indiziert werden sollen. Die Liste muss in Klammern gesetzt werden. Die Angabedes Namens ist optional. Wird kein Name angegeben so verwendet MySQL den ersten in der Listeangegebenen Feldnamen.

    Beispiele:ALTER TABLE adressenADD INDEX adressenindex (vorname, nachname, strasse)

    ALTER TABLE adressenADD FULLTEXT volltext (ueberschrift, abstract,textmenge)

    ALTER TABLE adressenADD UNIQUE ort (ort)

    ALTER TABLE adressenADD PRIMARY KEY primaerSchluessel (vorname, nachname)

  • Indizes lschenDas Lschen von Indizies ist noch sehr viel einfacher als das Anlegen:

    Allgemeine FormALTER TABLE tabelle DROP indexName

    Beispiel:ALTER TABLE adressen DROP adressenindex

    Man kann auch gleichzeitig einen Index lschen und wieder anlegen:

    ALTER TABLE adressenDROP adressenindex,ADD INDEX adressenindex (vorname, nachname, strasse)

    Letzte nderung: 17. Mai 2002, 21:26 Uhr 2001, Klaus Becker, [email protected], www.beckerk.de/mysql/

  • Rename Table Statement

    Bedeutung:Mit der RENAME TABLEAnweisung lassen sich Tabellen umbenennen.

    Allgemeine Form:RENAME TABLE tabellennameJetzt TO tabellennameNeu

    Das obige Statement benennt die Tabelle tabellennameJetzt in tabellennameNeu um.

    Mchte man mehrere Tabellen gleichzeitig umbenennen, so kann man die Tabellennamen mitKomma getrennt hintereinander angeben:

    RENAME TABLEtabellennameEins TO tabellennameOne,tabellennameZwei TO tabellennameTwo,tabellennameDrei TO tabellennameThree

    Hinter dem letzten angegebenen Tabellennamen steht kein Komma!

    Mit dem RENAMEStatement ist es auch mglich, eine Tabelle von einer Datenbank in eineandere zu verschieben:

    RENAME TABLEdatenbankEins.tabellennameEinsTOdatenbanknameZwei.tabellennameZwei

    Die Tabelle tabellennameEins ist nach der Ausfhrung dieses Statements in der DatenbankdatenbankEins nicht mehr vorhanden!

    Letzte nderung: 17. Mai 2002, 21:26 Uhr 2001, Klaus Becker, [email protected], www.beckerk.de/mysql/

  • Drop Table Statement

    Bedeutung:Mit der DROP TABLEAnweisung lassen sich Tabellen in einer Datenbank lschen.

    Allgemeine Form:DROP TABLE tabellenname

    Das obige Statement lscht die Tabelle tabellenname in der Datenbank, in der man sich geradebefindet. Ist die Tabelle nicht vorhanden wird eine entsprechende Fehlermeldung ausgegeben.Vermeiden kann man diese evtl. Fehlermeldung indem man das Statement ein wenig erweitert:

    DROP TABLE IF EXISTS tabellenname

    Das Statement lscht alle Dateien, die die angegebene Tabelle reprsentieren. Die Daten sinddanach weg!

    Sollen mehrere Tabellen in der Datenbank gelscht werden so kann man die Tabellennamendurch Komma getrennt angeben. So kann man sich einige Statements ersparen:DROP TABLE IF EXISTS tabelle1, tabelle1, tabelle3

    Hinter dem letzten angegebenen Tabellennamen steht kein Komma!

    Letzte nderung: 17. Mai 2002, 21:26 Uhr 2001, Klaus Becker, [email protected], www.beckerk.de/mysql/

  • Show Tables Statement

    Bedeutung:Mit der Show TablesAnweisung lassen sich alle Tabellen aus einer Datenbank anzeigen fr dieman die entsprechende Berechtigung hat. Siehe dazu auch SHOW DATABASES und DESCRIBETABLE.

    Allgemeine Form:SHOW TABLES

    Die untenstehende Tabelle zeigt eine beispielhafte Ausgabe der obigen Anweisung.

    tables_in_homepage

    bestellt

    statistik

    suche

    produkte

    warenkorb

    zugang

    Letzte nderung: 17. Mai 2002, 21:26 Uhr 2001, Klaus Becker, [email protected], www.beckerk.de/mysql/

  • Describe Table Statement

    Bedeutung:Mit der DescribeAnweisung lassen sich Informationen ber eine Tabelle anzeigen. Siehe dazuauch SHOW TABLES.

    Allgemeine Form:DESCRIBE tabellenname

    Beispiel:DESCRIBE user

    Das Beispiel zeigt die Informationen ber die Tabelle 'user' aus der Datenbank 'mysql' in deruntenstehenden Form an. Neben dem Feldnamen werden der Feldtyp, ob das Feld NULL seindarf, etwaige Schlssel inklusive Schlsseltyp, der DefaultWert sowie die Extras (z.B.'autoincrement') angezeigt.

    Field Type Null Key Default Extra

    Host char(60) binary PRIUser char(16) binary PRIPassword char(16) binary NSelect_priv enum('N','Y') NInsert_priv enum('N','Y') NUpdate_priv enum('N','Y') NDelete_priv enum('N','Y') NCreate_priv enum('N','Y') NDrop_priv enum('N','Y') NReload_priv enum('N','Y') NShutdown_priv enum('N','Y') NProcess_priv enum('N','Y') NFile_priv enum('N','Y') NGrant_priv enum('N','Y') NGrant_priv enum('N','Y') NReferences_priv enum('N','Y') NIndex_priv enum('N','Y') NAlter_priv enum('N','Y') N

    Letzte nderung: 17. Mai 2002, 21:26 Uhr

  • 2001, Klaus Becker, [email protected], www.beckerk.de/mysql/

  • Optimize Table Statement

    Bedeutung:Mit der OPTIMIZE TABLEAnweisung lassen sich Tabellen in einer Datenbank optimieren.OPTIMIZE TABLE sollte vor allem dann angewendet werden, wenn viele Datenstze aus einerTabelle gelscht oder gendert wurden und wenn die Tabelle Felder mit variabler Lnge enthlt(Varchar, Text, Blob). MySQL kann den Platz in der Datendatei dann besser nutzen.

    Allgemeine Form:OPTIMIZE TABLE tabellenname

    Man kann auch mehrere Tabellen in einem Statement angeben:OPTIMIZE TABLE tabelleEins, tabelleZwei, tabelleDrei

    Hinweis:Bei sehr groen Tabellen von mehr als einigen hundert Megabyte (vor allem wenn diese zudemnoch Indizes enthalten) kann die Ausfhrung OPTIMIZE TABLE schon mal ein paar Stundendauern.

    Letzte nderung: 17. Mai 2002, 21:26 Uhr 2001, Klaus Becker, [email protected], www.beckerk.de/mysql/

  • Repair Table Statement

    Bedeutung:Mit der REPAIR TABLEAnweisung lassen sich zerstrte Tabellen hufig wieder reparieren. Diesgilt jedoch nur fr den Tabellentyp 'MyISAM' (Standard).

    Allgemeine Form:REPAIR TABLE tabellenname

    Hinweis:MySQL gibt nach der Aufhrung eine Tabelle mit vielen Informationen ber die gefundenen Fehlerzurck. Die letzte Spalte sollte die Zeichenkette 'Msg_type status' enthalten und ein 'ok' dahinterstehen haben.

    Auch wenn die Tabelle repariert wurde heit das nicht, das noch alle Datenstze in der Tabellesind die auch vorher drin waren!

    Letzte nderung: 17. Mai 2002, 21:26 Uhr 2001, Klaus Becker, [email protected], www.beckerk.de/mysql/

  • Backup Table Statement

    Bedeutung:Mit der Backup TableAnweisung lassen sich Kopien von TabellenDateien anlegen. Sie auchRESTORE TABLE.

    Allgemeine Form:BACKUP TABLE tabellennameTO 'c:/pfad/zum/backup/verzeichnis'

    Der Befehl BACKUP TABLE legt eine Kopie von zwei Dateien pro Tabelle im angegebenVerzeichnis an. Existieren die Dateien bereits gibt MySQL eine Fehlermeldung aus. Die Dateienwerden nicht berschrieben. Man kann auch mehrere Tabellen in einem Statement angeben.Diese werden jeweils durch Komma getrennt nacheinander angegeben:

    BACKUP TABLE tabelleEins, tabelleZwei, tabelleDreiTO 'c:/pfad/zum/backup/verzeichnis'

    Hinweis:Der Befehl funktioniert nur mit Tabellen vom Typ MyISAM.

    MySQL kopiert beim Ausfhren von BACKUP TABLE nur die Tabellendefinition (DateiEndung:.frm) und die Datendatei (DateiEndung: .MYD). Evtl. bestehende INDIZES kann es aus denbeiden Dateien wieder erzeugen.

    Letzte nderung: 17. Mai 2002, 21:26 Uhr 2001, Klaus Becker, [email protected], www.beckerk.de/mysql/

  • Restore Table Statement

    Bedeutung:Mit der Restore TableAnweisung lassen sich Tabellen aus zuvor gemachten Kopien wiederanlegen. Sie dazu auch BACKUP TABLE.

    Allgemeine Form:RESTORE TABLE tabellennameFROM 'c:/pfad/zum/backup/verzeichnis'

    Der Befehl RESTORE TABLE legt die im Statement angegebene(n) Tabelle(n), die in den Dateienim angegebenen BackupVerzeichnis liegen in der jeweils aktuellen Datenbank an sofern dieseTabellen noch nicht bestehen. Falls die Tabellen bereits bestehen wird eine Fehlermeldungausgegeben.

    Man kann auch mehrere Tabellen in einem Statement angeben. Diese werden jeweils durchKomma getrennt nacheinander angegeben:

    RESTORE TABLE tabelleEins, tabelleZweiFROM 'c:/pfad/zum/backup/verzeichnis'

    Hinweis:Der Befehl funktioniert nur mit Tabellen vom Typ MyISAM.

    Letzte nderung: 17. Mai 2002, 21:26 Uhr 2001, Klaus Becker, [email protected], www.beckerk.de/mysql/

  • Use Statement

    Bedeutung:Mit der USEAnweisung kann man die fr die nchsten Statements von MySQL zu verwendeneDatenbank auf dem MySQLServer wechseln.

    Allgemeine Form:USE datenbankname

    Das Statement USE sollte man immer dann verwenden, wenn man eine ganze Reihe vonAbfragen an die jeweilige Datenbank stellen mchte. Bei einem oder wenigen Queries kann mansich auch behelfen in dem man den Namen der zur verwendenen Datenbank im Statement mitangibt:

    SELECT feld1, feld2 FROM datenbankname.tabellename

    Letzte nderung: 17. Mai 2002, 21:26 Uhr 2001, Klaus Becker, [email protected], www.beckerk.de/mysql/

  • Create Database Statement

    Bedeutung:Mit der CREATE DATABASEAnweisung lassen sich neue Datenbanken auf dem MySQLServeranlegen.

    Allgemeine Form:CREATE DATABASE datenbankname

    Das obige Statement legt die Datenbank datenbankname an. Ist diese Datenbank auf demMySQLServer bereits vorhanden wird eine entsprechende Fehlermeldung ausgegeben.Vermeiden kann man diese evtl. Fehlermeldung indem man das Statement ein wenig erweitert:

    CREATE DATABASE IF NOT EXISTS datenbankname

    Der Zusatz IF NOT EXISTS kann vor allem fr dynamisch generierte Datenbanken interessantsein.

    Hinweis zum Namen der anzulegenden Datenbank:Der Slash (/) und der Punkt (.) sind im Datenbanknamen nicht erlaubt. Desweiteren sollte man alleSonderzeichen und Umlaute ebenfalls vermeiden.

    Letzte nderung: 17. Mai 2002, 21:26 Uhr 2001, Klaus Becker, [email protected], www.beckerk.de/mysql/

  • Drop Database Statement

    Bedeutung:Mit der DROP DATABASEAnweisung lassen sich Datenbanken auf dem MySQLServer lschen.

    Allgemeine Form:DROP DATABASE datenbankname

    Das obige Statement entfernt die Datenbank datenbankname auf dem MySQLServer. Ist dieseDatenbank auf dem MySQLServer nicht vorhanden wird eine entsprechende Fehlermeldungausgegeben. Vermeiden kann man diese evtl. Fehlermeldung indem man das Statement ein wenigerweitert:

    DROP DATABASE IF NOT EXISTS datenbankname

    Das Statement lscht alle Dateien im entsprechenden DatenVerzeichnis des MySQLServers mitden folgenden Endungen:

    .BAK

    .DAT

    .HSH

    .ISD

    .ISM

    .MRG

    .MYD

    .MYI

    .db

    .frm

    Letzte nderung: 17. Mai 2002, 21:26 Uhr 2001, Klaus Becker, [email protected], www.beckerk.de/mysql/

  • Show Databases Statement

    Bedeutung:Mit der SHOW DATABASESAnweisung lassen sich die vorhandenen Datenbanken auf demMySQLServer anzeigen. Siehe dazu auch SHOW TABLES und DESCRIBE TABLE.

    Allgemeine Form:SHOW DATABASES

    Das obige Statement zeigt die vorhandenen Datenbanken fr die man die entsprechendeBerechtigung hat in der untenstehenden Form. Damit man dieses Statement absetzen kann istkeine Auswahl einer Datenbank notwendig.

    Database

    homepage

    statistik

    xml

    mysql

    Letzte nderung: 17. Mai 2002, 21:26 Uhr 2001, Klaus Becker, [email protected], www.beckerk.de/mysql/

  • Funktionen in MySQL

    In MySQL gibt es sehr viele ntzliche Funktionen. Diese alle hier zu Listen wrde die Seitesprengen. Deshalb habe ich hier zunchst die aus meiner Sicht wichtigsten. Nach und nachwerde ich immer welche hinzufgen.

    Hinweis zur Syntax:Beim Benutzen von Funktionen ist es wichtig, da zwischen dem Funktionsnamen und derffnenden Klammer mit den Parametern kein Leerzeichen steht. Also nicht 'LOCATE ()' sondern'LOCATE()' !!!

    LOCATE()Mit der Funktion LOCATE() lt sich das die Position des ersten Auftretens eines Strings in einemanderen String (oder Feld) bestimmen.

    SELECT LOCATE(nachname, 'Becker') AS position FROMadressenoder:SELECT LOCATE('au', 'Klaus')

    Im letzten Beispiel wrde '3' als Position zurckgegeben.

    Man kann LOCATE() auch mit drei Parametern aufrufen. Der letzte Parameter wird dann vonMySQL als Offset angesehen.

    SELECT LOCATE('au', 'Klaus ist zu Hause', 7)

    Hier wrde nicht '3' sondern '15' als Position zurckgegeben da erst ab dem 7ten Zeichen mit derSuche begonnen wurde.

    REPLACE()Mit der Funktion REPLACE() lassen sich Zeichen bzw. Zeichenketten in einer anderenZeichenkette ersetzen. (oder Feld) bestimmen.

    SELECT REPLACE('Becker', 'e', 'ae')Hier wrde 'Baecker' zurckgegeben.

    UCASE()Mit der Funktion UCASE() lassen sich Zeichen bzw. Zeichenketten in Grobuchstabenumwandeln. Siehe auch LCASE().

    SELECT UCASE('Becker')Hier wrde 'BECKER' zurckgegeben.

    SELECT UCASE(nachname) AS grossernachname FROM

  • adressen

    LCASE()Mit der Funktion LCASE() lassen sich Zeichen bzw. Zeichenketten in Kleinbuchstaben umwandeln.Siehe auch UCASE().

    SELECT LCASE('Becker')Hier wrde 'becker' zurckgegeben.

    FLOOR()Die Funktion FLOOR() gibt den IntegerWert fr den angegebenen Parameter zurck, der nichtkleiner als der parameter selbst ist. Siehe dazu auch ROUND().

    SELECT FLOOR(23.1734)Hier wrde '23' zurckgegeben.

    SELECT FLOOR(23.1734)Hier wrde '24' zurckgegeben.

    ROUND()Die Funktion ROUND() rundet den angegebenen Parameter. Siehe dazu auch FLOOR().

    SELECT ROUND(23.1734)Hier wrde '23' zurckgegeben.

    SELECT ROUND(23.1734)Hier wrde '23' zurckgegeben.

    SELECT ROUND(23.6734)Hier wrde '24' zurckgegeben.

    SELECT ROUND(betrag) AS gerundeterbetrag FROM preise

    CEILING()Die Funktion CEILING() gibt den kleinsten IntegerWert fr den angegebenen Parameter zurckder nicht kleiner als der Parameter selbst ist. Siehe dazu auch FLOOR().

    SELECT CEILING(23.1734)Hier wrde '24' zurckgegeben.

    SELECT CEILING(23.1734)Hier wrde '23' zurckgegeben.

    SELECT CEILING(betrag) AS neuerbetrag FROM preise

  • ABS()Die Funktion ABS() gibt den absoluten Wert fr den angegebenen Parameter zurck ("entfernt dieVorzeichen").

    SELECT ABS(23)Hier wrde '23' zurckgegeben.

    SELECT ABS(23)Hier wrde auch '23' zurckgegeben.

    SUM()Mit der Funktion SUM() lassen sich Werte in einer Spalte aufsummieren.

    SELECT SUM(alter) AS gesamtalter FROM adressen

    AVG()Mit der Funktion AVG() lt sich der Durchschnittswert einer Spalte ermitteln.

    SELECT AVG(alter) AS durchschnittsalter FROM adressen

    MAX()MAX() ermittelt den hchsten Wert in einer Spalte. MAX() ist ein Synonym fr GREATEST().

    SELECT MAX(alter), vorname, nachname FROM adressen

    MIN()MIN() ermittelt den niedrigsten Wert in einer Spalte.

    SELECT nachname, MIN(alter) FROM adressen

    VERSION()VERSION() gibt die Version des MySQLDatenbankServers zurck

    SELECT VERSION()Hier knnte z.B. '3.23.43nt' zurckgegeben werden.

    MATCH()Die Funktion MATCH() kann zur Abfrage von VolltextIndizes verwendet werden.

    SELECT feld1,MATCH(feld6) AGAINST ('suchbegriff') AS relevanzFROM tabelle

  • Gibt man in der WHEREBedingung einer SQLAnweisung dieselbe MATCHFunktion erneut an,so werden die Ergebniszeilen nach Relevanz sortiert. Die Abfrage wird durch die doppelteAusfhrung aber nicht langsamer. Nheres siehe unter ALTER TABLE und FULLTEXT.

    SELECT feld1,feld2,MATCH(feld4, feld6) AGAINST ('suchbegriff1,suchbegriff2') AS relevanzFROM tabelleMATCH(feld4, feld6) AGAINST ('suchbegriff1,suchbegriff2')

    SUBSTRING()Mit der Funktion lassen sich Teile eines Feldes ermitteln. Die Funktion kann ebenso wie alleanderen auch in einer WHEREBedingung verwendet werden.

    Allgemeine Form:SELECT SUBSTRING(Feldname, Startposition, Lnge) FROMtabelle

    Ist der optionale Parameter 'Lnge' nicht angegeben, so wird die gesamte Zeichenkette ab derPosition 'Startposition' zurckgegeben.

    Beispiele:SELECT SUBSTRING(vorname,1,1) as ersterBuchstabe FROMadressen

    Die obige Abfrage wrde jeweils den ersten Zeichen des Vornamens zurckgeben.

    SELECT SUBSTRING(vorname,1,3) as beginn FROM adressen

    Die obige Abfrage wrde jeweils die ersten drei Zeichen des Vornamens zurckgeben.

    SELECT SUBSTRING(vorname,3,1) FROM adressen

    Die obige Abfrage wrde jeweils das dritte Zeichen des Vornamens zurckgeben.

    SELECT SUBSTRING(vorname,4) FROM adressen

    Die obige Abfrage wrde jeweils alles ab dem vierten Zeichen des Vornamens zurckgeben.

    CONCAT()Mit CONCAT() lassen sich Inhalte von Feldern zusammenfassen.

    SELECT CONCAT(vorname, " ", nachname) AS ganzerNameFROM adressen

    Das obige Beispiel knnte beispielsweise "Paula Tratschig" zurckgeben. Durch die

  • Anfhrungszeichen lassen sich auch zutzliche, nicht in der Tabelle vorhandene Zeichen mitausgeben.

    TRIM()Mit TRIM() lassen sich Leerzeichen innerhalb von Feldern beseitigen.

    SELECT TRIM(vorname) FROM adressen

    Das obige Beispiel wrde beispielsweise "Paula" zurckgeben wenn in der Tabelle der Wert 'Paula' steht. Die Leerzeichen werden links und rechts entfernt. Nicht aber innerhalb des Wertes. Sowrde ' Anne Christin ' zu 'Anne Christin' werden.

    RTRIM()Wie TRIM(), nur werden dabei lediglich die Leerzeichen auf der rechten Seite des Parametersentfernt. Siehe auch LTRIM().

    SELECT RTRIM(vorname) FROM adressen

    LTRIM()Wie TRIM(), nur werden dabei lediglich die Leerzeichen auf der linken Seite des Parametersentfernt. Siehe auch RTRIM().

    SELECT LTRIM(vorname) FROM adressen

    COUNT()COUNT() ermittelt die Anzahl der Datenstze in der Tabelle

    SELECT COUNT(*) AS gesamt FROM adressen

    LENGTH()LENGTH() ermittelt die Lnge des Wertes in einem Feld.

    SELECT nachname, LENGTH(nachname) AS laenge FROMadressen

    Das obige Beispiel liefert die Werte fr 'nachname' und fr die Lnge des jeweiligen Namenszurck.

    NOW()Die Funktion NOW() gibt das aktuelle Datum und/oder die aktuelle Zeit zurck. Mgliche Formatesind 'YYYYMMTT HH:MM:SS' oder 'YYYYMMTTHHMMSS'. Ist ein Feld krzer als der Wert denNOW() zurckgibt so wird der Teil beim INSERT eingefgt, den das Feld auch aufnehmen kann.

    INSERT INTO statistiktabelle (ipadresse, hostname, datumzeit)

  • VALUES (now(), '221.118.112.22', 'www.hostname.de')

    Die Funktion wird nicht in einfache Anfhrungszeichen gesetzt. Auch wenn es eine Zeichenkettezurckgibt.

    PASSWORD()Mittels PASSWORD() lassen sich Zeichenketten irreversibel verschlsseln.

    INSERT INTO benutzer (id, benutzername, passwort)VALUES (3, 'tollerbenutzername',PASSWORD('geheimesPasswort'))

    PASSWORD() wird auch von MySQL selbst fr die Speicherung von Passwrtern in derBenutzerdatenbank benutzt.

    Letzte nderung: 17. Mai 2002, 21:26 Uhr 2001, Klaus Becker, [email protected], www.beckerk.de/mysql/

  • INDEX / INDIZIES in MySQL

    Bedeutung:Indizes legt man an um schneller auf die Daten in einer Tabelle zugreifen zu knnen. Dies giltallerdings nicht fr Abfragen, die den kompletten Inhalt einer Tabelle abfragen. Mit Indizes lassensich Abfragen an die Datenbank erheblich beschleunigen.Faktor 1000 bis 1000000 (!) sind keine Seltenheit.

    Anlegen eines INDEX:Wie man einen INDEX bzw. mehrere INDIZIES anlegt und lscht ist unter ALTER TABLEbeschrieben. Hier nochmal die allgemeine Form um einen INDEX anzulegen:

    ALTER TABLE tabelleADD INDEXTYP indexName (feld1, feld2, feld3)

    Typen von INDIZES:MySQL unterscheidet vier Typen von INDIZES:

    INDEX:Ein 'normaler' INDEX

    UNIQUE:wie INDEX, mit der Bedingung, dass jeder Wert in dem indexierten Feld nur einmalvorkommt, also einzigartig (unique) ist

    PRIMARY KEY:wie UNIQUE, einziger Unterschied ist der, dass pro Tabelle nur ein einziger PRIMARY KEYzugelassen ist. Typischerweise verwendet man hierfr AUTOINCREMENTFelder.

    FULLTEXT:Eine noch relativ neue IndexVariante von MySQL. Mit ihr lassen sich sehr groeTextmengen indizieren und spter wieder sehr schnell abfragen. Nheres dazu unter unteranderem unter FUNKTIONEN, ALTER TABLE und FULLTEXT.

    Der Typ FULLTEXT soll in der Version 4.01 und folgende noch weiter ausgebaut werden.U.a. werden dann auch Suchen mit boolschen Operatoren untersttzt(>FULLTEXT).

    Welche Felder sollen indexiert werden?Bei der Auswahl der Felder fr das Anlegen eines Indizes sind als erstes die Felder zubercksichtigen, die hufig innerhalb einer WHEREBedingung abgefragt werden. Als weitereKandidaten fr die Indexierung kommen die Felder in Frage, auf die per ORDER BY oder GROUPBY zugegriffen wird.

    Ganz besonders wichtig ist es, die Felder mit einem INDEX zu belegen, die in einer Kreuzabfrage

  • (Abfragen mehrerer Tabellen in einem Statement) auf ihren Wert abgeprft werden. Hier sind diegrten Geschwindigkeitsverbesserungen zu erwarten.

    Beispiel:

    SELECT eins.feld1, eins.feld2, zwei.feld1FROM tabelle1 eins, tabelle2 zweiWHERE eins.feld2 = zwei.feld1

    Hier wrde es Sinn machen, das Feld feld2 aus Tabelle tabelle1 und das Feld feld1 aus Tabelletabelle2 jeweils mit einem INDEX zu belegen.

    Bei der Indexierung von Text oder BlobFeldern sollte man vorsichtig sein. Selbst wenn man dasTextfeld indexiert ist der Geschwindigkeitsvorteil unter Umstnden nur gering. Hufig ist es besser,nur einen Teil des Feldes zu indexieren (z.B. nur die ersten 100 Zeichen).

    Ist man sich sicher, das jeder Wert in einem Feld nur einmal vorkommt so sollte man als IndextypUNIQUE whlen. MySQL kann so schneller auf die Werte in dem INDEX / Feld zugreifen.

    Grundstzlich gilt:

    Je weniger gleiche Werte es in einem Feld einer Tabelle gibt desto mehr eignet sich dasFeld fr einen INDEX.

    Bei Kreuzabfragen werden die Abfragen am schnellesten abgearbeitet, bei denen die zuvergleichenden Felder vom selben Feldtyp sind. Im letzten Beispiel wre es zum Beispieloptimal, wenn feld2 und feld1 beide vom Typ INTEGER(8) oder vom Typ CHAR(4) wrenund jeweils mit einem INDEX belegt wren.

    Bei Feldern mit sehr groem Inhalt kann es sinnvoller sein, nur einen Teil des Feldes miteinem Index zu belegen (z.B. nur die ersten 100 Zeichen). Der von MySQL angelegteINDEX wird dann nicht so gro und kann daher schneller durchsucht werden.

    Sollen sehr groe Textmengen (bis zu mehreren hundert MB) indiziert werden so empfiehltsich die Indizierung als FULLTEXT. Bei relativ kleinen Textmengen sollte man hiervonjedoch keinen Gebrauch machen da die Abfragen an diesen Indextyp dann zu sehreigenartigen Ergebnissen fhren kann.

    Letzte nderung: 17. Mai 2002, 21:26 Uhr 2001, Klaus Becker, [email protected], www.beckerk.de/mysql/

  • FULLTEXT Index

    Bedeutung:Mit einem FULLTEXT Index lassen sich in MySQL sehr groe Textmengen sehr effizientindizieren und mit einigen netten Features wieder abfragen. Den FULLTEXT Index sollte manallerdings nicht fr kleinere Textmengen verwenden.

    Allgemeine Form zum Anlegen eines FULLTEXT Index:ALTER TABLE tabelleADD FULLTEXT KEY indexName (feld1, feld2, etc.)

    Allgemeine Form zum Abfragen eines FULLTEXT Index (mit Sortierung nach Relevanz):SELECTfeld1,feld2,MATCH(feld3, feld4, feld6, feld8) AGAINST('suchbegriff1 suchbegriff2') AS relevanzFROM tabellenNameMATCH(feld3, feld4, feld6, feld8) AGAINST('suchbegriff1 suchbegriff2')

    Allgemeine Form zum Abfragen eines FULLTEXT Index (ohne Sortierung nach Relevanz):SELECTfeld1,feld2,MATCH(feld3, feld4, feld6, feld8) AGAINST('suchbegriff1 suchbegriff2') AS relevanzFROM tabellenName

    Bemerkungen zum Anlegens eines FULLTEXT IndexBeim Anlegen eines FULLTEXT Index nimmt MySQL eine Gewichtung der in den Feldernenthaltenen Wrter vor. Diese Gewichtung spielt u.a. bei einer spteren Abfrage eine groe Rolle:Man kann sich da Suchergebnis nach Relevanz absteigend sortieren lassen (siehe 'AllgemeineForm zum Abfragen eines FULLTEXT Index'). Gibt man in der WHEREBedingung dieMATCHFunktion nicht erneut an, so werden die Ergebniszeilen unsortiert zurckgegeben.

    Bei der Indizierung fallen standardmig alle Begriffe unter den Tisch, die krzer als vier Zeichensind (dies kann allerdings durch das Setzen der entsprechenden Variablen gendert werden).Wenn ein Begriff sehr hufig vorkommt bedeutet dies nicht unbedingt, da er eine hohe Relevanzzugewiesen bekommt. Er kann unter Umstnden sogar eine sehr niedrige Relevanz zugewiesenbekommen.

    Die Begriffe werden entsprechend der Hufigkeit des Vorkommens in dem jeweiligen Datensatzund entsprechend der Hufigkeit des Vorkommens in der gesamten Tabelle gewichtet. EinVolltextIndex ist somit immer in Beziehung zur jeweiligen Tabelle zu sehen. In einer anderenTabelle mit anderen Inhalten kann ein Begriff eine ganz andere Relevanz zugewiesen bekommen.

  • Ein FULLTEXT Index kann auch innerhalb sehr groer Tabellen angelegt werden. Das kann u.U.nur sehr lange dauern. Bei einer 500 Megabyte groen Tabelle kann das durchaus zwischen einerund zwanzig Stunden dauern. Die Sache ist natrlich auch abhngig von der Hardware desverwendeten Rechners (v.a. viel RAM und eine schnelle Festplatte sind hier wichtig).

    Bemerkungen zum Abfragen eines FULLTEXT IndexWie oben schon angedeutet kann man sich die Relevanz der zurckgegebenen Datenstze beieiner Abfrage mit ausgeben lassen. Man mu es aber nicht.

    In der Ergebnismenge werden die Datenstze am hchsten gewichtet, bei denen die meistenbereinstimmungen gefunden wurden. Wurde z.B. nach 'Teller' und 'Haustr' gesucht, so werdensowohl Datenstze gelistet in denen nur der Begriff 'Teller' gefunden wurde als auch Datenstze indenen nur der Begriff 'Haustr' gefunden wurde. Am hchsten gewichtet werden die Datenstze, inden beide Begriffe gefunden wurden. Ausnahme: Die Datenstze in denen z.B. die Begriffe 'Teller'und 'Haustr' zu hufig vorkommen (siehe dazu auch weiter oben).

    Der FULLTEXT Index eignet sich nur zur Indizierung von (wirklich) groen Textmengen. Bei sehrkleinen Mengen an Text kann eine Abfrage auf den INDEX zu sehr verwunderlichen Ergebnissenfhren.

    Die Abfrage selbst von sehr groen Tabellen ist spter auch auf normaler PCHardware sehrschnell. Die Zeiten bei einer 500 Megabyte groen Tabelle liegen zum Teil unter 0,1 Sekunden(AMD Athlon 1000, 256 MB SDRAM, HD mit 5400 U). Fast immer aber unter einer Sekunde.Allerdings hngt die Geschwindigkeit scheinbar sehr stark von der Menge der Ergebniszeilen ab:Die Angabe eines LIMIT kann die Abfrage ungemein beschleunigen. Die verwendete Hardwarespielt natrlich ebenfalls eine groe Rolle.

    Die zweifache Angabe der MATCHFunktion (in der Feldliste und in der WHEREBedingung)bedeutet nicht, da die Abfrage doppelt so lange dauert als wenn die Funktion nur einmal imStatement enthalten wre. MySQL merkt sich das Ergebnis der zuerst ausgefhrten. EinenGeschwindigkeitsverlust soll es laut Manual nicht geben.

    Zukftige FeaturesIn den Versionen nach 4.0 soll neben einer hheren Geschwindigkeit ein zustzliches Featureimplementiert werden: Die Mglichkeit der Verwendung von boolschen Operatoren undKlammerungen innerhalb der Suchanfrage wie man es von vielen Suchmaschinen her kennt.

    Beispiel:SELECTfeld1,feld2,MATCH(feld3, feld4, feld6, feld8)AGAINST ('+suchbegriff1 suchbegriff2 suchbegriff3'IN BOOLEAN MODE) AS relevanzFROM tabellenNameMATCH(feld3, feld4, feld6, feld8)AGAINST ('+suchbegriff1 suchbegriff2 suchbegriff3'IN BOOLEAN MODE)

  • Bei solchen Abfragen ist dann der Zusatz 'IN BOOLEAN MODE' innerhalb der Klammer ntig.Daran erkennt MySQL, wie es die Suchanfrage zu interpretieren hat.

    Begriffe denen ein PlusZeichen vorangestellt ist mssen im Ergebnis enthalten sein. Begriffe miteinem vorangestellten Minus drfen nicht im Ergebnis enthalten sein. Wenn ein Begriff ohneVorzeichen wie im Beispiel der Suchbegriff 'suchbegriff2' im Ergebnis enthalten ist, so wird dementsprechenden Datensatz eine hhere Relevanz zugewiesen als einem in dem er nicht vorkommt.

    Letzte nderung: 17. Mai 2002, 21:26 Uhr 2001, Klaus Becker, [email protected], www.beckerk.de/mysql/

  • Feldtypen in MySQL

    In MySQL kann man zwischen drei Kategorien von Feldtypen unterscheiden:

    Numerische Typen StringTypen Datum und ZeitTypen

    NumerischeTypenBei den numerischen Typen in MySQL kann man zwischen Typen fr Ganzzahlen und Typen frFliekommazahlen unterscheiden. Ganzzahlige Typen knnen mit negativem Vorzeichen und mitpositiven Vorzeichen versehen sein (z.B. 1244, 3, 9808080). Die Typen fr Fliekommazahlenknnen auch Bruchteile von Zahlen darstellen (z.B. 1.46, 0.3125, 2132327878.132387).

    Wenn beim Anlegen von Feldern vom Typ 'Ganzzahl' (z.B. 'BIGINT') die Option 'UNSIGNED' mitangegeben wurde so erweitert sich der Bereich der mglichen positiven Zahlen fr das Feld umfast 100%. Der Bereich fr negative Zahlen dagegen entfllt. Die Option 'UNSIGNED' kann beimAnlegen von Fliekommatypen nicht verwendet werden

    Der verwendete Typ hat auch Einflu auf den bentigten Speicherplatz (wie bei den meistenanderen Feldtypen auch). Der Typ 'BIGINT' belegt zum Beispiel mehr Speicherplatz als der Typ'INT'. Genaueres dazu und zum Wertebereich steht in der Tabelle unter diesem Text.

    Hinweis: Kommas werden in MySQL als Punkt dargestellt!

    bersicht ber die Wertebereiche der numerischen Datentypen in MySQL:

    Datentyp Speicherplatz Wertebereich Wertebereich (unsigned)TINYINT 1 Byte 128 127 0 255.SMALLINT 2 Bytes 32768 32767 0 65535MEDIUMINT 3 Bytes 8388608 8388607 0 16777215INT 4 Bytes 2147483648 2147483647 0 4294967295BIGINT 8 Bytes 9223372036854775808

    92233720368547758070 18446744073709551615

    FLOAT 4 Bytes 3.402823466E+38bis1.175494351E38,0, und1.175494351E38bis3.402823466E+38

    Deklarierung nichtmglich

    DOUBLE(Syn. f.REAL)

    8 Bytes 1.7976931348623157E+308bis2.2250738585072014E308,0, und2.2250738585072014E308bis

    Deklarierung nichtmglich

  • 1.7976931348623157E+308

    StringTypenBei den StringTypen in MySQL kann man zwischen fnf verschiedenen Untertypenunterscheiden. Wenn man will auch mehr oder weniger ;).

    CHAR, VARCHARDieser Typ eignet sich fr kleinere Texte, die nicht mehr als 255 beinhalten. In einer Tabellekann man immer nur 'VARCHAR' oder nur 'CHAR' verwenden. Eine Verwendung vonbeiden Typen innerhalb einer Tabelle ist nicht mglich. Nach Mglichkeit sollte man CHARverwenden. Dieses aber nur dann, wenn die gespeicherten Werte in dem Feld immerungefhr dieselbe Lnge haben. Der Speicherbedarf fr 'CHAR' ist etwas geringer da dieLnge des enthaltenden Strings nicht mitgespeichert werden mu.

    TINYTEXT, MEDIUMTEXT, TEXT, LONGTEXTDer Typ TEXT in seinen vier Ausprgungen eignet sich zur Aufnahme von kleineren bis hinzu riesigen Textmengen (4294967296 Zeichen). Bei einer Abfrage eines Feldes mit demTyp TEXT (oder TINYTEXT, etc. ;) ) wird zwischen Gro und Kleinschreibung nichtunterschieden. Die Gro und Kleinschreibung bleibt gleichwohl beim Speichern vonWerten in dem Feld erhalten.

    TINYBLOB, MEDIUMBLOB, BLOB, LONGBLOBDie vier BLOBTypen unterscheiden sich insofern vom Typ Text als dass sie Daten inbinrer Form speichern. Man kann z.B. auer normalem Text auch Bilder in einemBLOBFeld speichern. Bei der Abfrage von BLOBFeldern wird im Gegensatz zuTEXTFeldern zwischen Gro und Kleinschreibung unterschieden!

    ENUMDer Typ 'ENUM' kann wie der Typ 'SET' auch nur bestimmte Werte aufnehmen. Diesemssen beim CREATE TABLE Statement bereits als kommaseparierte Liste in Klammernmit angegeben werden. Es sind maximal 65535 Werte in der Liste mglich. EinENUMFeld kann im Gegensatz zum SETFeld immer nur einen einzigen Wertaufnehmen.

    SETDer Typ 'SET' kann ebenfalls nur bestimmte Werte aufnehmen. Diese Werteliste mu beimAnlegen mit angegeben werden. Nachtrglich kann man diese Liste wie beim ENUMTypauch per ALTER TABLE noch verndern.

    bersicht ber den bentigten Speicherplatz der StringDatentypen in MySQL:

    Datentyp SpeicherplatzCHAR(M) M Bytes, 1

  • ENUM('wert1','wert2',...) 1 or 2 Bytes, abhngig von der Anzahl der Eintrge(max. 65535)

    SET('wert1','wert2',...) 1, 2, 3, 4 oder 8 Bytes, abhngig von der Anzahl der Eintrge (max. 64)

    Datum und ZeitTypenMySQL kennt fnf verschiedene Datum und Zeittypen. Mit diesen Typen sind auch Vergleichemglich. Dies ist auch u.a. der Grund dafr, warum man immer ein Datumsfeld einem StringFeldvorziehen sollte wenn man es mit Datum oder Zeitangaben zu tun hat.

    Beispiel:SELECT FROM tabelle WHERE datumsfeld < now()

    Die Typen im einzelnen:

    DATEDer Typ 'DATE' nimmt Werte im Format JJJJMMTT auf. Das Jahr kann auch zweistelligangegeben werden. Die Bindestriche knnen weggelassen werden. Kleinster Wert ist'10000101'.

    TIMEEin Feld vom Typ 'TIME' kann Werte im Format hh:mm:ss aufnehmen. Die Doppelpunkteknnen entfallen. 'TIME' kann auch negative Werte aufnehmen. Der Wert in einemTIMEFeld stellt im Ggs. zu 'DATETIME' immer einen Zeitraum dar!

    DATETIMEDer Typ 'DATETIME' ist eine Kombination aus 'DATE' und 'TIME'. Das Standardformat ist'JJJJMMTT hh:mm:ss. Bindestriche und Punkte knnen weggelassen werden.

    TIMESTAMP'TIMESTAMP' nimmt wie der Name schon sagt einen Zeitstempel auf. Der Typ hneltdem typ 'DATETIME'. Die mglichen Formate sind mit denen von 'DATETIME' identisch.Nur das Standardformat kommt ohne Leerzeichen, Bindestriche und Doppelpunkte aus.Der kleinste Wert ist 19700101000000 (Beginn der UNIXEpoche im Jahr 1970). Das letzteJahr der UNIXEpoche ist momentan das Jahr 2037...

    YEAR'YEAR' nimmt Jahreszahlen auf. Dies tut es sowohl zwei als auch vierstellig.

    bersicht ber den bentigten Speicherplatz der numerischen Typen fr Datum und Zeit:

    Datentyp SpeicherplatzDATE 3 BytesTIME 3 BytesDATETIME 8 BytesTIMESTAMP 4 BytesYEAR 1 Byte

    Letzte nderung: 17. Mai 2002, 21:26 Uhr 2001, Klaus Becker, [email protected], www.beckerk.de/mysql/

  • KontaktKlaus BeckerDorfbauerschaft 548485 Neuenkirchen

    eMail: [email protected]

    Letzte nderung: 17. Mai 2002, 21:26 Uhr 2001, Klaus Becker, [email protected], www.beckerk.de/mysql/

    SelfSQL: Table of ContentSQL ?Datenbanken?Select - StatementInsert - StatementUpdate - StatementDelete - StatementWhere-KlauselOrder ByGroup ByCreate Table - StatementAlter Table - StatementRename Table - StatementDrop Table - StatementShow Tables - StatementDescribe Table - StatementOptimize Table - StatementRepair Table - StatementBackup Table - StatementRestore Table - StatementUse - StatementCreate Database - StatementDrop Database - StatementShow Databases - StatementFunktionen in MySQLINDEX / INDIZIES in MySQLFULLTEXT - IndexFeldtypen in MySQLKontakt