CS Student’s SAP&Tech Journey✨

[SAP] SELECT * / SELECT SINGLE 필드 / SELECT SINGLE * 총정리 본문

SAP/ABAP 문법 | Open SQL

[SAP] SELECT * / SELECT SINGLE 필드 / SELECT SINGLE * 총정리

인포마틱 2025. 2. 8. 02:35

SAP ABAP에서는 Open SQL을 사용하여 데이터베이스에서 직접 데이터를 조회할 수 있습니다. 단일 행 조회(SELECT SINGLE)부터 다중 행 조회(SELECT LOOP, ARRAY FETCH)까지 다양한 방법이 있으며, 이를 효율적으로 활용하면 성능을 최적화할 수 있습니다. 이번 글에서는 Open SQL을 활용한 DB 조회 방식과 성능 최적화 방법을 상세히 살펴보겠습니다.

 

 

인터널 테이블에서 데이터 읽는 방법에 관련된 포스팅 보러가기 ⬇️

 

[ABAP] 인터널 테이블(Internal Table) (3) 테이블에서 데이터 읽기

SAP ABAP에서 데이터를 다룰 때 인터널 테이블(Internal Table, IT)은 필수적인 개념입니다.인터널 테이블은 프로그램 실행 중 메모리에 저장되는 임시 데이터 테이블로, 대량의 데이터를 효과적으로

informatik.tistory.com

 


 

 

ABAP에서는 Open SQL을 사용하여 데이터베이스에서 직접 데이터를 가져올 수 있습니다. Open SQL은 SAP 시스템이 다양한 데이터베이스(예: Oracle, MySQL 등)와 연결될 수 있도록 도와주며, 특정 데이터 조회 시 자동으로 변환되어 실행됩니다. 이를 통해 프로그래머는 복잡한 데이터베이스 명령어를 몰라도 간단한 SQL 문을 작성하여 데이터를 쉽게 조회할 수 있습니다.

📌 다양한 데이터 취득 방법

  1. 함수를 이용한 방법
  2. 클래스를 이용한 방법
  3. BAPI (Business Application Programming Interface)
  4. Logical Database 활용

ABAP에서는 Open SQL을 사용하여 특정 조건을 만족하는 데이터를 가져올 수 있으며, 그중에서 가장 기본적인 형태가 SELECT 문입니다.

 

⭐ SELECT * vs SELECT SINGLE 필드 vs SELECT SINGLE * 차이점

비교 항목 SELECT * SELECT SINGLE 필드 SELECT SINGLE *
조회 대상 테이블의 모든 컬럼 지정된 일부 컬럼만 조회 테이블의 모든 컬럼
조회 개수 여러 개의 행을 가져올 수 있음 조건에 맞는 첫 번째 행의 특정 필드만 가져옴 조건에 맞는 첫 번째 행 전체를 가져옴
성능 불필요한 데이터를 포함할 수 있어 성능 저하 가능 필요한 데이터만 가져오므로 성능이 좋음 SELECT *보다는 덜하지만, 필드가 많으면 성능 저하 가능
용도 여러 개의 레코드를 내부 테이블에 저장할 때 특정한 한 행의 일부 필드만 필요할 때 특정한 한 행의 모든 컬럼이 필요할 때
WHERE 조건 없어도 가능 (모든 행을 가져옴) 반드시 있어야 함 (없으면 의미 없음) 반드시 있어야 함 (없으면 의미 없음)

 

 

1. 단일 데이터 조회 (SELECT SINGLE)

✔️ SELECT SINGLE 문은 특정 키 값을 기반으로 한 개의 데이터를 조회할 때 사용됩니다. 이는 대량 데이터에서 불필요한 검색을 방지하고, 성능을 최적화하는 데 유용합니다.

✔️ SELECT SINGLE은 단일 행 조회를 수행하기 때문에 한 번의 실행으로 한건의 데이터만 가져오고, 여러 데이터를 가져올 수 없습니다.

 

💡 예제 1: 특정 고객의 모든 정보를 조회하기

SELECT SINGLE * 
  FROM SCUSTOM 
  INTO gs_cust 
  WHERE ID = ‘113344’.

이 코드는 주민번호가 113344인 고객의 모든 필드 정보를 gs_cust 구조체에 저장합니다. (스트럭처)

 

💡 예제 2: 특정 고객의 이름만 조회하기

SELECT SINGLE NAME 
  FROM SCUSTOM 
  INTO gv_name 
  WHERE ID = ‘113344’.

이 코드는 주민번호가 113344인 고객의 이름를  gv_name 변수에 저장합니다. (변수)

 

💡 예제 3: 고객 ID를 입력받아 고객 한명의 이름, 이메일, 전화번호를 조회하기

📌 CORRESPONDING FIELDS를 활용하면 필드 순서를 신경 쓰지 않아도 자동 매핑이 이루어집니다.

* 1. 데이터(이름, 이메일, 전화번호) 담을 스트럭처 생성하기
TYPES: BEGIN OF ts_custinfo,
  NAME TYPE S_CUSTNAME,
  EMAIL TYPE S_EMAIL,
  TELEPHONE TYPE S_PHONENO,
END OF ts_custinfo.

* 2. 스트럭처 선언하기
DATA gs_custinfo TYPE ts_custinfo.

* 3. ID 입력받기
PARAMETERS iv_id TYPE S_CUSTNAME.

* 4. 입력받은 ID와 테이블 ID 일치 조건 
SELECT SINGLE NAME EMAIL TELEPHONE " ID는 한건 매칭 SINGLE 사용! "
  FROM SCUSTOM
  INTO CORRESPONDING FIELDS OF gs_custinfo
  WHERE ID = iv_id.

* 5. 스트럭처에 담긴 이름, 이메일, 전화번호 출력하기
WRITE: / gs_custinfo-NAME, gs_custinfo-EMAIL, gs_custinfo-TELEPHONE.

 

 

2. 여러 개의 데이터 조회 (SELECT LOOP vs ARRAY FETCH)

대량의 데이터를 한 번에 가져오는 방법은 세 가지가 있습니다.

 

1️⃣ SELECT LOOP

ENDSELECT를 사용하여 한 건씩 데이터를 가져오는 방식입니다.

💡 예제: 특정 국가에 속한 고객 정보를 한 줄씩 출력하기

* 1. 데이터(이름, 이메일, 전화번호) 담을 스트럭처 생성하기
TYPES: BEGIN OF ts_custinfo, 
  NAME TYPE S_CUSTNAME, 
  EMAIL TYPE S_EMAIL, 
  TELEPHONE TYPE S_PHONENO, 
END OF ts_custinfo.

* 2. 스트럭처 선언하기
DATA gs_cust TYPE ts_custinfo. 

* 3. 나라 입력받기
PARAMETERS iv_conty TYPE S_COUNTRY. 

* 4. 나라는 여러건이므로 SINGLE 없이, 스트럭처 단위로 한건씩 반복하여 출력하기
SELECT NAME EMAIL TELEPHONE 
  FROM SCUSTOM 
  INTO CORRESPONDING FIELDS OF gs_cust " 스트럭처로⭐ "
  WHERE COUNTRY = iv_conty.

  WRITE: / gs_cust-name, gs_cust-email, gs_cust-telephone. 
ENDSELECT.

📌 ENDSELECT는 자동으로 루프를 돌며 데이터를 하나씩 가져오도록 해줍니다.

 

2️⃣ SELECT * FROM 테이블 전체를 가져오는 방식

SELECT * FROM SCUSTOM 
  INTO gs_cust 
  WHERE COUNTRY = iv_conty.

  WRITE: / gs_cust-name, gs_cust-email, gs_cust-telephone. 
ENDSELECT.

➡️ 모든 필드를 가져오는 방식이지만, ENDSELECT 방식에서는 성능 저하 가능성이 있습니다.
따라서 되도록 필요한 필드만 가져오는 1️⃣번 방식이 좋은 방법입니다. 

 

3️⃣ Array Fetch (인터널 테이블 활용)

인터널 테이블을 사용하여 한 번에 모든 데이터를 가져온 후, 필요할 때 루프를 돌며 출력하는 방식입니다.

💡 예제: 특정 국가 고객 정보를 인터널 테이블에 저장 후 출력

TYPES: BEGIN OF ts_custinfo, 
  NAME TYPE S_CUSTNAME, 
  EMAIL TYPE S_EMAIL, 
  TELEPHONE TYPE S_PHONENO, 
END OF ts_custinfo.

DATA gw_cust TYPE ts_custinfo.
DATA gt_cust TYPE STANDARD TABLE OF ts_custinfo 
      WITH NON-UNIQUE KEY email.

PARAMETERS iv_conty TYPE S_COUNTRY.

SELECT NAME EMAIL TELEPHONE 
  FROM SCUSTOM 
  INTO CORRESPONDING FIELDS OF TABLE gt_cust " 테이블로⭐ "
  WHERE COUNTRY = iv_conty.

SORT gt_cust BY name ASCENDING.

LOOP AT gt_cust INTO gw_cust.
  WRITE: / sy-tabix, gw_cust-name, gw_cust-email, gw_cust-telephone.
ENDLOOP.

📌 SORT gt_cust BY name ASCENDING을 추가하면 가져온 데이터를 정렬할 수 있음

 

🎯 헷갈리는 포인트

  • INTO는 한 개의 행을 구조체에 저장하는 경우 사용
  • INTO TABLE은 여러 개의 행을 인터널 테이블에 저장하는 경우 사용

 

 

3. SQL 활용 (GROUP BY, HAVING, WHERE 조건문 활용)

✅ 집계 함수와 그룹화

SELECT carrid connid SUM(seataocc) 
  FROM SFLIGHTS 
  GROUP BY carrid connid.

 

HAVING을 활용한 필터링

SELECT carrid connid SUM(seataocc) 
  FROM SFLIGHTS 
  GROUP BY carrid connid 
  HAVING SUM(seataocc) > 100.

 

WHERE 절의 다양한 조건 활용

SELECT * FROM SPFLI 
  WHERE COUNTRYFR IN (‘DE’, ‘US’).

 

4. 기타 SQL 문법 및 데이터 조작 (INSERT, APPEND 등)

✅ 데이터 삽입

INSERT INTO TABLE_NAME VALUES (‘값1’, ‘값2’, ‘값3’).

 

✅ 기존 데이터 유지하며 추가 (APPEND)

APPENDING TABLE gt_cust.

 

✅ ORDER BY 정렬

SELECT * FROM SPFLI ORDER BY PRIMARY KEY.