티스토리 뷰
8. Join
이번에는 데이터를 다루는 사람이라면 꼭 하면서 어려워하는 부분인
join에 대하여 알아보자.
Join이란?
여러 개의 테이블의 컬럼의 결과를 하나의 결과값으로 출력할때 사용하는 함수이다.
join은 Oracle Join / 1999 ANSI Join 두가지가 있으며,
Oracle SQL에 이미 있는 Data Set인 emp 테이블과 dept 테이블을 사용할 것이다.
< emp 테이블 >
< dept 테이블 >
Oracle Join
Oracle Join은 equi join, non equi join, outer join, self join으로 나눌 수 있다.
간단히 정리하면
라고 할 수 있다.
equi join
위 emp, dept 테이블을 보면 deptno가 공통으로 있는 것을 볼 수 있다.
이를 기준으로 두 테이블을 합산하려면 아래와 같이 작성하면 된다.
select ename, loc from emp, dept where emp.deptno = dept.deptno ;
from에는 합칠 테이블 두가지를 다 써주고,
where절에 emp테이블과 dept테이블의 deptno가 동일하다는 조건을
코드로 emp.deptno = dept.deptno로 표현한다.
이때 위의 코드처럼 ename, loc를 쓰기보다는 어떤 테이블의 컬럼(변수)인지
구분하여 적어주는 것이 더 좋다.
select emp.ename, emp.sal, emp.job, dept.loc, dept.deptno
from emp, dept
where emp.deptno=dept.deptno and emp.job='SALESMAN';
deptno는 join을 가능하게 한 공통의 컬럼이라서 두 테이블에 중복이다.
따라서, 출력 혹은 조건절에서 사용될 때
특정 테이블의 컬럼(변수)으로 표현해야 실행된다.
Oralce SQL에서는 위와 같이 테이블의 이름 + 컬럼(변수)을 모두 입력해야하는
불편함을 없애주기 위해 테이블 별칭(alias) 기능을 제공한다.
이를 바로 위 코드에 그대로 적용시켜 보면
select e.ename, e.sal, e.job, d.loc, d.deptno
from emp e, dept d
where e.deptno = d.deptno and e.job = 'SALESMAN' ;
동일한 결과를 확인할 수 있다.
만약 한 번 테이블 별칭(alias)을 정했다면 원래 테이블 명은 그 코드에서 사용 불가하다.
non equi join
non equi join은 공통된 컬럼이 없는 두 테이블을 병합하는 것으로
공통된 컬럼 대신 새로운 기준을 지정해줘야 한다.
우선 임의로 월급(sal)의 기준을 정의한 salgrade라는 테이블을 만들어 주자.
drop table salgrade;
create table salgrade ( grade number(10), losal number(10), hisal number(10) );
insert into salgrade values(1,700,1200);
insert into salgrade values(2,1201,1400);
insert into salgrade values(3,1401,2000);
insert into salgrade values(4,2001,3000);
insert into salgrade values(5,3001,9999);
commit;
예제) emp 테이블과 salgrade 테이블을 서로 조인해서 이름, 월급, 등급(grade)를 출력하자!
select e.ename, e.sal, s.grade
from emp e, salgrade s
where e.sal between s.losal and s.hisal;
sal, losal, hisal이 모두 숫자 데이터로 동일하므로
조건문에 의해 두 테이블을 통합할 수 있다.
outer join
일반적으로 join 조건을 충족하지 못하는 행은 query 결과에 나타나지 않는데,
outer join은 이를 모두 출력한다.
dept테이블의 loc(위치) 데이터는 BOSTON, CHICAGO, DALLAS, NEW YORK 4가지가 있는데,
이는 deptno(부서번호)와 연결되어있다.
일반적인 join 시 emp 테이블에는 없는 deptno(부서번호) 40번은 출력되지 않으며,
40번과 연결된 loc(위치) 데이터인 BOSTON 역시 출력되지 않는다.
select ename, loc
from emp e, dept d where e.deptno=d.deptno;
물론, emp테이블에는 deptno가 40이 없으므로 틀린 출력은 아니다.
하지만 내가 dept 테이블 deptno에 40이 있다는 사실을 확인할 수는 없다.
이때 deptno 40까지 함께 출력하는 것을 outer join이 가능하게 하고,
실행방법은 join문의 데이터가 부족한 테이블 옆에 (+)를 붙여준다.
위의 경우에는 BOSTON은 dept테이블에는 있지만, emp테이블에 없으므로
select e.ename, d.loc
from emp e, dept d
where e.deptno(+)=d.deptno; 로 적용한다.
BOSTON 데이터와 매칭되지 않은 ename이 없지만, Null 값으로 노출되는 것을 확인할 수 있다.
self join
self join은 자기 자신의 테이블과 조인하는 조인 문법으로,
emp 테이블을 보면 왜 사용해야하는지 알 수 있다.
< emp 테이블 >
emp 테이블에서 mgr은 관리자의 사원번호이다.
허나, 어떤 사원의 관리자의 이름이 누구인지 직관적으로 확인하기 어렵다.
이럴때 self join을 사용한다.
select 사원.ename, 관리자.ename
from emp 사원, emp 관리자
where 사원.mgr = 관리자.empno ;
KING은 최상위 계급의 사람으로 mgr이 없으므로 사원.ename에서 출력되지 않았다.
이럴때 나오게 하는 방법은 outer join을 적용하여 마지막 where절을
where 사원.mgr = 관리자.empno(+) 로 변경하면 된다.
1999 ANSI Join
1999 ANSI Join은 위에서 배운 Oracle Join보다 먼저 사용되고 있던 것으로,
Oracle Join으로 처리할 수 없는 경우를 대비해 다양한 언어에서 사용되고 있다.
1999 ANSI Join은 on절, using절, natural join, cross join으로 나눌 수 있다.
on절을 사용한 Join
기존의 join과 다른 점은
from절에 테이블1, 테이블2 형식에서 테이블1 join 테이블2으로 변경한 후,
on (테이블1.공통컬럼 = 테이블2.공통컬럼)을 추가로 작성하는 것이다.
where절이 on으로 바뀌었다고 생각하면 상당히 쉽다.
select e.ename, d.loc
from emp e join dept d
on (e.deptno = d.deptno) ;
using절을 사용한 Join
위의 on절을 사용하는 것보다 더 간단하게 using(공통된 컬럼) 으로 사용한다.
select e.ename, d.loc
from emp e join dept d
using(deptno) ;
natural join
natural join은 만약 공통된 컬럼이 있다면 자동으로 이를 인식하여 join을 진행한다.
from절을 테이블1 natural join 테이블2와 같이 적용하면 실행된다.
select e.ename, d.loc
from emp e natural join dept d;
cross join
cross join은 집합으로 보면 무조건 다 합쳐버리는 것으로,
테이블 1 = {A, B, C}, 테이블 2 = {가, 나}
cross join 결과는
A | 가 --|--- B | 가 C | 가 A | 나 B | 나 C | 나 가 된다.
select e.ename, d.loc
from emp e cross join dept d;
(밑에 모든 ename별 loc가 출력되었다)
+
1999 ANSI Join 문법에서의 outer join은 from 절의 테이블 위치에 따라
원래 join문에서 출력되지 않는 데이터를 가지고 있는 테이블을 향한 join문을 사용한다. 아래의 예제를 보면
select e.ename, d.loc
from emp e right outer join dept d
on (e.deptno = d.deptno) ;
dept 테이블의 loc의 BOSTON이 기존 join에 노출되지 않으며,
from절에 emp 다음 dept 테이블이 나왔으므로 오른쪽에 있는 dept 테이블을 가리키며
right outer join을 사용하는 것이다.
(반대일 경우에는 left outer join)
=================이 글은 Markdown을 활용해 작성하였습니다=================
'SQL' 카테고리의 다른 글
[SQL] 10. 집합 연산자 (0) | 2018.02.01 |
---|---|
[SQL] 9. 서브쿼리 (0) | 2018.01.31 |
[SQL] 7. 데이터 분석함수 (0) | 2018.01.26 |
[SQL] 6. 그룹함수(복수행함수) (0) | 2018.01.23 |
[SQL] 5. 일반함수 (0) | 2018.01.22 |
- Total
- Today
- Yesterday
- hadoop2.7
- 데이터 분석
- 빅데이터
- 하둡2.7
- data
- hadoop setup
- hadoop
- hadoop install
- 하둡
- 하둡설치
- Big Data
- hadoop 2.7 install
- 하둡 설치 가이드
- Data Analysis
- 하둡설치가이드
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |