[SAP] DB Table_SELECT

이안·2024년 2월 19일

SAP

목록 보기
12/30
post-thumbnail

SELECT : 데이터베이스 테이블에서 데이터를 읽음

SELECT *(FIELD) "조회하고자하는 테이블 필드명 나열 / *기호 사용은 전체칼럼 조회(비효율적)
	FORM SOURCE "조회할 테이블을 지정 / 위치는 INTO 앞뒤로 다 가능
	INTO TARGET "조회에서 읽어온 데이터를 변수에 저장
	WHERE CONDITION. "조회하고자 하는 데이터의 조건

1. SELECT FIELD

1) SINGLE FIELD

  • 데이터베이스에서 하나의 라인 값을 읽어오고자 할 경우 사용.
  • 데이터를 한 건만 가져오기 때문에 데이터의 조건을 정확히 알고 사용.
  • WHERE 조건이 잘못되어 여러 개의 라인을 읽어오면 임의의 라인 반환.
SELECT SINGLE CARRNAME FROM SCARR INTO L_CARRNAME WHERE CARRID = 'AA'.

2) SEVERAL LINES

  • 데이터베이스에서 여러 라인을 조회
SELECT CARRNAME FROM SCARR INTO TABLE GT_SCARR WHERE CARRID = 'AA'.

2. FROM

  • 데이터를 조회할 대상 테이블 (또는 뷰) 지정.
  • 하나의 테이블을 지정하거나 여러 개의 테이블을 JOIN가능.
  • Alias를 사용하여 테이블 명에 별명을 붙일 수도 있음. ex) SCARR AS A

3. INTO

1) 구조체(WORK AREA)

  • 여러 칼럼의 한 라인만 조회할 경우 WORK AREA에 할당.
  • CORRESPONDING FIELDS OF 구문을 사용하면 동일 필드명에 값 할당
DATA : BEGIN OF GS_SCARR,
 	CARRID LIKE SCARR-CARRID,
	CARRNAME LIKE SCARR-CARRNAME,
END OF GS_CARR.
DATA : GT_SCARR LIKE TABLE OF GS_SCARR.

* SELECT ~ ENDSELECT 구문이 반복 수행될 때마다
* Application Server와 Database간의 인터페이스 수행
SELECT CARRID CARRNAME INTO GS_SCARR FORM SCARR WHERE CARRID = 'AA'.
	WRITE :/ GS_SCARR-CARRID, GS_SCARR-CARRNAME.
ENDSELECT.

* WHERE 조건을 통한 SELECT Single Line
SELECT SINGLE CARRID CARRNAME INTO ( GS_SCARR-CARRID, GS_SCARR-CARRNAME )
"INTO구문 뒤 두 개 이상의 TARGET 작성시 괄호 필수
			 				  FORM SCARR
			                  WHERE CARRID = 'AA'.
WRITE :/ GS_SCARR-CARRID, GS_SCARR-CARRNAME.

2) INTERNAL TABLE

여러 라인을 조회할 경우 인터널테이블 사용

  • INTO
SELECT CARRID CARRNAME FROM SCARR 
					   INTO TABLE GT_SCARR "순서대로 인터널테이블에 넣기
					   WHERE CARRID = 'AA'.
LOOP AT GT_SCARR INTO GS_SCARR.
	WRITE :/ GS_SCARR-CARRID, GS_SCARR-CARRNAME.
ENDLOOP.
  • INTO CORRESPONDING FIELDS OF TABLE
SELECT CARRID CARRNAME FROM SCARR 
		INTO CORRESPONDING FIELDS OF TABLE GT_SCARR "순서상관없이 필드명에 맞게 넣기
		WHERE CARRID = 'AA'.
LOOP AT GT_SCARR INTO GS_SCARR.
	WRITE :/ GS_SCARR-CARRID, GS_SCARR-CARRNAME.
ENDLOOP.
  • SELECT후 다른조건의 데이터도 추가하고싶다면?
  • INTO -> 인터널테이블의 데이터를 삭제한 후 INSERT
* 1차 SELECT (INTO)
SELECT CARRID CARRNAME FROM SCARR 
		INTO CORRESPONDING FIELDS OF TABLE GT_SCARR 
		WHERE CARRID = 'AA'.
* 2차 SELECT (APPENDING)
SELECT CARRID CARRNAME FROM SCARR 
		APPENDING CORRESPONDING FIELDS OF TABLE GT_SCARR
		WHERE CARRID = 'AB'.

4. WHERE

  • 조회하고자 하는 데이터의 조건
  • SELECT 적중 수를 줄여주고 사용자가 원하는 데이터를 정확하게 선택할 수 있도록 하는 조건
  • WHERE 조건에 사용 되는 필드가 인덱스에서 사용될 때 속도 향상 (UPDATE, DELETE에서도 같은 명령어 조건 사용)

1) 연산자

  • EQ(=)
  • NE(<>)
  • LT(<)
  • LE(≤)
  • GT(>)
  • GE(≥)

2) BETWEEN A AND B : INTERVAL 조건

SELECT * FROM TABLE WHERE FIELD BETWEEN A AND B.

SELECT CARRID CARRNAME FROM SCARR 
		INTO CORRESPONDING FIELDS OF TABLE GT_SCARR 
		WHERE CARRID BETWEEN 'AA' AND 'AB'.

3) STRING 비교 : 문자열 비교할 시 LIKE 구문 사용

SELECT * FROM TABLE WHERE FIELD LIKE 'A%'.

SELECT CARRID CARRNAME FROM SCARR 
		INTO CORRESPONDING FIELDS OF TABLE GT_SCARR 
		WHERE CARRID LIKE 'A%'.

4) LIST VALUE : IN구문을 사용하여 여러 조건에 속한 경우의 값을 가져옴

SELECT * FROM TABLE WHERE FIELD IN 조건.

SELECT CARRID CARRNAME FROM SCARR 
		INTO CORRESPONDING FIELDS OF TABLE GT_SCARR 
		WHERE CARRID IN ( 'AA' , 'AC' ).

5. RANGE TABLE

1) 선언

RANGES GR_NAME FOR TYPE FEFERENCE. "선언

DATA : BEGIN OF GR_NAME OCCURS 0, "자동으로 생성 -> 직접 적지않음
	SIGN TYPE DDSIGN,
	OPTION TYPE DDOPTION,
	LOW LIKE TYPE Reference,
	HIGH LIKE TYPE Reference,
END OF GR_NAME.

2) 구조

  • SIGN : 저장한 값을 포함할지 제외할지 결정하는 지시자
    • I (INCLUDE) : 포함
    • E (EXCLUDE) : 제외
  • OPTION : 주어진 값에 대한 조건을 지정
    • EQ : 같음
    • BT : BETWEEN … AND …
    • LE, GE, NE … 등 연산자
  • LOW, HIGH : 참조한 변수와 같은 유형으로 선언
RANGES GT_SCARR FOR SCARR-CARRID.

DATA : BEGIN OF GS_SCARR,
	ZCHECK TYPE C,
 	CARRID LIKE SCARR-CARRID,
	CARRNAME LIKE SCARR-CARRNAME,
END OF GS_CARR.
DATA : GT_SCARR LIKE TABLE OF GS_SCARR.

GR_SCARR-SIGN = 'I'.
GR_SCARR-OPTION = 'EQ'.
GR_SCARR-LOW = 'AA'.
APPEND GR_SCARR.

GR_SCARR-LOW = 'AC'.
APPEND GR_SCARR.

SELECT CARRID CARRNAME FROM SCARR 
		INTO CORRESPONDING FIELDS OF TABLE GT_SCARR 
		WHERE CARRID IN GR_SCARR. "IN ( 'AA', 'AC') 와 같은 결과 값 출력

6. GROUPING

Aggregate함수를 사용하려면 SELECT구문에 GROUP BY를 기술

  • AVG : 평균
  • COUNT : 개수
  • MAX : 최대값
  • MIN : 최소값
  • STDDEV : 표준편차
  • SUM : 합계
  • VARIANCE : 분산
DATA : BEGIN OF GS_SFLIGHT,
	CARRID TYPE SPLIGHT-CARRID,
	CONNID TYPE SPLIGHT-CONNID,
	GV_SUM TYPE I,
END OF GS_SPLIGHT.
DATA : GT_SFLIGHT LIKE TABLE OF GS_SFLIGHT.

SELECT CARRID CONNID AVG( PRICE ) AS GV_SUM
				INTO CORRESPONDING FIELDS OF TABLE GT_SFLIGHT
				FROM SFLIGHT GROUP BY CARRID CONNID.

7. HAVING

GROUP BY로 조회한 SELECT 구문에 그룹의 조건 추가

SELECT CARRID CONNID AVG( PRICE ) AS GV_SUM
				INTO CORRESPONDING FIELDS OF TABLE GT_SFLIGHT
				FROM SFLIGHT GROUP BY CARRID CONNID
				HAVING AVG( PRICE ) > 1000.

8. ORDER BY

SELECT 결과로 조회된 데이터가 ORDER BY에 기술된 칼럼 기준으로 정렬

SELECT CARRID CONNID AVG( PRICE ) AS GV_SUM
				INTO CORRESPONDING FIELDS OF TABLE GT_SFLIGHT
				FROM SFLIGHT GROUP BY CARRID CONNID
				HAVING AVG( PRICE ) > 1000
				ORDER BY CARRID. "CARRID를 기준으로 오름차순

9. SUBQUERY

SUBQUERY는 SELECT구문의 WHERE조건에 또 다른 SELECT구문을 추가하여 값을 제한

SELECT CARRID CARRNAME FROM SFLIGHT
		INTO CORRESPONDING FIELDS OF TABLE GT_SFLIGHT
		WHERE CARRID IN ( SELECT CARRID 
						  FROM SPFLI 
						  WHERE CARRID = SFLIGHT~CARRID
						  AND CONNIF = SFLIGHT~CONNID )
					 AND CARRID = 'AA' AND CONNID LIKE '00%'.

10. JOIN

관계형 데이터베이스에서 여러 개의 테이블 값을 동시에 읽어올 경우 JOIN을 사용

두 테이블 간의 연결 조건은 ON을 사용

1) INNER JOIN : 교집합

SELECT FIELD1 FROM TABLE1 
			  INNER JOIN TABLE2 AS ALIAS1
			  ON [COND] [OPTIONS].
SELECT A~CARRID "가져오는 필드가 어느 테이블것인지 지정
			 A~CONNID
			 B~CARRNAME
			 INTO CORRESPONDING FIELDS OF TABLE GT_SFLIGHT
			 FROM SFLIGHT AS A "별칭 지정
			 INNER JOIN SCARR AS B
			 ON A~CARRID = B~CARRID WHERE A~CARRID = 'AA. "WHERE와 ON이 함께있으면 WHERE 먼저

2) OUTER JOIN : 합집합

SELECT FIELD1 FROM TABLE1 
			  OUTER JOIN TABLE2 AS ALIAS1
			  ON [COND] [OPTIONS].
SELECT A~CARRID "가져오는 필드가 어느 테이블것인지 지정
			 A~CONNID
			 B~CARRNAME
			 INTO CORRESPONDING FIELDS OF TABLE GT_SFLIGHT
			 FROM SFLIGHT AS A "별칭 지정
			 LEFT OUTER JOIN SCARR AS B
			 ON A~CARRID = B~CARRID WHERE A~CARRID = 'AA. "WHERE와 ON이 함께있으면 WHERE 먼저

11. FOR ALL ENTRIES 구문

인터널테이블과 데이터베이스의 테이블을 JOIN하는 개념과 유사.

즉, DB테이블에서 먼저 데이터를 SELECT한 후 그 결과의 데이터 내에서 다시 한번 조회가 필요할 시 사용

SELECT FIELD1 FROM TABLE1 INTO TABLE ITAB1
						  FOR ALL ENTRIES IN ITAB2 WHERE [COND].

SELECT CARRID CONNID FORM SPFLI
					 INTO CORRESPONDING FIELDS OF TABLE GT_SPFLI
					 WHERE CARRID LIKE 'A%'.

SELECT CARRID CONNID FLDATE PRICE FORM SFLIGHT
								  INTO CORRESPONDING FIELDS OF TABLE GT_SFLIGHT
								  FOR ALL ENTRIES IN GT_SPFLI
								  WHERE CARRID = GT_SPFLI-CARRID
								  AND CONNID = GT_SPFLI-CONNID.

특징

  • ITAB의 칼럼과 비교대상 테이블의 칼럼 타입은 같아야한다.
  • LIKE, BETWEEN, IN과 같은 비교구문은 사용할 수 없다.
  • ITAB이 NULL이면 모든 데이터를 읽는다.
  • UNIQUE KEY 기준시 ITAB의 중복된 값은 하나만 남는다.
SELECT CARRID CONNID FORM SPFLI
					 INTO CORRESPONDING FIELDS OF TABLE GT_SPFLI
					 WHERE CARRID LIKE 'A%'.
IF GT_SPFLI IS NOT INITIAL. "GT_SPFLI가 NULL이면 FULL SCAN으로 MEMORY DUMP
	SELECT CARRID CONNID FLDATE PRICE FORM SFLIGHT
									  INTO CORRESPONDING FIELDS OF TABLE GT_SFLIGHT
									  FOR ALL ENTRIES IN GT_SPFLI
									  WHERE CARRID = GT_SPFLI-CARRID "LIKE, BETWEEN, IN 불가능
									  AND CONNID = GT_SPFLI-CONNID.
ENDIF.

0개의 댓글