ABAP Keyword Documentation → ABAP − Reference → Processing External Data → ABAP Database Access → ABAP SQL → ABAP SQL - Reads
SELECT
Other versions: 7.31 | 7.40 | 7.54
Syntax
SELECT mainquery_clauses 
  [UNION ...] 
  INTO|APPENDING target 
  [UP TO ...] [OFFSET ...] 
  [abap_options]. 
  ... 
[ENDSELECT]. 
Effect
Uses the ABAP SQL statement SELECT as a standalone statement. This statement reads data from one or more
database tables ,
classic views,  or non-abstract
CDS entities, uses this data to create a multiple row or a single row results set, and assigns this results set to suitable ABAP data objects.
The additions mainquery_clauses
define which data can be read from the database in which form. The language element 
UNION can be used to combine the results sets of multiple queries. In
this case, special rules query_clauses apply for specifying clauses. Finally, the following properties are defined:
- 
ABAP target objects
INTO clause after 
INTO or APPENDING, the target data objects are specified, to which the results set is assigned by row or by package.
- 
Restricting the Results Set
UP TO, OFFSET determine the number of rows to read.
- 
ABAP-specific additions
abap_options define whether
table buffering is bypassed and define the database connection.
In the following cases, the statement SELECT opens a loop that must be closed using ENDSELECT.
- 
If an assignment is made to a non-table-like target range (meaning a SELECTstatement without the additionINTO|APPENDING ... TABLE), a loop closed byENDSELECTalways occurs, except in the following instances:
- The addition SINGLEfor reading a single row is specified behindSELECT
- The columns of the results set are specified statically in the SELECTlist, they contain only aggregate functions, and the additions GROUP BY andUNIONare not specified.
- 
If an assignment is made to a table-like target range (meaning a SELECTstatement with the additionINTO|APPENDING ... TABLE), a loop closed byENDSELECToccurs whenever the additionPACKAGE SIZEis used.
In each loop iteration, the SELECT statement assigns a row or a packet of
rows to the data objects specified in target. If the last row has been assigned or the results set is empty, SELECT jumps to ENDSELECT. A
database cursor is
opened implicitly to process a SELECT loop, and is closed again when the loop has ended. In a single program, a maximum of 17 database cursors can be open simultaneously across the
ABAP SQL interface.
If more than 17 database cursors are opened, the runtime error DBSQL_TOO_MANY_OPEN_CURSOR occurs. A SELECT loop can be exited using the statements in the section
Exiting Loops. If the total results set is passed to
the data object in a single step, a loop is not opened and the statement ENDSELECT cannot be specified.
The INTO clause introduced using INTO|APPENDING must be specified as the final clause of the SELECT
statement and the optional additions UP
TO, OFFSET, and 
abap_options must be specified after the INTO clause.  
System Fields
| sy-subrc | Meaning | 
|---|---|
| 0 | In each value passing to an ABAP data object, the statement SELECTsetssy-subrcto 0. In addition,SELECTsetssy-subrcto 0 before aSELECTloop is exited usingENDSELECT, if at least one row is passed in the loop. | 
| 4 | The statement SELECTsetssy-subrcto 4 if the results set is empty. This means that no data is found on the database in most cases. Special rules apply when onlyaggregate expressionsspecified as columns are used in theSELECTlist of theSELECTclause. | 
| 8 | The statement SELECTsetssy-subrcto 8 if the additionFOR UPDATEis used inresult, and theprimary key is not fully specified afterWHERE. | 
After each value that is passed to an ABAP data object, the statement SELECT
sets sy-dbcnt to the number of rows passed. If an overflow occurs because
the number or rows is greater than 2,147,483,647, sy-dbcnt is set to -1.
If the results set is empty, sy-dbcnt is set to 0.  As with sy-subrc, special rules apply if only
aggregate expressions
specified in columns are used in the 
SELECT list of the SELECT clause.  
Notes
- 
The query formulated in the SELECTstatement is implemented in the database interface for the programming interface of the database system and is passed to this system. The data is read in packets from the database and is transported from the database server to the current AS ABAP. On AS ABAP, the data is passed to the data objects of the ABAP program in accordance with the settings specified in the INTO andAPPENDINGadditions.
- 
SELECTloops can be nested. For performance reasons, it may be more efficient to use a join or a subquery.
- 
As well as explicit ABAP SQL reads using SELECTloops andOPEN CURSOR, the ABAP SQL interface also opens database cursors implicitly, such as when loading buffered tables. The runtime error DBSQL_TOO_MANY_OPEN_CURSOR can be avoided by not using explicit reads to exploit the maximum number of open database cursors.
- 
Within a SELECTloop, no statements that produce a database commit or database rollback can be used, causing the corresponding database cursor to be closed as a result.
- 
If change accesses are performed on the data sources
read by a SELECTloop within the loop, the behavior is database-specific and undefined. Avoid this kind of access if possible.
- 
The statement ENDSELECTcloses all the reader streams which are associated with theSELECTloop.
- 
The current isolation level is responsible for determining whether a SELECTstatement accesses only data released by a database commit or whether it also accesses unreleased data in a different database LUW.
- 
 For compatibility reasons, the INTOclause can also be specified in front of or after theFROMclause outside the syntax check strict mode from Release 7.50. The additionsUP TO,OFFSET, andabap_optionscan then be placed in front of or after theFROMclause.
- 
The INTOclause as last clause of theSELECTstatement leads to the strict mode as of Release 7.40, SP08.
- 
An obsolete short form can be used (not in classes),
for which the target area does not need to be specified using INTOor APPENDING. The preconditions here are as follows: all columns are read with*, a single database table or a single classic view is specified statically afterFROM, and a table work area data_source is declared using the statementTABLESfor the corresponding database table or classic view . In this case, the system adds the additionINTO sourceto theSELECTimplicitly.
Example
The example shows two SELECT statements that differ only in the arrangement
of their SELECT and 
FROM clauses. The result of the two statements, which access two database tables via an INNER JOIN, is identical.
DATA cityfrom TYPE spfli-cityfrom VALUE 'NEW YORK'. 
SELECT c~carrname, p~connid, p~cityfrom, p~cityto 
       FROM scarr AS c 
            INNER JOIN spfli AS p 
                  ON c~carrid = p~carrid 
       WHERE p~cityfrom = @cityfrom 
       ORDER BY c~carrname, p~connid, p~cityfrom, p~cityto 
       INTO TABLE @DATA(result1) 
       UP TO 10 ROWS. 
SELECT FROM scarr AS c 
            INNER JOIN spfli AS p 
                  ON c~carrid = p~carrid 
       FIELDS c~carrname, p~connid, p~cityfrom, p~cityto 
       WHERE p~cityfrom = @cityfrom 
       ORDER BY c~carrname, p~connid, p~cityfrom, p~cityto 
       INTO TABLE @DATA(result2) 
       UP TO 10 ROWS. 
ASSERT result2 = result1. 
cl_demo_output=>display( result1 ).