본문 바로가기
SQL 공부일지

SQL 공부 일지 9일차 230825

by 우기37 2023. 8. 27.

## 공부정리

과목2 2장 SQL 활용 2편

2) 집합 연산자

3) 계층형 질의와 셀프 조인

 

 

 

#2 집합 연산자

1 집합연산자

  • 두 개 이상의 테이블에서 JOIN을 사용하지 않고, 연관된 데이터를 조회하는 방법
  • 집합 연산자는 2개 이상의 질의 결과를 하나의 결과로 만든다
  • SELECT절의 컬럼 수가 동일해야 하고, 동일 위치 데이터 타입이 상호 호환 가능해야 함

 

2 집합연산자 종류

집합 연산자 연산자의 의미
UNION 여러 개의 SQL문의 결과에 대한 합집합으로 결과에서 모든 중복된 행은 하나의 행으로 만든다.
UNION ALL 여러 개의 SQL문의 결과에 대한 합집합으로 중복된 행도 그대로 결과로 표시된다. 즉, 단순히 결과만 합쳐놓은 것이다. 일반적으로 여러 질의 결과가 상호 배타적(Exculsive)일 때 많이 사용한다. 개별 SQL문의 결과가 서로 중복되지 않는 경우, UNION과 결과가 동일 하다.(결과의 정렬 순서에는 차이가 있을 수 있음)
INTERSECT 여러 개의 SQL문의 결과에 대한 교집합이다. 중복된 행은 하나의 행으로 만든다.
EXCEPT 앞의 SQL문의 결과에서 뒤의 SQL문의 결과에 대한 차집합이다. 중복된 행은 하나의 행으로 만든다.(일부 데이터 베이스는 MINU를 사용함)

 

 

 

#3 계층형 질의와 셀프 조인

1 계층형 질의

- 계층형 데이터 : 동일 테이블에 계층적으로 상/하위 데이터가 포함된 데이터

- 테이블에 계층형 데이터가 존재하는 경우 데이터를 조화하기 위해 사용

- 엔터티를 순환관계 데이터 모델로 설계할 경우 계층형 데이터 발생(조직, 사원, 메뉴 등)

 

① Oracle 계층형 질의

SELECT...
FROM 테이블
WHERE condition AND condition...
START WITH condition
CONNECT BY [NOCYCLE] condition AND condition...
[ORDER SIBLINGS BY column, column, ...]

 

- 계층형 질의에서 사용되는 가상 칼럼

가상 칼럼 설명
LEVEL 루트 데이터이면 1, 그 하위 데이터이면 2이다. 리프(Leaf) 데이터까지 1씩 증가 한다.
CONNECT_BY_ISLEAF 전개 과정에서 해당 데이터가 리프 데이터이면 1, 그렇지 않으면 0 이다.
CONNECT_BY_ISCYCLE 전개 과정에서 자식을 갖는데, 해당 데이터가 조상으로서 존재하면 1, 그렇지 않으면 0이다. 여기서 조상이란 자신으로부터 루트까지의 경로에 존재하는 데이터를 말한다. CYCLE 옵션을 사용했을 때만 사용할 수 있다.

 

  • START WITH절 : 레벨의 시작
  • CONNECT BY절 : 그 다음에 자식 레벨 지정 (이 때 CONNECT BY절의 조건 만족해야)
  • PRIOR : CONNECT BY절에 사용되며, 현재 읽은 칼럼을 지정
  • PRIOR 자식=부모 : [부모->자식]으로 순방향 전개, 리프=1
  • PRIOR 부모=자식 : [자식->부모]으로 역방향 전개, 루트=1
  • ORDER SIBLINGS BY : 형제 NODE 위치를 바꿈
  • NOCYCLE : 이미 나타난 동일한 데이터가 전개 중에 다시 나타나면 이것을 CYCLE 형성이라 함. 사이클 발생한 데이터는 런타임 오류 발생 -> NOCYCLE 추가 -> 사이클 발생 이후 데이터는 전개 X

 

- 계층형 질의에서 사용되는 함수

함수 설명
SYS_CONNECT_BT_PATH 루트 데이터부터 현재 전개할 데이터까지의 경로를 표시한다.
사용법 : SYS_CONNECT_BY_PATH(칼럼, 경로분리자)
CONNECT_BY_ROOT 현재 전개할 데이터의 루트 데이터를 표시한다. 단항 연산자이다.
사용법  : CONNECT_BY_ROOT 칼럼

 

② SQL Server 계층형 질의

- CTE(Common Table Expression)로 재귀 호출하여 상위부터 하위 방향 전개

 

WITH 테이블명_ANCHOR AS
(SELECT 하위칼럼명, 칼럼명, 상위칼럼명, 0 AS LEVEL
FROM 테이블명
WHERE 상위 칼럼명 IS NULL /* 재귀 호출의 시작점 */
UNION ALL
SELECT R.칼럼명, R.칼럼명, R.계층칼럼명, A.LEVEL + 1
FROM 테이블명_ANCHOR A, 테이블명 R
WHERE A.하위칼럼 = R.상위칼럼)

 

 

 

2 셀프 조인

- 동일 테이블 사이의 조인, 반드시 테이블 별칭(Alias)을 사용해야 한다.

SELECT ALIAS명1.칼럼명1, ALIAS명2.칼럼명1, ...
FROM 테이블명 ALIAS명1, 테이블명 ALIAS명2
WHERE ALIAS명1.칼럼명2 = ALIAS명2.칼럼명1

 

'SQL 공부일지' 카테고리의 다른 글

SQL 공부 일지 11일차 230830  (0) 2023.08.30
SQL 공부 일지 10일차 230829  (0) 2023.08.30
SQL 공부 일지 8일차 230823  (0) 2023.08.23
SQL 공부 일지 7일차 230820  (1) 2023.08.20
SQL 공부 일지 6일차 230818  (0) 2023.08.19