본문 바로가기

Easy Abap 2.0

[3주차] Chapter 3 OPEN SQL & NATIVE SQL PART2

1. OPEN SQL Overview

 

  • OPEN SQL은 R/3 시스템에서 사용되며 데이터베이스 데이터를 조회하고 변경하는 등의 기능을 수행한다.
  • 데이터베이스 시스템(Oracle, MSSQL 등)에 관계없이 SQL결과와 Error Message가 반환된다.
  • ABAP Dictionary에서 생성된 테이블, 뷰에만 적용되며, Cluster, Pooled 테이블에서 제한된 기능만 수행가능.
  • OPEN SQL은 기본적으로 클라이언트에 종속적이다.

<OPEN SQL 명령어>

Keyword 기능
SELECT 데이터베이스 테이블에서 데이터를 읽음
INSERT 데이터베이스 테이블에서 데이터를 추가함
UPDATE 데이터베이스 테이블의 값을 변경함
MODIFY INSERT+ UPDATE의 기능을 수행함

UPDATE : 동일한 KEY 값이 있는 경우
INSERT : 동일한 KEY 값이 존재하지 않는 경우
DELETE 데이터베이스 테이블의 값을 삭제함

 

2. OPEN SQL : 데이터 읽기

 

<Reading Data 명령어>

 

구문 기능
SELECT <result> SELECT구문은 조회하고자 하는
테이블 필드명을 나열할 수 있으며,
한 건 또는 여러 라인을 조회할 수 있음.
INTO <target> SELECT에서 읽어온 데이터를 변수에 저장하며,
이 변수를 ABAP 프로그램에서 사용함.
FROM <source> FROM 구문은 SELECT 할 테이블을 지정해준다.
위치는 INTO 이전/이후 모두 둘 수 있다.
WHERE <cond> 조회하고자 하는 데이터의 조건을 추가할 수 있다.
GROUP BY <fields> 여러 라인의 결과를 그룹으로 지정하여
하나의 결과를 얻을 수 있다.
예를 들어, 그룹별 합계를 구할 경우 GROUP BY 를 사용
HAVING <cond> HAVING은 GROUP의 조건을 설정하는 WHERE 구문이다.
ORDER BY <fields> 조회된 데이터를 정렬한다.

 

2.1) SELECT 구문

 

① SIngle Line

 

Single 구문을 사용하면 데이터를 한 건만 가져오기 때문에 원하는 데이터의 조건을 정확하게 알고 있어야 한다.

즉, WHERE 조건에 유일한 Key값이 추가되어야 하는 데 만약에 WHERE 구문이 잘못되어 여러 개의 라인을 
읽어오면 임의의 라인을 반환한다.

더보기

SELECT SINGLE <cols> ...WHERE

② Several Lines

 

여러 라인을 조회할 떄는 SELECT 결과가 내부 테이블에 저장된다.

이것을 ABAP에서는 인터널 테이블(ABAP 메모리에 생성되는 데이터를 저장할 수 있는 가상의 테이블)이라 부른다.

DISTINCT를 사용하게 되면, 중복된 값을 제외한다.

더보기

SELECT [DISTINCT] <cols>...WHERE

INTO 구문의 결과가 저장되는 곳이 인터널 테이블이 아니라 필드 또는 Work Area(구조체)일 때에는

마지막에 ENDSELECT를 사용하여야한다.

아래 구문은 하나의 값을 읽어서 구조에 삽입하고, 조건에 해당하는 값을 모두 읽어 올 때 까지 LOOP를 수행한다.

더보기

SELECT [DISTINCT] <cols>...WHERE...

...

ENDSELECT.

③ AS(Alias)

AS 구문을 사용하여, 칼럼 명에 별명을 지정할 수 있다.

 

④ 동적인 SELECT 구문

 

SELECT 구문의 칼럼을 동적으로 선언할 수 있다.

동적 구문을 저장하는 구조체는 최대 72자까지 가능하면 CHAR 타입이어야 한다.

 

2.2) INTO 구문

 

SELECT구문에서 조회한 결과값을 변수(Target Area)에 저장하는 기능을 수행한다.

 

① 구조체(Work Area)

 

여러 칼럼의 한 라인만 조회하고자 할 경우에는 Work Area(변수, 구조체)에 값을 할당한다.

CORRESPONDING FIELDS OF 구문을 사용하면 한 번에 Work area의 동일 필드명에 값을 할당한다.

 

② Internal Table

 

여러 라인을 조회할 경우에는 인터널 테이블을 사용한다.

APPENDING은 인터널 테이블에 추가로 INSERT하고,

INTO는 인터널 테이블의 데이터를 삭제한 다음 INSERT 한다.

PACKAGE SIZE는 인터널 테이블에 몇 개의 라인을 추가할 것인가를 설정한다.
만약 PACKAGE SIZE 5라고 설정하면 5개의 값을 여러 번 읽어와 인터널 테이블에 추가하게 된다.

이 경우에는 ENDSELECT 구문을 반드시 사용해야 한다. 

더보기

SELECT...INTO | APPENDING [CORRESPONDING FIELDS OF]TABLE <itab> [PACKAGE SIZE <n>]...


예시) SELECT INTO CORRESPONDING FIELDS OF TABLE itab
         PACKAGE SIZE 5
         FROM SPFLI.
         ENDSELECT.

③ SIngle Field

 

테이블의 개별 칼럼을 조회하거나 Aggregate(집계) 함수를 사용할 떄에는 아래 구문과 같이 사용해야한다.

더보기

SELECT...INTO (f1, f2,...)...

INTO 구문 다음에 두 개 이상의 Target이 필요한 경우에는 괄호와 변수명을 붙여써야한다.

공백이 존재하면 Syntax Error가 발생한다.

더보기

SELECT carrid connid INTO (gv_carri,gv_connid) FROM sflight.

2.3) FROM 구문

 

FROM 구문은 데이터를 SELECT 할 대상 테이블(또는 뷰)을 지정한다.

FROM 구문 다음에는 하나의 테이블을 지정하거나 여러 개의 테이블을 JOIN 할 수 있다.

Alias를 사용하여 테이블 명에 별명을 붙일 수 있으며, 테이블 이름을 동적으로 선언할 수 있다.

FROM 구문은 Table을 정의하는 부분과 데이터베이스 접근을 컨트롤하는 부분(option)으로 나누어진다.

 

구문 설명
CLIENT SPECIFIED 자동 client 설정을 해제한다.
BYPASSING BUFFER SAP Local Buffer에서 값을 읽지 않는다.
테이블이 Buffering이 설정되어 있더라도 바로 데이터베이스
테이블에서 SELECT를 수행한다.
UP TO n ROWS SELECT의 row 개수를 제한한다.
조회 조건에 날짜를 입력하지 않는 것과 같은
사용자 실수로 대량의 데이터를 요청할 때
데이터베이스 성능 저하를 예방할 수 있다.

 

① 정적인 TABLE 선택

 

하나의 테이블을 정적으로 선언할 때 사용한다.

Alias를 사용할 수 있으며 이 경우에는 테이블 명을 SELECT 구문에서 사용할 수 없다.

더보기

SELECT... FROM <dbtab> [AS <alias>] <options>

 

② 동적인 TABLE 선택

 

테이블 이름을 동적으로 선언하여 사용할 수 있다.

이 때 테이블 이름은 반드시 대문자로 지정해야하며, ABAP Dictionary에 존재하는 이름이어야한다.

 

③ JOIN 구문

 

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

일반적으로 Primary Key(PK)와 Foreign Key(FK)를 사용하여 JOIN하는 경우가 대부분이지만
떄로는 논리적인 값들의 연관으로 JOIN 하는 경우도 있다.

두 테이블 간의 연결 조건은 ON 구문을 사용하고 JOIN에 사용되는 필드가 인덱스에 존재할 때
빠른 성능이 보장된다.

더보기

SELECT ...FROM <tab> [INNER] JOIN <dbtab> [AS <alias>] ON <cond> <options>...

④ INNER JOIN과 OUTER JOIN

 

JOIN 종류에는 크게  (INNER) JOIN과 OUTER JOIN 두 가지가 있으며
OUTER JOIN은 INNER JOIN 하고 다른 것을 추가로 보여주려면 필요하다
ABAP OPEN SQL에서는 LEFT OUTER JOIN만 사용할 수 있다.

이것은 JOIN 연결의 왼쪽에 있는 데이터를 기준으로 SELECT 결과가 도출된다.

 

⑤ LIne 수 제한

 

아래 구문을 이용하여 테이블에서 읽어오는 라인 수를 제한한다.

더보기

SELECT... FROM <tab> UP TO <n> ROWS...

이 Line 수 제한은 보통 리포트 프로그램의 조회 조건인 SELECTION SCREEN에서 최대 적중 수를 제한하는 목적으로 
많이 사용된다.

 

2.4) WHERE 구문

 

WHERE 조건은 SELECT 적중 수를 줄여 주고 사용자가 원하는 데이터를 정확하게 선택할 수 있도록 하는 조건이다.

WHERE 조건에 사용되는 필드가 인덱스에서 사용될 때 빠른 성능을 보장한다.

UPDATE, DELETE와 같은 명령어에도 사용된다.

 

<WHERE 구문에 사용되는 연산자>

 

연산자 의미
EQ 같음
= 같음
NE 같지 않음
<> 같지 않음
>< 같지 않으
LT (Less Than) 보다 작음
< 보다 작음
LE 작거나 같음
<= 작거나 같음
GT 보다 큼
> 보다 큼
GE 크거나 같음
>= 크거나 같음

 

① Interval 조건

 

조건에 범위 값을 사용해야할 때 사용된다.

 

② String 비교

 

문자열을 비교할 때는 LIKE 구문을 사용한다.

만약 ABC로 시작하는 조건을 추가하게 된다면

SELECT~WHERE COL2 LIKE 'ABC%'. 이런 식으로 지정해준다.

 

③ LIST VALUE

 

IN 구문을 사용하여, 여러 조건에 속한 경우의 값을 가져온다.
예를 들면, '서울' ,'수원'에 거주하는 사람을 경우
WHERE 거주지 IN('서울','수원')과 같이 사용한다.

 

④ SELECTION TABLE

 

IN 구문을 사용하여 Selection Table, Range 변수에 존재하는 값들을 조회할 수 있다.

Selection Table, Range 변수는 인터널 테이블과 유사하게 여러 Row를 저장할 수 있는 변수이다.

 

⑤ DYNAMIC 조건(동적 조건)

 

SELECT 구문의 조건을 설정하는 WHERE 구문을 동적으로 구성할 수 있다.

 

⑥ FOR ALL ENTRIES 구문

 

FOR ALL ENTRIES 구문은 인터널 테이블과 데이터베이스의 테이블을 JOIN 하는 개념과 유사하며,
이것도 LOOP를 수행하면서 SQL을 수행한다.
데이터베이스 테이블간의 JOIN보다는 비효율적이지만 ABAP 언어에서 많은 경우에 유용하게 활용된다.

더보기

SELECT ...FOR ALL ENTRIES IN <itab> WHERE <cond>

 

2.5) GROUPING 구문

 

Aggregate(집계) 함수를 사용하려면 SELECT 구문에 GROUP BY를 기술해야 한다.

GROUP BY 구문은 테이블의 특정 칼럼에 같은 값들이 존재할 

 

2.6) GROUPING 조건 : HAVING

 

HAVING 구문은 GROUP BY로 조회한 SELECT 구문에 그룹의 조건을 추가한다.

WHERE 조건에서처럼 동적 선언이 가능하다.

 

2.7) SORT 구문

 

SELECT 결과로 조회된 데이터가 ORDER BY에 기술된 칼럼 기준으로 정력된다.
ORDER BY를 사용하지 않으면, 임의로 정렬된 결과가 조회된다.

더보기

 ORDER BY PRIMARY KEY

  • 테이블의 KEY에 의해 정렬된다.
  • SELECT * 구문인 경우에만 사용할 수 있다.
  • JOIN 구문 및 VIEW에는 사용할 수 없다.

ORDER BY 구문에서는 AVG ( paymentsum ) 와 같은 Aggregate 함수를 사용할 수 없어서

SELECT 구문에서 as 명령어를 이용하여 'paymentsum' 과 같은 Alias 설정이 필요하다.

 

2.8) Subquery

 

서브쿼리는 SELECT 구문의 WHERE 조건에 또 다른 SELECT 구문을 추가하여 값을 제한하는 목적으로 사용된다.

 

① Scalar(스칼라) 서브쿼리

 

서브쿼리를 이용해 특별한 조건을 WHERE 구문에 추가할 수 있다.

Subquery의 SELECT 구문에는 칼럼 하나만 선언할 수 있다.

 

스칼라 서브쿼리의 정의

 

SELECT 절 안에 기술된 SELECT 절로 정의된다.

즉, 하나의 행으로부터 하나의 칼럼 값(또는 Aggregate 함수)을 반환하는 Subquery로서,
JOIN 구문과 유사한 역할을 수행한다.

 

스칼라 서브쿼리의 이해

 

1) Scalar subquery는 반드시 한 칼럼만을 반환해야 한다. 

2) Scalar subquery는 Nested Loop 방식으로 처리된다

3) Scalar subquery는 실행되는 횟수는 Row 수이다.  

4) 반복되는 코드나 마스터 유형의 테이블을 조회하는 경우 사용하면 효율적이다.. 

 

② Non-scalar Subquery

 

Subquery의 결과가 존재하면 TRUE를 반환하며, 존재하지 않으면 FALSE를 반환한다.

EXISTS 구문을 이용하여 구현한다.