CS Student’s SAP&Tech Journey✨
[SAP] SELECT * / SELECT SINGLE 필드 / SELECT SINGLE * 총정리 본문
[SAP] SELECT * / SELECT SINGLE 필드 / SELECT SINGLE * 총정리
인포마틱 2025. 2. 8. 02:35SAP 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 문을 작성하여 데이터를 쉽게 조회할 수 있습니다.
📌 다양한 데이터 취득 방법
- 함수를 이용한 방법
- 클래스를 이용한 방법
- BAPI (Business Application Programming Interface)
- 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.
'SAP > ABAP 문법 | Open SQL' 카테고리의 다른 글
[SAP] OPEN SQL 데이터 삽입 / 수정 / 삭제 / 트랜잭션 처리 (0) | 2025.03.28 |
---|---|
[SAP] 집계 함수(Aggregate Function) - MIN, MAX, SUM, COUNT, GROUP BY, HAVING (0) | 2025.02.14 |
[SAP] SELECT SINGLE과 SELECT의 차이 / 변수 접두사 정의하기 (0) | 2025.01.31 |
[SAP] 시스템 변수 SY-XXXX 한눈에 정리하기 (0) | 2025.01.30 |
[SAP] 반복문 DO, WHILE (0) | 2025.01.30 |