Weiter Zurück [Inhalt] Online Suche im Handbuch

28.8 SELECT

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.


Weiter Zurück [Inhalt] Online Suche im Handbuch