MysqlRef hier beschreiben...
http://www.faqts.com/knowledge_base/search/index.phtml?fid=199&selected_old_search=My+Recent+Searches&search=mysql&fid=1 http://geo4.uibk.ac.at/users/jurgeit/tutorien/gisdb/mysqlref.html
http://geo4.uibk.ac.at/users/jurgeit/tutorien/gisdb/mysqlref.html
Kleine MySQL-Sprachreferenz DCL:
- GRANT: Zugriffrechte festlegen REVOKE: Zugriffsrechte aufheben CREATE DATABASE: Datenbank anlegen DROP DATABASE: Datenbank löschen USE: Datenbank auswählen CONNECT: Verbindung zu Datenbank herstellen
DDL:
- CREATE TABLE: Tabelle anlegen. Details dazu... DROP TABLE: Tabelle löschen ALTER TABLE: Tabellenstruktur ändern (zB Felder hinzufügen, löschen, ...). Details dazu... EXPLAIN, DESCRIBE: Anzeige der Tabellenstruktur SHOW: Anzeige von Infos über Datenbanken, Tabellen, Zugriffsrechten, ...
DML:
- SELECT: Datenbankabfragen. Details dazu... INSERT: Datensätze in Tabellen einfügen. Details dazu... DELETE: Datensätze in Tabelle löschen UPDATE: Einträge in bestehenden Datensätzen ändern. Details dazu... LOAD DATA: Datensätze aus einer Datei in eine Tabelle laden
© Florian Jurgeit, 2001 ('Details' aus "MySQL Datenbankhandbuch")
Hier sind einige Beispiele die zeigen, wie man mit CREATE und ALTER TABLE umgeht:
mysql> CREATE TABLE test (a int not null auto_increment, primary key (a),
- key(b))
- TYPE=HEAP SELECT b,c from test2;
Dieses Beispiel legt eine temporäre HEAP Tabelle mit 3 Spalten an. Diese HEAP Tabelle wird vollständig im RAM abgelegt. Eventuell werden Teile auch im SWAP - File ausgelagert (erst ab Version 3.23). Die Tabelle kann nachher wieder gelöscht werden. Falls ein Fehler auftritt, dann wird diese Tabelle automatisch gelöscht.
mysql> CREATE TABLE t1 (a INTEGER,b CHAR(10));
Um Tabelle von t1 nach t2 umzubenennen:
mysql> ALTER TABLE t1 RENAME t2;
Um eine Spalte von INTEGER nach TINYINT NOT NULL zu konvertieren, und gleichzeitig Spalte b von CHAR(10) nach CHAR(20) unter Umbenennung von b nach c zu verändern:
mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20);
Einfügen einer TIMESTAMP Spalte mit Namen d:
mysql> ALTER TABLE t2 ADD d TIMESTAMP;
Um einen Index an Spalte d anzufügen, und diese als primary key zu bestimmen:
mysql> ALTER TABLE t2 ADD INDEX (d), ADD PRIMARY KEY (a);
Spalte c Löschen:
mysql> ALTER TABLE t2 DROP COLUMN c;
Hinzufügen einer AUTO_INCREMENT integer Spalte namens c:
mysql> ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT,
- ADD INDEX (c);
Man beachte, daß wir c indiziert haben, weil AUTO_INCREMENT Spalten zwangsläufig indiziert werden müssen. Wir erklären c als NOT NULL, weil indizierte Spalten nicht NULL sein dürfen. Anfang
SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [DISTINCT | DISTINCTROW | ALL]
- select_expression,... [INTO OUTFILE 'file_name' export_options] [FROM table_references
- [WHERE where_definition] [GROUP BY col_name,...] [HAVING where_definition] [ORDER BY {unsigned_integer | col_name} [ASC | DESC] ,...] [LIMIT [offset,] rows] [PROCEDURE procedure_name] ]
SELECT wird eingesetzt, um Reihen aus einer oder mehreren Tabellen abzufragen. select_expression zeigt an, welche Spalten ausgewählt werden sollen. Das simpelste Bespiel:
mysql> SELECT 1 + 1;
-> 2
Alle Schlüsslworte müssen in exakt dieser Reihenfolge angegeben werden. Der Ausdruck HAVING muß hierbei nach allen GROUP BY Ausdrücken, jedoch vor allen ORDER BY Ausdrücken stehen. Der SELECT Befehl kann zusammen mit dem Alias AS verwendet werden. Er kann mit ORDER BY und HAVING Ausdrücken verwendet werden:
mysql> select concat(last_name,', ',first_name) AS full_name
- from mytable ORDER BY full_name;
Die FROM table-references Ausdrücke zeigen an, daß Zeilen aus den Tabellen selektiert werden. Falls mehr als eine Tabelle angegeben wird, dann wird ein JOIN ausgeführt, siehe Kapitel JOIN. Der Befehl kann sich auf eine Spalte als col_name, tbl_name.col_name oder db_name.tbl_name.col_name beziehen. Eine Tabellenreferenz kann mit einem Alias versehen werden, wenn man tbl_name [AS] alias_name verwendet:
mysql> select t1.name, t2.salary from employee AS t1, info AS t2
- where t1.name = t2.name;
mysql> select t1.name, t2.salary from employee t1, info t2
- where t1.name = t2.name;
Ausgewählte Spalten dürfen für die Ausgabe sortiert werden. Hierfür benutzt man ORDER BY und GROUP BY Ausdrücke:
mysql> select college, region, seed from tournament
- ORDER BY region, seed;
mysql> select college, region AS r, seed AS s from tournament
- ORDER BY r, s;
mysql> select college, region, seed from tournament
- ORDER BY 2, 3;
Um in umgekehrter Reihenfolge zu sortieren, muß der Ausdruck DESC (descending) an den Namen der Spalte angefügt werden, zusammen mit dem Ausdruck ORDER BY. In Aufsteigender Reihenfolge wird mit dem Schlüsselwort ASC sortiert. Der Ausdruck HAVING kan sich auf irgendeine Spalte oder einen Alias beziehen, der in select_expression angegeben wurde. Er wird zuletzt angegeben. Benutzen Sie niemalös HAVING für Angaben, die in dem Ausdruck WHERE stehen sollten. Beispielsweise ist dieser Ausdruck verboten:
mysql> select col_name from tbl_name HAVING col_name > 0;
Stattdessen muß es so heißen:
mysql> select col_name from tbl_name WHERE col_name > 0;
In MySQL 3.22.5 oder höher ist auch folgende Schreibweise erlaubt:
mysql> select user,max(einkommen) from angestellte
group by angestellte HAVING max(einkommen)>10000;
HAVING ist eine Art Nachselektierung des vorangegangenen SQL Statements. In unsererm Beispiel werden alle maximalen Löhne der Angestellten herausgesucht werden, allerdings werden alle unter 10.000 DM Einkommen nicht ausgegeben. In älteren Versionen muß dieses so formuliert werden:
mysql> select user,max(einkommen) AS sum from angestellte
group by angestellte HAVING sum>10;
STRAIGHT_JOIN zwingt den Optimizer, Tabellen in der Reihenfolge zu verknüpfen, in der sie in dem Ausdruck FROM stehen. Falls der Optimizer Tabellen nicht optimal verknüpft, könnte dies die Abfrage beschleunigen.
SQL_SMALL_RESULT kann mit GROUP BY oder DISTINCT eingesetzt werden, um dem Optimizer mitzuteilen, daß das Ausgabeergebnis recht klein ist. In diesem Falle wird MySQL schnelle temporäre Tabellen anlegen, um das Ergebnis zu speichern, anstelle des Sortierens. Dieser Befehl ist eine MySQL spezifische Erweiterung und nicht in ANSI SQL92 enthalten.
Der Ausdruck LIMIT kann benutzt werden, um die Zahl der Reihen bei der Ausgabe zu begrenzen. LIMIT braucht zwei Zahlen als Argumente. Die erste Zahl bestimmt den Offset der ersten Reihe, die zweite Zahl die Zahl der Ausgaben. Der Offset beginnt mit 0, nicht wie sonst alles mit 1:
mysql> select * from table LIMIT 5,10; # Zeilen 6-15 ausgeben
Ist nur ein Argument angegeben, wird angenommen, daß die Zahl der Reihen gemeint ist:
mysql> select * from table LIMIT 5; # Gebe die ersten 5 Zeilen aus
Das bedeutet, daß LIMIT n identisch zu LIMIT 0,n ist. Insbesondere für Ausgaben im Browser über das Internet ist es wichtig, daß diese begrenzt werden. Ansonsten muß mit DoS Angriffen (Denial of Service = Außer Gefecht setzen) oder Überlastungen des Server gerechnet werden.
Der Befehl SELECT ... INTO OUTFILE 'file_name' bedeutet, daß SELECT die Ausgabe in eine Datei schreibt. Diese wird auf dem Server Host angelegt. Es können nur Dateien angelegt werden, die noch nicht existieren, damit nicht versehentlich die Datei /etc/passwd überschrieben wird.....
Es müssen auf dem Host zum Schreiben einer Datei privilegien zuvor vergeben worden sein (umask 022 in der Datei /etc/profiles).
INTO OUTFILE ist das Gegenstück zu LOAD DATA INFILE. Die Syntax kann aus einigen FIELDS und LINES Ausdrücken bestehen. Die Textdatei, in die ausgegeben wird, sind nur die folgenden Buchstaben mit einem Fluchtsymbol versehen (EXCAPED BY character). Es gibt hier die Ausdrücke FIELDS TERMINATED BY und LINES TERMINATED BY. ASCII 0 wird zu einem ESCAPED 0 und einer zusätzlichen 0 konvertiert, ein Tribut an die C-Syntax von Arrays.
Die FIELDS TERMINATED BY, EXCAPED BY oder LINES TERMINATED BY Buchstaben müssen so gespeichert werden, damit die Datei sauber wieder eingelesen werden kann. ASCII 0 wird von einigen Editoren besser verstanden.
Anfang
- INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
- [INTO] tbl_name [(col_name,...)] VALUES (expression,...),(...),...
oder INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
- [INTO] tbl_name [(col_name,...)] SELECT ...
oder INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
- [INTO] tbl_name SET col_name=expression, col_name=expression, ...
INSERT fürgt neue Reihen in eine Tabelle ein. Die INSERT ... VALUES Ausdruck fügt Reihen ein, unter Verwendung genau angegeber Zahlen. Das INSERT ... SELECT Ausdruck fügt eine Reihe ein, die aus einer anderen Tabelle ausgewählt wurden. Der Ausdruck INSERT ... VALUES mit der Angabe einer mehrfachen Werteliste wird ab MySQL 3.22.5 unterstützt. Der Ausdruck col_name=expression wird ab MySQL 3.22.10 unterstützt.
tbl_name ist die Tabelle, in welche die Reihen eingefügt werden sollen. Die Zusatzangabe der Liste col_name oder der Ausdruck SET zeigt an, auf welche Spalten der Ausdruck wirkt.
Wenn keine Spalten Liste bei INSERT ... VALUES oder INSERT ... SELECT, angegeben ist, dann müssen die Spalten in der VALUES() Liste oder im SELCT Statement angegeben werden. Allen Spalten, denen kein Wert zugewiesen wird, fallen auf den Defaultwert zurück. Wenn, zum Beispiel, eine Spaltenliste angegeben wird, die nicht alle Spalten in der Tabelle aufzählt, dann werden die ungenannten Spalten auf ihre Defaultwerte gesetzt. Der Default Wert ist bei CREATE angegeben. Ein Ausdruck kann sich aber auch auf alle Spalten beziehen, die etwas früher in einer Liste genannt wurden:
mysql> INSERT INTO tbl_name (col1,col2) VALUES(15,col1*2);
Dieser Ausdruck ist nicht erlaubt:
mysql> INSERT INTO tbl_name (col1,col2) VALUES(col2*2,15);
Wenn das Schlüsselwort LOW_PRIORITY angegeben wird, dann wird die Ausführung des INSERT Befehls solange verzögert, bis keine Abfrage mehr stattfindet. Wenn das Schlüsselwort IGNORE in einem INSERT Statement mit vielen Reihen angegeben wird, werden alle Reihen ignoriert, die einen existerenden PRIMARY oder UNIQUE Schlüsseleintrag enthalten. Wenn IGNORE nicht angegeben wird, bricht der INSERT genau dann ab, wenn dort eine Reihe ist, die einen Schlüsselwert gerade dupliziert. Mit Hilfe des Befehls mysql_info() kann abgefragt werden, wieviele Reihen in die Tabelle ingefügt worden sind. Wenn MySQL so konfiguriert wurde, daß die Option DONT_USE_DEFAULT_FIELDS aktiviert wurde, erzeugen INSERT Statements eine Fehlermeldung, wenn speziell Werte für alle Spalten angegeben werden, die einen NON-NULL Wert erwarten.
Die folgenden Zusatzbedingungen für ein INSERT INTO ... SELECT Statement müssen erfüllt sein:
- Eine Abfrage darf kein ORDER BY enthalten
- Die Zieltabelle des INSERT Befehls darf nicht in FROM des SELECT Teils der Abfrage enthalten sein. Es ist unter ANSI SQL verboten, ein und dieselbe Tabelle für lesen und INSERT zu verwenden.
Wenn INSERT ... SELECT oder ein INSERT ... VALUES Statement mit vielfachen Wertelisten verwendet wird, dann kan die C API Funktion mysql_info() verwendet werden, um Informationen über die Abfrage zu erhalten. Das Format lautet wie folgt:
Records: 100 Duplicates: 0 Warnings: 0
Duplicates zeigt die Zahl der Reihen an, welche nicht eingefügt werden konnten, weil sie einen eindeutigen Index Wert kopieren würden. Warnings zeigt die Zahl der Versuche, Spaltenwerte einzufügen, an. Warnungen können aber auch unter folgenden Bedingungen auftreten:
- Einfügen einer NULL in eine Spalte, die als NOT NULL definiert wurde. Es wird der Defaultwert angenommen.
- Setzen einer numerischen Spalte auf einen Wert, der außerhalb des Spalten Limits liegt.
- Setzen einer Numerischen Spalte auf einen Wert, wie z.B. "10.34 a". Der Zahlenmüll wird entfernt und es wird ein "a", also ein Buchstabe als numerischer Wert für die Spalte genommen. Der Wert wird auf 0 gesetzt.
- Einfügen eines Strings in eine CHAR, VARCHAR, TEXT oder BLOB - Spalte, die die maximale Länge der Spalte überschreitet. Der String wird beim Maximum abgeschnitten.
- Einfügen eines Wertes in eine Datum oder Zeit-Spalte, die nicht als solche definiert wurde. Der Wert wird auf NULL gesetzt.
Die Option DELAYED für das INSERT Statement ist eine MySQL spezifische Option, die sehr sinvoll ist, wenn es Clients gibt, die nicht auf die Beendigung eines INSERT warten können. Das kann z.B. passieren, wenn MySQL für Logging verwendet wird, und gleichzeitig SELECT Statements laufen müssen, die sehr lange dauern. DELAYED wurde in MySQL 3.22.15 eingeführt und ist eine Erweiterung gegenüber dem ANSI SQL92 Standard.
Ein weiterer Vorteil von INSERT DELAYED ist, daß INSERTS von vielen Clients gebündelt werden, um in einem Vorgang geschrieben zu werden. Diese Vorgehensweise ist viel schneller, als einzelne INSERTS durchzuführen.
Die gequeuten Reihen werden immer nur im RAM gehalten, bis sie in die Tabelle eingefügt werden. Das bedeutet, wenn der mysqld Dämon gekillt wird, beispielsweise mit kill -9, dann sind die Daten verloren.
Anfang
UPDATE [LOW_PRIORITY] tbl_name SET col_name1=expr1,col_name2=expr2,...
- [WHERE where_definition]
UPDATE setzt neue Werte in Spalten von existierenden Tabellen ein. Der Ausdruck SET zeigt an, welche Spalten modifiziert werden sollen. Die Option WHERE, gibt die Reihe an, andernfalls werden alle Reihen modifiziert.
Bei der Angabe des Schlüsselwortes LOW_PRIORITY wird die Ausführung von UPDATE solange verzögert, bis kein Client mehr lesend zugreift.
Das folgende Beispiel erhöht den Wert einer ganzen Spalte um eins:
mysql> UPDATE persondata SET age=age+1;
UPDATE Zuweisungen werden von links nach rechts ausgeführt. Folgendes Beispiel verdoppelt zuerst die Werte, danach erste werde diese um eins erhöht:
mysql> UPDATE persondata SET age=age*2, age=age+1;
UPDATE gibt die Zahl der Reihen zurück, die aktuell verändert wurden. Mit mysqlinfo() können diese Rückgabe-Werte angezeigt werden.
Linux/MySql/Ref (last modified 2008-11-04 07:00:06)