03 - 3 JOIN (Self Join, Outer Join)
01 Self Join
self join? 이 무엇일꽈?
이름 처럼 자기 자신과 Join 하는 것
그럴 일이 얼마나 있을지 모르겠지만, 그래도 모르는것보다 아는게 낫다 주의니깐 일단 ㅂH워보ㅈㅏ!
👉 Self Join: 물리적으로 하나의 테이블을 두개의 테이블처럼 만들어서 조인하는 것
💬 우리에게 하단과 같은 emp table이 있다고 가정해보자. emp_id: 직원아이디/ mgr_id: 상사 아이디 100번은 상사라서 mgr_id는 없다. 그리고 101, 102의 상사는 100이다.
이 테이블에서,
직원 ID가 101인 직원의 직원의 ID(emp_id), 이름(emp_name), 상사이름(emp_name)을 조회해보고 싶다고 가정해보자.
행에는 mgr_id만 있기 때문에 상사 이름과 부하 이름을 지금 상태에선 함께 조회하는 것은 불가능!
mgr_id에 맞는 emp_id를 테이블로 붙여주면 emp_name 열도 함께 붙으니깐 그럼 조회가 가능할 것 같다. self join을 ㄱㄱ
(self join을 하기 위한 빌덥일뿐~~)
구문은 so 쉬움. 별명만 다르게 설정해주면 된다.
👉 Self Join 구문
emp 테이블을 e 와 m으로 별칭 다르게 설정했다.
select e.emp_id,
e.emp_name,
m.emp_name
from emp e join emp m on e.mgr_id = m.emp_id
where e.emp_id = 101;
조건은 mgr_id 와 emp _id가 같은 행들끼리 붙여줘야 한다!
합친 테이블을 보면 mgr_id = emp_id 같은 행끼리 잘 붙은 것을 확인 가넝!
m으로 지정한 emp table에서 m.emp_name으로 select 하면 상사 이름 확인 가넝!
Neena의 상사인 Steven 이름을 함께 조회할 수 있는 기적이 행해진다.
P.S. 조잡한 설명으로 Self Join이 이해되었길 바라며 🙏
02 Outer Join
Outer Join에는 그림과 같이 3가지가 존재!
Left, Right은 방식은 동일하고 소스 테이블 위치에 따라 사용하면 된다.
Outer Join은 조인 연산 조건 만족하지 않는 소스 테이블의 행도 모두 포함해서 조인 (욕심쟁이)
타겟은 조건을 만족하는 행만 조인
- Left Outer Join: 소스 테이블이 왼쪽
- Right Outer Join: 구문상 소스 테이블이 오른쪽
- Full Outer Join: 둘다 소스 테이블 (My SQL은 지원 X, union 연산 이용해서 구현)
👉 Outer Join 구문
from 테이블 a [left or Right] outer join 테이블 b on 조인조건
구문은 Inner join과 동일, Left 인지 Right 인지 써주는 것이 포인트고 outer는 생략 가능
👉 Inner Join 응용
우리는 다음과 같은 두개의 테이블이 있고, 두개의 테이블을 합쳐서 직원의 정보,부서 id 뿐만 아니라 이름, 내선 번호도 알고 싶다. 근데 아직 인턴이라 부서가 배정 안된 직원까지 모두 같이 보고싶음!
hr - 자식 테이블
ID | hr_name | Job_id | dept_id |
100 | 모니카 | MGR | 1 |
101 | 피비 | AS | 1 |
102 | 챈들러 | AS | 1 |
103 | 로스 | MGR | 2 |
104 | 레이첼 | PRE | 2 |
105 | 건터 | as |
dept - 부모 테이블
dept_id | dept_name | dept_number |
1 | 기획부 | 203 |
2 | 인사부 | 204 |
3 | 개발부 | 205 |
💬 정리해보면, hr의 테이블에 있는 정보는 모두 보고 dept 테이블에 있는 정보는 직원 정보가 있는 부서 정보만 보고 싶다.
이럴때 바로 outer join 쓰면 되는 것!
select *
from hr h left join dept d on h.dept_id = d.dept_id;
반대로, 위치를 바꾸면
select *
from dept d right join hr h on d.dept_id = h.dept_id;
다음과 같이 작성할 수도 있다. 소스 테이블에 맞게 right or left 마음대로 골라 쓰소ㅅㅓ...!
정리할 땐 진짜 쉽고 별거 아닌데
막상 실제 뒤죽박죽 데이터 합치다 보면
사람 😡 만드는 Join
머두모두 잘 Join 하시길 바라며!