Die SELECT-Klausel definiert die Struktur der Ergebnismenge (Selektion), für die von der Datenbank zu lesenden Daten.
Die Selektion kann eine einzelne Zeile also flach sein, oder aus mehreren Zeilen bestehen, also tabellenartig sein. Doppelt vorkommende Zeilen können ausgeschlossen werden. Die SELECT-Klausel bestimmt weiterhin die zu lesenden Spalten und definiert deren Namen. Dabei können die Namen aus der Datenbanktabelle durch alternative Spaltennamen ersetzt werden Auf einzelne Spalten können Aggregatfunktionen angewendet werden.
Die SELECT-Klausel lässt sich in zwei Teile für Zeilen und Spalten unterteilen:
SELECT lines cols ...
In lines wird angegeben, ob eine einzelne Zeile mit: SELECT SINGLE cols
oder mehrere Zeilen mit: SELECT [DISTINCT] cols gelesen werden.
Ohne Angabe von DISTINCT (lines ist also leer), werden alle Zeilen in Abhängigkeit von der WHERE-Klausel gelesen. Bei der Angabe von DISTINCT werden doppelt vorkommende Zeilen ausgeschlossen.
In cols wird die Spaltenauswahl definiert.
Um alle Spalten zu lesen schreibt man für cols:
SELECT lines *...
Es werden alle Spalten der angegebenen Zeilen gelesen. Das Lesen einzelner Spalten kann erheblich performanter sein, als alle Spalten einer Datenbanktabelle zu lesen. Es sollten deshalb immer nur die Spalten gelesen werden, die auch im Programm benötigt werden.
Um einzelne Spalten zu lesen schreibt man für cols:
SELECT lines s1 [AS a1] s2 [AS a2] ...
Hierbei bezeichnen die s1 s2 … einzelne Spalten. Durch den Zusatz AS kann für jede Spalte s1 s2 … ein alternativer Spaltenname a1 a2 … definiert werden. Der alternative Spaltenname wird in der INTO-Klausel und in der ORDER-BY-Klausel statt dem richtigen Spaltennamen verwendet. Beispielsweise kann so erreicht werden, dass bei der Variante INTO CORRESPONDING FIELDS der INTO-Klausel der Inhalt einer Spalte s1 in eine Komponente a1 einer Struktur geschrieben wird.
Um Aggregate, also zusammengefasste Daten, einzelner Spalten zu lesen, schreibt man für cols:
SELECT lines agg( [DISTINCT] s1) [AS a1]
agg(
[DISTINCT] s2) [AS a2] ...
Hierbei sind die s1 s2 … wieder einzelne Spalten. Der Ausdruck agg steht für eine der folgenden Aggregatfunktionen:
· MAX: liefert den Maximalwert der Spalte
· MIN: liefert den Minimalwert der Spalte
· AVG: liefert den Durchschnittswert der Spalte
· SUM: liefert die Summe der Spalte
· COUNT: zählt Werte oder Zeilen wie folgt:
· COUNT( DISTINCT s ) liefert die Anzahl unterschiedlicher Werte in der Spalte s.
· COUNT( * ) bzw. count(*) liefert die gesamte Anzahl der Zeilen in der Ergebnismenge
Mit DISTINCT können doppelt vorkommende Werte aus der Berechnung ausgeschlossen werden. Mit dem Zusatz AS kann wieder für jeden Aggregatausdruck ein alternativer Spaltenname a1 a2 …definiert werden.
Die Angabe cols kann auch dynamisch gemacht werden:
SELECT lines (itab)...
In den Klammern muss der Name einer internen Tabelle itab stehen, die entweder leer ist oder die Angaben s1 s2 … zum Lesen einzelner Spalten bzw. entsprechende Aggregatausdrücke enthält. Ist die interne Tabelle leer, bezeichnet sie alle Spalten.
Lesen bestimmter Spalten einer einzigen Zeile.
REPORT demo_select_single.
DATA wa TYPE spfli.
SELECT SINGLE carrid connid cityfrom cityto
INTO CORRESPONDING FIELDS OF wa
FROM spfli
WHERE carrid EQ 'LH' AND connid EQ '0400'.
IF sy-subrc EQ 0.
WRITE: / wa-carrid, wa-connid, wa-cityfrom, wa-cityto.
ENDIF.
Die Listenausgabe ist:
Durch die Angabe SINGLE in der SELECT-Klausel liest die SELECT-Anweisung eine einzige Zeile der Datenbanktabelle SPFLI, in der die Primärschlüsselfelder CARRID und CONNID entsprechend der WHERE-Klausel gefüllt sind. Die in der SELECT-Klausel angegebenen Spalten werden in die gleichnamigen Komponenten der Struktur wageschrieben.
Lesen bestimmter Spalten mehrerer Zeilen.
REPORT demo_select_some_columns.
DATA: itab TYPE STANDARD TABLE OF spfli,
wa LIKE LINE OF itab.
SELECT carrid connid cityfrom cityto
INTO CORRESPONDING FIELDS OF TABLE itab
FROM spfli
WHERE carrid EQ 'LH'.
IF sy-subrc EQ 0.
LOOP AT itab INTO wa.
WRITE: / wa-carrid, wa-connid, wa-cityfrom,
wa-cityto.
ENDLOOP.
ENDIF.
Die Listenausgabe ist:
Da keine Angabe zu den Zeilen in der SELECT-Klausel gemacht werden, liest die SELECT-Anweisung alle Zeilen der Datenbanktabelle SPFLI, welche die Bedingung in der WHERE-Klausel erfüllen. Die in der SELECT-Klausel angegebenen Spalten werden in die gleichnamigen Komponenten der Tabelle itab geschrieben.
Lesen aller Spalten mehrerer Zeilen.
REPORT demo_select_all_columns.
DATA wa TYPE spfli.
SELECT *
INTO CORRESPONDING FIELDS OF wa
FROM spfli
WHERE carrid EQ 'LH'.
WRITE: / sy-dbcnt,
wa-carrid,
wa-connid, wa-cityfrom, wa-cityto.
ENDSELECT.
Die Listenausgabe ist:
Da keine Angabe zu den Zeilen in der SELECT-Klausel gemacht werden, liest die SELECT-Anweisung alle Zeilen der Datenbanktabelle SPFLI, welche die Bedingung in der WHERE-Klausel erfüllen. Alle Spalten der Tabelle werden in die gleichnamigen Komponenten einer flachen Struktur WA geschrieben. Deshalb muss eine mit ENDSELECT abgeschlossene SELECT-Schleife programmiert werden.
Aggregatfunktionen.
Die Datenbanktabelle TEST bestehe aus zwei Spalten und 10 Zeilen:
COL_1 |
COL_2 |
1 |
3 |
2 |
1 |
3 |
5 |
4 |
7 |
5 |
2 |
6 |
3 |
7 |
1 |
8 |
9 |
9 |
4 |
10 |
3 |
Der folgende Programmabschnitt demonstriert die Aggregatfunktionen:
DATA RESULT TYPE P DECIMALS 2.
SELECT agg(
[DISTINCT] COL_2)
INTO RESULT
FROM TEST.
WRITE RESULT.
Folgende Tabelle zeigt die Ergebnisse dieser Programmzeilen, die sich aus verschiedenen Kombinationen von Aggregatausdrücken agg mit dem Zusatz DISTINCT ergeben.
Aggregatausdruck |
DISTINCT |
Ergebnis |
MAX |
nein |
9.00 |
MAX |
ja |
9.00 |
MIN |
nein |
1.00 |
MIN |
ja |
1.00 |
AVG |
nein |
3.80 |
AVG |
ja |
4.43 |
SUM |
nein |
38.00 |
SUM |
ja |
31.00 |
COUNT |
ja |
7.00 |
COUNT( * ) |
--- |
10.00 |
Dynamische Spaltenangaben
REPORT demo_select_dynamic_columns.
DATA: itab TYPE STANDARD TABLE OF spfli,
wa LIKE LINE OF itab.
DATA: line(72) TYPE c,
list LIKE TABLE OF
line(72).
line = ' CITYFROM CITYTO '.
APPEND line TO list.
SELECT DISTINCT (list)
INTO CORRESPONDING FIELDS OF TABLE itab
FROM spfli.
IF sy-subrc EQ 0.
LOOP AT itab INTO wa.
WRITE: / wa-cityfrom, wa-cityto.
ENDLOOP.
ENDIF.
Die Listenausgabe ist:
In der internen Tabelle itab sind die aus der Datenbanktabelle SPFLI zu lesenden Spalten angegeben. Durch die Angabe DISTINCT in der SELECT-Klausel liest die SELECT-Anweisung alle Zeilen die in diesen beiden Spalten einen unterschiedlichen Inhalts haben. Es ergibt sich eine Liste der möglichen Flugstrecken.