제3 장에서는 JOIN
및 집합 연산을 사용하여 여러 테이블의 데이터를 결합하는 방법을 소개한다.
JOIN
은 SQL의 기초이며 집합의 연산도 중요하다.
복잡한 쿼리를 이해하려면 지금부터 JOIN
및 집합 연산에 대한 연습을 시작해야 한다.
예를 들어, 'EMP' 테이블에 있는 부서값 10인 사원명 및 부서번호와 함께, 'DEPT' 테이블에 있는 각 부서명 및 부서번호를 표시하려고 한다.
UNION ALL
을 사용하여 여러 테이블의 행을 결합한다.select ename as ename_and_dname, deptno
from emp
where deptno = 10
union all
select '----------', null
from t1
union all
select dname, deptno
from dept
>>
ENAME_AND_DNAME DEPTNO
KING 10
CLARK 10
MILLER 10
---------- -
ACCOUNTING 10
RESEARCH 20
SALES 30
OPERATIONS 40
처음으로 써보는 테이블이 나왔다.
't1' 테이블에는 아무 것도 들어가있지 않다.
insert into t1 values (1)
오직 'ID'라는 칼럼이 하나 존재할 뿐이다.
이런 테이블을 두고 피벗 테이블이라고 한다.
피벗(Pivot 테이블)
쉽게 피벗하기 위해서만 만들어놓는 테이블.
일련의 행을 만들 때 유용하다.
위의 쿼리에서도 FROM 피벗 테이블
/ SELECT '------', null
을 사용하여, 동적으로 두 개의 열 / 하나의 행을 만들어낸 것을 볼 수 있다.
만약 t1 테이블에 10개의 행이 있었다면 '------'과 null은 10줄이 나왔을 것이다.
select ename as ename_and_dname, deptno
from emp
where deptno = 10;
union all
select '----------', null
from t10
union all
select dname, deptno
from dept
>>
ENAME_AND_DNAME DEPTNO
KING 10
CLARK 10
MILLER 10
---------- -
ACCOUNTING 10
RESEARCH 20
SALES 30
OPERATIONS 40
>>
ENAME_AND_DNAME DEPTNO
KING 10
CLARK 10
MILLER 10
------ -
------ -
------ -
------ -
------ -
------ -
------ -
------ -
------ -
------ -
ACCOUNTING 10
RESEARCH 20
SALES 30
OPERATIONS 40
t1 테이블은 하나의 행만 가지고 있지만, t10은 열 개의 행을 가지고 있다.
따라서 이들 테이블에서 동적으로 생성된 열에 대한 값은 각각이 가진 행의 개수만큼 출력된다.
UNION ALL
을 기준으로 각 테이블에서의 출력 내용이 쌓이고 있는 것을 볼 수 있다.UNION ALL
은 여러 행 소스의 행들을 하나의 결과셋으로 결합한다.SELECT
목록의 항목은 숫자와 데이터 유형이 일치해야 한다.UNION ALL
은 중복 행을 포함한다. 중복을 필터링하고 싶다면 UNION
을 사용해야 한다.select deptno
from emp
union all
select deptno
from dept
>>
DEPTNO
10
30
10
20
20
20
20
30
30
30
30
20
30
10
10
20
30
40
select deptno
from emp
union
select deptno
from dept
>>
DEPTNO
10
20
30
40
UNION ALL
대신 UNION
을 지정하면 중복을 제거하는 정렬 작업이 발생한 가능성이 높다.(?)
대량의 결과셋으로 작업할 때에는 이를 염두에 두어야 한다.
UNION
을 사용하는 것은 마치 UNION ALL
의 출력에 DISTINCT
를 적용하는 것과 흡사하다.
select distinct deptno
from(
# FROM절의 서브쿼리의 결과셋 중에서 메인쿼리가 작동한다
select deptno
from emp
union all
select deptno
from dept
)
>>
DEPTNO
40
30
10
20
DISTINCT
는 가능한 한 사용하지 않는다.UNION
도 마찬가지다.집합 연산이 처음으로 나왔다.
UNION
은 결과셋을 합친다.
합칠 결과셋의 자료형은 동일해야 한다.
Pivot 테이블
피벗이라 함은 행과 열을 바꾸는 것인데, 첫 등장에서는 동적으로 열을 생성하여 임시 행을 넣는 역할을 했다.
앞으로 어떤 식으로 응용될지 궁금하다.