## 공부정리
과목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 |