SQL Cook: 제3 장 다중 테이블 작업

0

SQL_COOK

목록 보기
9/35
post-thumbnail

소개

제3 장에서는 JOIN 및 집합 연산을 사용하여 여러 테이블의 데이터를 결합하는 방법을 소개한다.
JOIN은 SQL의 기초이며 집합의 연산도 중요하다.

복잡한 쿼리를 이해하려면 지금부터 JOIN 및 집합 연산에 대한 연습을 시작해야 한다.

3. 1 행 집합을 다른 행 위에 추가하기

Q. 두 개 이상의 테이블에 저장된 데이터를 반환하고, 한 결과셋을 다른 결과셋 위에 포개려고 한다. 이들 테이블에 공통 키가 필요하지는 않다. 그러나 해당 열의 데이터 유형은 동일하다.

예를 들어, 'EMP' 테이블에 있는 부서값 10인 사원명 및 부서번호와 함께, 'DEPT' 테이블에 있는 각 부서명 및 부서번호를 표시하려고 한다.

A. 집합 연산 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 테이블
    피벗이라 함은 행과 열을 바꾸는 것인데, 첫 등장에서는 동적으로 열을 생성하여 임시 행을 넣는 역할을 했다.
    앞으로 어떤 식으로 응용될지 궁금하다.

0개의 댓글