본문 바로가기

SQLD · DB

[ SQLD ] 계층형 질의, 집합 연산자 240819

개념적 데이터 모델링을 ERD 로 나타낸다. ERD ( Entity Relationship Diagram / 개체 관계도 ) 에서의 엔터티 또는 관계는 논리적 모델링 단계에서 테이블 ( 릴레이션 ) 로 표현할 수 있다. 실무에서는 개념적 데이터 모델링과 논리적 데이터 모델링의 구분이 보편적으로 없고, 엔터티라고 하는 것은 논리적 모델링에서의 테이블을 의미한다.

 

( 하나의 ) 테이블을 기준으로 계층형 데이터를 나타낼 수 있다면 ( 생성할 수 있다면 ), 여기서 계층형 데이터란 예를 들어 직원 테이블에는 기본적으로 직원의 정보를 담고 있다. 모두 회사의 직원이지만 직급 ( 계급 ) 이 존재할 경우 한 명의 회장 [ 한 명의 직원 ] 이 여러 명의 관리자 [ 여러 명의 직원 ] 를 관리할 수 있고, 한 명의 관리자 [ 한 명의 직원 ] 가 여러 명의 직원 [ 여러 명의 직원 ] 을 관리할 수 있다. 직원이 직원을 관리하는 형상이 마치 나무가지가 여러 개 뻗쳐 있는 나무와 같다 [ 왼쪽에 있는 그림 참고 ]

( 하나의 ) 테이블을 기준으로 행 ( 레코드 / 인스턴스 ) 과의 관계에 있어 단방향 관계를 나타낼 수 있을 경우 순환 관계라 할 수 있고, 순환 관계인 테이블을 계층형 구조로 나타낼 수 있다. 

계층형 구조인 계층형 데이터는 계층형 질의를 통해 보다 효율적으로 접근할 수 있다.

 

 

계층형 질의에는 2가지 방향이 존재한다. 순방향 과 역방향 이다.

그래서 계층형 질의를 할 때는 순방향 인지 역방향 전개인지에 대한 정보를 포함해야 한다.

 

계층형 질의 방향: 어디서부터 시작할건지 ( 시작 조건 지정 ) START WITH 키워드와 함께 작성해준다. 

예를 들어 START WITH MGR IS NULL 일 경우 MGR 컬럼에 대응하는 값이 NULL 인 행부터 시작한다는 것이다.

시작점은 MGR 컬럼에 대응하는 데이터의 값이 NULL 인 곳에서

어떤 방향으로 전개할 것인지에 대한 정보도 작성해야 하는데 ( 다음에 전개될 방향 지정 ) CONNECT BY 키워드와 함께 작성해준다.

 

 

순방향 계층형 질의시 START WITH 시작점이 여러 곳일 경우

 

SYS_CONNECT_BY_PATH 는 시작점으로부터 해당 데이터에 도착하기까지 어떤 경로를 거쳐 왔는지를 나타낸다.

LEVEL / CONNECT_BY_ISLEAP 칼럼에 대응하는 값은 어디서 시작하고, 어떤 방향으로 전개되는지에 따라 달라진다.

 

집합연산자는 여러 질의 ( SELECT 문 ) 결과를 하나로 결합하기 위해 사용한다 → 둘 이상의 SELECT 문을 결합하는 것

결합하기 위해 집합 연산 ( ex. UNION ) 의 대상이 되는 두 질의 ( SELECT문 ) 는

- SELECT절의 칼럼 수가 동일해야 하고 → 컬럼의 수가 다르면 에러가 난다.

- SELECT절의 동일 위치에 존재하는 칼럼의 데이터 타입이 상호 호환이 가능해야 한다 → 동일 위치에 있는 칼럼의 데이터 타입이 상호 호환이 불가능할 때 에러가 난다. 반드시 동일한 데이터 타입일 필요는 없다.

중복제거를 먼저 진행하고 합집합, 교집합, 차집합 연산을 진행한다.

집합 연산 질의 작성시 ORDER BY 는 집합 연산을 적용한 최종 결과에만 적용이 가능하기 때문에 맨 마지막 줄에 한 번만 기술한다.

 

 

UNION ALL 사용 예시

SELECT 'T' 구분코드, PLAYER_NAME, TEAM_ID

FROM PLAYER

WHERE TEMA_ID = 'K06' → PLAYER 테이블에서 TEAM_ID 가 'K06' 인 인스턴스 ( 레코드 ) 들을 추출한 후,

추출된 레코드에 기반하여 PLAYER_NAME과 TEAM_ID 칼럼을 뽑아낸다. 'T' 구분코드 → 구분코드 라는 이름을 가진 칼럼의

데이터는 모드 T 로 채운다. 구분코드는 어떤 SELECT절의 결과인지를 식별하는 컬럼이다.

UNION ALL

SELECT 'P' 구분코드, PLAYER_NAME, POSITION

FROM PLAYER

WHERE POSITION = 'GK'; → PLAYER 테이블에서 POSITION 칼럼에 대응하는 데이터 'GK'에 해당하는 레코드를 모두 추려낸 후,

추출된 레코드에 기반하여 PLAYER_NAME 과 TEAM_ID 칼럼을 뽑아내고, POSITION 컬럼의 데이터에 기반하여 레코드를 추출한 SELECT절의 결과라는 것을 나타내기 위해 'P' 구분코드를 SELECT 절에 추가한다.

집합 연산자 ( UNION ALL ) 이 작성된 질의의 결과를 정렬하고 싶을 때

맨 마지막에 ORDER BY 절을 작성하는데 출력 컬럼의 컬럼명의 첫 SELECT문의 칼럼명이 적용된다.

만약 ORDER BY 구분코드, POSITION 이라고 작성했다면 에러가 난다.

 

INTERSECT 연산자를 사용한 결과가 출력되어야 하는데

INTERSECT 집합 연산자를 사용하지 않고 구현해야한다면 조건절에 AND 를 사용하여

동일한 결과를 구현할 수 있다 → INTERSECT 연산자는 조건절에서 AND 로 구현할 수 있다.

 

집합 연산자 사용시 ORDER BY 는 맨 마지막 줄에

ORDER BY 에 사용되는 컬럼명은 첫 번째 SELECT문에 사용된 컬럼명만 허용이 가능하고,

만약 컬럼명에 별칭을 작성했다면 별칭이 ORDER BY 절에 사용되어야 한다.

별칭을 작성했는데, 별칭을 사용하지 않고, 원래의 컬럼명을 작성한다면 에러가 발생한다.

'SQLD · DB' 카테고리의 다른 글

[ SQLD ] SQL - Join & Set Operation 240818  (0) 2024.08.18
[ SQLD ] SQL - TCL / DCL 240817  (0) 2024.08.17
[ SQLD ] Function 240817  (0) 2024.08.17
[ SQLD ] DDL 240816  (0) 2024.08.16
[ SQLD ] SQL - DDL 240815  (0) 2024.08.16