관계형 데이터베이스란 데이터베이스 내에 있는 테이블이나 스키마들이 서로 관계를 가지고 있다는 뜻입니다. 그렇다면 이러한 관계를 이용해서 SQL을 작성하기도 해야 할 텐데, 이럴 때 사용하는 게 바로 join 입니다.
join을 사용해서 여러 테이블이나 스키마에 분산되어 있는 데이터를 하나의 view로 출력하게 하는 것입니다.
양쪽 테이블의 어떤 칼럼에 같은 값이 존재할 때 이것을 Equal 연산자(=)를 이용하여 양쪽에 다 존재하는 값만 결과로 출력하는 join입니다. inner join이라고도 불립니다.
name | team_name | phone_num |
---|---|---|
이지은 | 마케팅 | 010-1234-567X |
천우희 | 영업 | 010-2382-293X |
고윤정 | 개발 | 010-4927-289X |
홍유나 | 디자인 | 010-2932-498X |
김제니 | 디자인 | 010-9298-384X |
name | |
---|---|
마케팅 | marketing@naver.com |
영업 | sales@naver.com |
개발 | develop@naver.com |
디자인 | design@naver.com |
select e.name as 사원이름, d.email as 이메일 문의 주소
from employee e , dept d
where e.team_name = d.name;
사원이름 | 이메일 문의 주소 |
---|---|
이지은 | marketing@naver.com |
천우희 | sales@naver.com |
고윤정 | develop@naver.com |
홍유나 | design@naver.com |
김제니 | design@naver.com |
Equi join과 반대 개념입니다. 두 테이블을 서로 join 할 때, 서로 다른 값을 가지거나, 한쪽 데이터가 다른 쪽 테이블의 데이터 범위 내에 있는 것만 출력을 원할 때 쓰는 join 방법입니다. Non Equi join 역시 inner join에 속합니다.
name | point |
---|---|
이지은 | 10 |
천우희 | 25 |
고윤정 | 15 |
홍유나 | 35 |
김제니 | 20 |
giftname | point_from | point_to |
---|---|---|
에어프라이어 | 0 | 5 |
로봇청소기 | 6 | 15 |
마사지기 | 16 | 20 |
전자레인지 | 21 | 30 |
공기청정기 | 31 | 40 |
select c.name as 고객명, c.point as 고객포인트, g.giftname as 상품명
from customer c , gift g
where c.point between g.point_from and g.point_to;
고객명 | 고객포인트 | 상품명 |
---|---|---|
이지은 | 10 | 로봇청소기 |
천우희 | 25 | 전자레인지 |
고윤정 | 15 | 로봇청소기 |
홍유나 | 35 | 공기청정기 |
김제니 | 20 | 마사지기 |
outer join은 한쪽을 기준으로 하여 다른 쪽에 key값이 일치하는 게 없더라도 모두 출력을 하는 join 기법입니다.
필요시에 꼭 써야 하는 outer join이지만 필요 없을 땐 쓰지 않아야 합니다. outer join은 모든 데이터를 다 가지고 올 때 full scan을 하기 때문에 DB에 무리를 가할 수 있기 때문입니다.
예를 들어, 막 채용된 신입사원들에게 아직 부서가 주어지지 않았을 수 있습니다.
name | dept | phone_num |
---|---|---|
이지은 | 마케팅 | 010-1234-567X |
천우희 | 영업 | 010-2382-293X |
고윤정 | 해외영업 | 010-4927-289X |
홍유나 | 마케팅 | 010-2932-498X |
김제니 | 인사 | 010-9298-384X |
이지수 | null | 010-3228-334X |
박현아 | null | 010-2409-030X |
dept | senior_name |
---|---|
마케팅 | 이미희 |
영업 | 박영수 |
해외영업 | 김현미 |
마케팅 | 이영희 |
인사 | 최여울 |
이런 경우 두 테이블을 일반 inner join으로 join 한다면 전체 사원에서 아직 부서가 배정되지 않은 사원들은 빠지게 됩니다.
select e.name, e.dept, s.senior_name
from employee e
left outer join senior s
on e.dept = s.dept;
name | dept | senior_name |
---|---|---|
이지은 | 마케팅 | 이미희 |
천우희 | 영업 | 박영수 |
고윤정 | 해외영업 | 김현미 |
홍유나 | 마케팅 | 이미희 |
김제니 | 인사 | 최여울 |
이지수 | null | null |
박현아 | null | null |
따라서 아직 배정받지 않은 모든 사원들을 출력해야 할 때는 outer join을 사용합니다.
Self join은 자기 자신의 테이블과 다시 join을 하는 경우를 말합니다.