!--a11y-->

SELECT 句は、データベースから読み込む結果セット ( 選択) の構造を定義します。
選択はフラット ( 単一行) または表形式 ( 複数行) で行えます。重複エントリを許容するか除外するかを指定することができます。SELECT 句では、読み込む列の名称を指定することもできます。データベース項目の名称を代替名称に置き換えることができます。集計機能は、個別の列に適用することができます。
SELECT 句は行および列の 2 部分に分割することができます。
SELECT < 行> <cols> ...
<行> は 1 行を読み込むか、複数行を読み込むかを指定します。<cols> は列選択を定義します。
データベースから単一エントリを読み込むには、以下の命令を使用します。
SELECT SINGLE <cols> ...WHERE ...
行が一意に識別されるようにするには、WHERE 句でテーブルの一次キーのすべての項目に対して値を指定する必要があります。WHERE 句にすべてのキー項目が含まれていない場合は、構文チェックで警告が表示され、命令によって検索された、指定のキー項目と一致する最初のエントリが読み込まれます。
選択結果は、<cols> で指定した列の数によって、基本項目かフラット構造のいずれかになります。INTO 句の対象領域は、適切な形に変換可能である必要があります。
該当するキーが検索された場合は SY-SUBRC が 0 に設定され、検索されなかった場合は 4 に設定されます。
データベースから複数エントリを読み込むには、以下の命令を使用します。
SELECT [DISTINCT] <cols> ...WHERE ...
DISTINCT を使用しない場合 (<行> は空になります) は、WHERE 条件を満たすすべての行が読み込まれます。DISTINCT を使用した場合は、重複エントリは除外されます。
選択結果は表になります。INTO 句の対象領域は、<cols> に該当する行データ型の内部テーブルにすることができます。対象領域が内部テーブルではなくフラット構造の場合は、SELECT 命令の後に ENDSELECT 命令を含めることができます。
SELECT [DISTINCT]
<cols> ...WHERE ...
...
ENDSELECT.
行はループにおいて、INTO 句で指定された対象領域に1 行ずつ読み込まれます。ループ内で対象領域を処理することができます。
少なくとも 1 行が読み込まれると、命令 ( またはループ) が処理された後で SY-SUBRC が 0 に設定されます。行が読み込まれなかった場合は、SY-SUBRC が 4 に設定されます。読み込まれた行数はシステム項目 SY-DBCNT に格納されます。ループ内で、SY-DBCNT には対象領域に受け渡された行数がすでに示されています。
技術的には、SELECT ループをネストすることができます。ただし、パフォーマンス上の理由からループのネストは行わないでください。複数のデータベーステーブルから相互依存するデータを読み込む場合は、FROM 句で結合を使用するか、WHERE 句でサブクエリを使用します。
データベーステーブルのすべての列を読み込むには、以下の命令を使用します。
SELECT < 行> * ...
この命令は、指定した行のすべての列を読み込みます。選択された行のデータ型は、ABAP ディクショナリのデータベーステーブルとまったく同じデータ型の構造です。INTO 句の対象領域は、このデータ型と互換性があるか、少なくともこのデータ型に変換可能である必要があります。他の句では、データベーステーブルでそれぞれの名称のもとに列を処理できます。
個別の列を読み込むことは、テーブルのすべての列を読み込むよりもはるかに効率的です。したがって、プログラムで必要な列だけを読み込んでください。
データベーステーブルから単一列を読み込むには、以下の命令を使用します。
SELECT < 行> <s1> [AS <a1>] <s2> [AS <a2>] ...
where <si> は単一列です。FROM 句のフォームによって、列の処理方法が以下のように異なります。
キ <si> はデータベーステーブルのコンポーネント <ci> を指定します。これは、該当する名称が一意の場合にのみ可能です。 FROM 句に単一のデータベーステーブルだけを指定する場合は、常にこの方法を使用します。
キ <si> は必要なコンポーネントの正式名称を<dbtab>~<ci> のフォームで指定します。<dbtab> はデータベーステーブルの名称です。コンポーネント名が FROM 句の複数のデータベーステーブルに表示される場合は常にこの方法を使用する必要があり、データベーステーブル <dbtab> がFROM 句に 1 回だけ表示される場合にのみこの方法が可能です。
キ <si> は必要なコンポーネントの正式名称を<tabalias>~<c i> のフォームで指定します。<tabalias> はデータベーステーブルのエイリアスです。読み込む元のテーブルが FROM 句に複数回表示される場合は、常にこの方法を使用する必要があります。FROM 句にエイリアス<tabalias> を定義する必要があります。
SELECT 句で AS オプションを使用して各列 <si> にエイリアス <ai> を指定します。列のエイリアスは実名の代わりに INTO 句および ORDER BY 句で使用されます。これにより、たとえば INTO CORRESPONDING FIELDS OF オプションを使用した場合に列 <s i> のコンテンツを構造のコンポーネント <a i> に読み込むことが可能になります。
列のデータ型は、ABAP ディクショナリの対応する基本ドメインのディクショナリデータ型です。ディクショナリデータ型を簡単に変換できるようにするため、INTO 句で対象項目のデータ型を選択する必要があります。ディクショナリデータ型のテーブルおよびデータ型については、ABAP ディクショナリのデータ型 を参照してください。
データベースの列の集計データを読み込むには、以下の命令を使用します。
SELECT
<
行>
<agg>( [DISTINCT] <s1> ) [AS <a1>]
<agg>(
[DISTINCT] <s2> ) [AS <a2>] ...
where <si> は上記の項目ラベルと同じです。データ型 <agg> は以下の集計機能のいずれかを表しています。
キ MAX: 列 <si> の最大値を戻します。
キ MAX: 列 <si> の最小値を戻します。
キ AVG: 列 <si> の平均値を戻します。
キ SUM: 列 <si> の集計値を戻します。
キ COUNT: 以下のように値や行をカウントします。
キ COUNT( DISTINCT <si> ) 列 <si> 内の異なる値の数を戻します。
キ COUNT( * ) 選択された行の合計数を戻します。
DISTINCT オプションを使用して、重複値を計算から除外することができます。集合式の括弧と引数の間のスペースを省略しないでください。算術演算子 AVG および SUM は数値項目にのみ有効です。
MAX 、MIN 、または SUM を使用する集計機能のデータ型は、対応する列のディクショナリデータ型です。機能 AVG を持つ集計式のディクショナリデータ型は FLTP で、COUNT を持つ集合式のディクショナリデータ型は INT4 です。対象項目には対応するデータ型があります。平均値を計算する場合は ABAP データ型 F の使用が適しています。ただし、データベースシステムでは ABAP に対して異なる概算が使用される場合があります。集計を行う場合は、対象項目が十分な大きさであることを確認します。
ABAP とは異なり、データベースシステムではデータベース項目のヌル値が認識されます。ヌル値とは、項目がコンテンツを持たず、計算に含まれないことを示します。選択するすべての行の対応する項目がヌル値である場合は、計算結果はヌルになります。ABAP では、ヌル値はゼロとみなされます ( 項目のデータ型によります) 。
AS オプションで、各集合式に対して列の代替名称 <ai> を定義することができます。列のエイリアスは実名の代わりに INTO 句および ORDER BY 句で使用します。これは、ORDER BY 句の集合式によりソートを行う唯一の方法です。
SELECT 句の一覧 ( 集合式を除く) に 1 つ以上の項目名が含まれる場合は、それらの項目名は GROUP BY 句の一覧にも含まれている必要があります。その場合は、集計機能はすべての選択行に適用されず、行の個別グループにのみ適用されます。
<cols> は以下のように動的に指定することも可能です。
SELECT < 行> (<itab>) ...
括弧内に空、あるいは <s1> <s2> ... を含む内部テーブル<itab> の名称を入力して、読み込む列または集合式を指定する必要があります。<itab> の行データ型は型 C で、最大長が 72 である必要があります。内部テーブルが空の場合は、すべての列が読み込まれます。

単一行の特定列の読込:
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.
出力結果は次のとおりです。

SELECT
句の
SINGLE
は、一次キー項目 CARRID
および
CONNID
に
WHERE
句で指定された値が含まれているデータベーステーブル SPFLI
から個別エントリが読み込まれることを意味します。SELECT
句に指定された列は、構造 WA
の同一名称のコンポーネントに転送されます。 
複数行の特定列の読込:
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.
出力結果は次のとおりです。

SELECT 句に指定された行がないため、この命令により、WHERE 句の条件を満たすデータベーステーブル SPFLI のすべての行が読み込まれます。SELECT 句に指定された列は、内部テーブル ITAB の同一名称のコンポーネントに転送されます。

複数行の全列の読込:
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.
出力結果は次のとおりです。

SELECT 句に指定された行がないため、この命令により、WHERE 句の条件を満たすデータベーステーブル SPFLI のすべての行が読み込まれます。テーブルのすべての列が、フラット構造 WA の同一名称のコンポーネントに転送されます。このため、SELECT ループを ENDSELECT 命令で完了する必要があります。

集計機能
2 列および 10 行で構成されるデータベーステーブル TEST を想定します。
|
COL_1 |
COL_2 |
|
1 |
3 |
|
2 |
1 |
|
3 |
5 |
|
4 |
7 |
|
5 |
2 |
|
6 |
3 |
|
7 |
1 |
|
8 |
9 |
|
9 |
4 |
|
10 |
3 |
以下のコーディングは、集計機能を示しています。
DATA RESULT TYPE P DECIMALS 2.
SELECT
<agg>( [DISTINCT] COL_2 )
INTO RESULT
FROM TEST.
WRITE RESULT.
以下のテーブルに、集合式 <agg> および DISTINCT オプションの異なる組合せによる、このプログラム抽出の結果を示します。
|
集合式 |
DISTINCT |
結果 |
|
MAX |
なし |
9.00 |
|
MAX |
あり |
9.00 |
|
MIN |
なし |
1.00 |
|
MIN |
あり |
1.00 |
|
AVG |
なし |
3.80 |
|
AVG |
あり |
4.43 |
|
SUM |
なし |
38.00 |
|
SUM |
あり |
31.00 |
|
COUNT |
あり |
7.00 |
|
COUNT( * ) |
--- |
10.00 |

列の動的な指定
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.
出力結果は次のとおりです。

内部テーブル ITAB には、読み込むデータベーステーブル SPFLI の列が含まれます。SELECT 句の DISTINCT オプションは、これらの列に異なるコンテンツが含まれている行だけが読み込まれることを意味します。結果は、可能なルートの一覧となります。