:: DEVELOPER ZONE
SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [SQL_BUFFER_RESULT]
[HIGH_PRIORITY]
[DISTINCT | DISTINCTROW | ALL]
select_ausdruck,...
[INTO {OUTFILE | DUMPFILE} 'datei' export_optionen]
[FROM tabellenreferenz
[WHERE where_definition]
[GROUP BY {positive_ganzzahl | spalten_name | formel} [ASC | DESC], ...]
[HAVING where_definition]
[ORDER BY {positive_ganzzahl | spalten_name | formel} [ASC | DESC] ,...]
[LIMIT [offset,] zeilen]
[PROCEDURE prozedur_name]
[FOR UPDATE | LOCK IN SHARE MODE]]
SELECT wird benutzt, um ausgewählte Zeilen aus einer oder mehreren
Tabellen abzurufen. select_ausdruck gibt die Spalten an, die Sie
abrufen wollen. SELECT kann auch benutzt werden, um Zeilen ohne
Bezug zu irgend einer Tabelle abzurufen. Beispiel:
mysql> SELECT 1 + 1;
-> 2
Alle benutzten Schlüsselwörter müssen genau in der oben angegebenen
Reihenfolge genannt werden. Beispielsweise muss eine HAVING-Klausel
nach jeglicher GROUP BY-Klausel und vor jeglicher ORDER BY-Klausel kommen.
Einem SELECT-Ausdruck kann mit AS ein Alias zugewiesen
werden. Der Alias wird als Spaltenname verwendet und kann bei ORDER BY- oder HAVING-Klauseln benutzt werden. Beispiel:
mysql> select concat(nachname,', ',vorname) AS voller_name
from tabelle ORDER BY voller_name;
The FROM tabellenreferenz-Klausel gibt die Tabellen an, aus denen
Zeilen abgerufen werden sollen. Wenn Sie mehr als eine Tabelle aufführen,
führen Sie einen Join durch. Informationen über die Join-Syntax finden Sie
unter Abschnitt 7.4.1.1, „JOIN-Syntax“.
Sie können auf eine Spalte als spalten_name verweisen, als
tabelle.spalten_name oder als datenbank.tabelle.spalten_name.
Sie müssen das tabelle- oder datenbank.tabelle-Präfix für
einen Spaltenverweis in einem SELECT-Statement nicht angeben, es sei
denn, der Verweis wäre ansonsten mehrdeutig. Sie Abschnitt 7.1.2, „Datenbank-, Tabellen-, Index-, Spalten- und Alias-Namen“; hier
finden sich Beispiele von Mehrdeutigkeit, die erfordern, dass Sie
ausführlichere Spaltenverweis-Formen benutzen.
Einem Tabellenverweis kann mit tabelle [AS] alias_name ein
Tabellen-Alias zugewiesen werden:
mysql> select t1.name, t2.gehalt from angestellte AS t1, info AS t2
where t1.name = t2.name;
mysql> select t1.name, t2.gehalt from angestellte t1, info t2
where t1.name = t2.name;
Auf Spalten, die für die Ausgabe ausgewählt wurden, kann in ORDER BY- und GROUP BY-Klauseln mit Spaltennamen, Spalten-Aliasen oder
Spaltenpositionen verwiesen werden. Spaltenpositionen fangen mit 1 an:
mysql> select hochschule, region, seed von tournament
ORDER BY region, seed;
mysql> select hochschule, region AS r, seed AS s from turnier
ORDER BY r, s;
mysql> select hochschule, region, seed from turnier
ORDER BY 2, 3;
Um in absteigender Reihenfolge zu sortieren, fügen Sie dem Namen der
Spalte das DESC-Schlüsselwort in the ORDER BY-Klausel hinzu
(descending, absteigend), nach der Sie sortieren. Die Vorgabe ist
aufsteigende Reihenfolge. Das können Sie auch explizit angeben, indem Sie
das ASC-Schlüsselwort verwenden.
In der WHERE-Klausel können Sie beliebige Funktionen verwenden, die
MySQL unterstützt. See Abschnitt 7.3, „Funktionen für die Benutzung in SELECT- und WHERE-Klauseln“.
Die HAVING-Klausel kann auf jede Spalte oder jeden Alias verweisen,
die bzw. der im select_ausdruck genannt wurde. Die Klausel wird
zuletzt angewandt, direkt bevor Ergebnisse an den Client geschickt werden,
ohne jede Optimierung. Benutzen Sie kein HAVING für Dinge, die in
der WHERE-Klausel stehen sollten. Schreiben Sie beispielsweise nicht
folgendes:
mysql> select spalten_name from tabelle HAVING spalten_name > 0;
Sondern statt dessen:
mysql> select spalten_name from tabelle WHERE spalten_name > 0;
Ab MySQL-Version 3.22.5 können Sie Anfragen auch wie folgt schreiben:
mysql> select user,max(gehalt) from benutzer
group by benutzer HAVING max(gehalt)>10;
In älteren MySQL-Versionen schreiben Sie statt dessen:
mysql> select benutzer,max(gehalt) AS summe from benutzer
group by benutzer HAVING summe>10;
SQL_SMALL_RESULT, SQL_BIG_RESULT, SQL_BUFFER_RESULT,
STRAIGHT_JOIN und HIGH_PRIORITY sind MySQL Erweiterungen zu
ANSI-SQL92.
HIGH_PRIORITY gibt dem SELECT höhere Priorität als einem
Statement, das eine Tabelle aktualisiert. Sie sollten das nur für Anfragen
benutzen, die sehr schnell sind und sofort durchgeführt werden müssen. Eine
SELECT HIGH_PRIORITY-Anfrage läuft, wenn die Tabelle eine
Lese-Sperre hat, selbst wenn es ein Update-Statement gibt, das darauf
wartet, dass die Tabelle freigegeben wird.
SQL_BIG_RESULT kann bei GROUP BY oder DISTINCT benutzt
werden, um dem Optimierer mitzuteilen, dass das Ergebnis sehr viele Zeilen
haben wird. In diesem Fall benutzt MySQL bei Bedarf direkt
Festplatten-basierende temporäre Tabellen. Ausserdem bevorzugt MySQL in
diesem Fall Sortieren vor dem Anlegen einer temporären Tabelle mit einem
Schlüssel auf den GROUP BY-Elementen.
Wenn Sie GROUP BY benutzen, werden die Ausgabe-Zeilen gemäß dem
GROUP BY sortiert, als hätten Sie ein ORDER BY für alle
Felder im GROUP BY angegeben. MySQL hat GROUP BY erweitert,
so dass Sie dafür auch ASC und DESC angeben können:
SELECT a,COUNT(b) FROM tabelle GROUP BY a DESC
MySQL hat die Benutzung von GROUP BY erweitert, um es Ihnen zu
gestatten, auch Felder auszuwählen, die nicht in der GROUP BY-Klausel erwähnt wurden. Wenn Sie nicht die Ergebnisse erhalten, die Sie
von Ihrer Anfrage erwarten, lesen Sie bitte die GROUP BY-Beschreibung.
SQL_BUFFER_RESULT erzwingt, dass das Ergebnis in eine temporäre
Tabelle geschrieben wird. Das hilft MySQL, frühzeitig Tabellensperren
aufzuheben, und hilft in Fällen, in denen es lange dauert, das Ergebnis an
den Client zu senden.
SQL_SMALL_RESULT, eine MySQL-spezifische Option, kann bei
GROUP BY oder DISTINCT benutzt werden, um dem Optimierer
mitzuteilen, dass der Ergebnissatz klein sein wird. In diesem Fall benutzt
MySQL schnelle temporäre Tabellen, um die Ergebnistabelle zu speichern,
anstatt Sortieren zu benutzen. In MySQL-Version 3.23 sollte das
normalerweise nicht benötigt werden.
STRAIGHT_JOIN zwingt den Optimierer, Tabellen in der Reihenfolge zu
verknüpfen, in der sie in der FROM-Klausel aufgelistet sind. Sie
können das benutzen, um die Geschwindigkeit einer Anfrage zu erhöhen, wenn
der Optimierer Tabellen in nicht optimaler Reihenfolge verknüpft.
See Abschnitt 6.2.1, „EXPLAIN-Syntax (Informationen über ein SELECT erhalten)“.
Die LIMIT-Klausel wird benutzt, um die Anzahl von Zeilen, die vom
SELECT-Statement zurückgegeben werden, zu beschränken. LIMIT
erwartet ein oder zwei numerische Argumente.
Wenn zwei Argumente angegeben sind, legt das erste den Offset der ersten Zeile fest, die zurückgegeben wird, und das zweite gibt die maximale Anzahl von Zeilen an, die zurückgegeben werden. Der Offset der anfänglichen Zeile ist 0 (nicht 1):
mysql> select * from tabelle LIMIT 5,10; # Zeilen 6 bis 15 zurückgeben
Wenn ein Argument angegeben wird, stellt es die maximale Anzahl von Zeilen dar, die zurückgegeben werden:
mysql> select * from tabelle LIMIT 5; # Die ersten 5 Zeilen zurückgeben
Mit anderen Worten ist LIMIT n äquivalent zu LIMIT 0,n.
Die SELECT ... INTO OUTFILE 'datei'-Form von SELECT schreibt
die ausgewählten Zeilen in eine Datei. Die Datei wird auf dem Server-Host
erzeugt und darf nicht bereits bestehen (das verhindert unter anderem, dass
Datenbanktabellen und Dateien wie /etc/passwd zerstört werden). Sie
benötigen die file-Berechtigung auf dem Server-Host, um diese Form
von SELECT auszuführen.
SELECT ... INTO OUTFILE ist hauptsächlich dafür vorgesehen, um eine
Tabelle auf der Server-Maschine schnell zu dumpen. Wenn Sie die
resultierende Datei auf einem anderen Host als dem Server-Host haben
wollen, können Sie SELECT ... INTO OUTFILE nicht benutzen. In diesem
Fall sollten Sie statt dessen ein Client-Programm wie mysqldump --tab oder mysql -e "SELECT ..." > outfile benutzen, um die Datei
zu erzeugen.
SELECT ... INTO OUTFILE ist das Komplement von LOAD DATA INFILE; die Syntax für den export_optionen-Teil des Statements
besteht aus denselben FIELDS- und LINES-Klauseln, die beim
LOAD DATA INFILE-Statement benutzt werden. See Abschnitt 7.4.9, „LOAD DATA INFILE-Syntax“.
In der resultierenden Textdatei werden nur folgende Zeichen durch das
ESCAPED BY-Zeichen escapet:
Das ESCAPED BY-Zeichen
Das erste Zeichen in FIELDS TERMINATED BY
Das erste Zeichen in LINES TERMINATED BY
Zusätzlich wird ASCII 0 in ESCAPED BY, gefolgt von 0
(ASCII 48), umgewandelt.
Der Grund hierfür ist, dass Sie jegliche FIELDS TERMINATED BY-,
ESCAPED BY- oder LINES TERMINATED BY-Zeichen escapen MÜSSEN,
um die Datei zuverlässig wieder einlesen zu können. ASCII 0 wird
escapet, um das Lesen mit einigen Pagern zu erleichtern.
Weil sich die resultierende Datei nicht nach der SQL-Syntax richten muss, muss nicht weiter escapet werden.
Im Folgenden ein Beispiel, wie man eine Datei in einem Format erhält, das von vielen alten Programmen benutzt wird:
SELECT a,b,a+b INTO OUTFILE "/tmp/resultat.text" FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY "\n" FROM tabelle;
Wenn Sie INTO DUMPFILE anstelle von INTO OUTFILE benutzen,
schreibt MySQL nur eine Zeile in die Datei, ohne jede Spalten- oder
Zeilen-Begrenzer und ohne jedes Escapen. Das ist nützlich, wenn Sie ein
Blob in eine Datei speichern wollen.
Beachten Sie, dass jede Datei, die von INTO OUTFILE und INTO DUMPFILE erzeugt wird, für alle Benutzer lesbar ist! Der Grund liegt
darin, dass der MySQL-Server keine Datei erzeugen kann, die jemandem
anderen gehört als dem Benutzer, unter dem er läuft (Sie sollten
mysqld nie als Root laufen lassen), daher muss die Datei für
jedermann lesbar sein, damit Sie die Zeilen abrufen können.
Wenn Sie FOR UPDATE bei einem Tabellen-Handler mit
Seiten-/Zeilen-Sperren benutzen, werden die untersuchten Zeilen
schreib-gesperrt.
© 1995-2005 MySQL AB. All rights reserved.
