03 - 2 JOIN (Inner Join)
소스/타겟 테이블
소스 테이블: 먼저 주체가 되는 테이블, 즉 우리가 먼저 이 테이블에 을 읽어야 한다고 생각되는 테이블.
타겟 테이블: 소스를 먼저 읽은 후 소스에 조인할 대상이 되는 테이블
👉 소스테이블과 타겟 테이블은 목적에 따라 달라지기 때문에. 가변적
즉, 부모 테이블이 소스 or 타겟이 될 수도, 자식 테이블이 소스 or 타겟이 될수도 있음!
Inner Join 정의
Inner Join은 합치는 행 둘 다 조건을 만족하는 행만 합치는 것
간단하게 프렌즈 인사정보 테이블로 설명을 하자면, 하기와 같이 두개의 테이블이 있고 inner join을 통해 합쳐보자.
hr - 자식 테이블
ID | hr_name | dept_id |
100 | 모니카 | 1 |
101 | 피비 | 1 |
102 | 챈들러 | 1 |
103 | 로스 | 2 |
104 | 레이첼 | 2 |
dept - 부모 테이블
dept_id | dept_name | dept_number |
1 | 기획부 | 203 |
2 | 인사부 | 204 |
3 | 개발부 | 205 |
hr과 dept Inner Join
ID | hr_name | dept_id | dept_id | dept_name | 내dept_number |
100 | 모니카 | 1 | 1 | 기획부 | 203 |
101 | 피비 | 1 | 1 | 기획부 | 203 |
102 | 챈들러 | 1 | 1 | 기획부 | 203 |
103 | 로스 | 2 | 2 | 인사부 | 204 |
104 | 레이첼 | 2 | 2 | 개발부 | 204 |
그럼 다음과 같이 테이블이 합쳐진다.
hr에 있지 않은 3번 개발부는 사라진다. 물론 hr 테이블에 dept 테이블에 없는 행이 있다면 그 행도 조건을 만족하지 못하기 때문에 사라졌을 것이다.
그럼 어떻게 이렇게 행을 합치냐구yo?
Inner Join 구문
👉 Inner Join 기본 구문
FROM 테이블a INNER JOIN 테이블b ON 조인조건
- Inner Join은 From에서 작성
- on 조인조건에는 부모 테이블의 PK(Primary Key)와 자식(Foreign Key)를 사용할 조건 작성
👉 Inner Join 응용
그럼 위와 같이 합쳐야 할 경우는 어떻게 해야 합칠까?
우선 우리의 PK와 FK는 dept 테이블의 dept_id, hr 테이블의 dept_id 이다.
조건은? 조건은 둘의 번호가 같은 행끼리 짝을 지어야 한다. 그래서 equal 연산자 '=' 를 써줄 것이다.
select *
from hr inner join dept on hr.dept_id = dept.dept_id;
이렇게 작성해주면 된다.
왜 dept_id 앞에 갑자기 hr과 dept를 붙여주냐고?
우린 각각 테이블에 dept_id가 있기 때문에 각 테이블 이름을 쓰고 '쩜'을 찍어서 각 테이블의 어떤 컬럼인지 표시해줘야 하기 때문!
별칭사용
select *
from hr h inner join dept d on h.dept_id = d.dept_id;
추가로, 조금 더 편리하게 별칭? 별명?을 지어질 수 있는데, 보통 테이블 앞글자 따온 알파벳으로 설정한다.
그러면 조건 적는게 조금 더 빨라지기 때문에.(우리에겐 빠르고 정확한게 choigo!)
👉 두개 이상 테이블 Join
그럼, 두개만 합칠 수 있는 건가요?
ㄴㄴ 여러개 원하는 만큼 합칠 수 있습니다.
hr - 자식 테이블
ID | hr_name | Job_id | dept_id |
100 | 모니카 | MGR | 1 |
101 | 피비 | AS | 1 |
102 | 챈들러 | AS | 1 |
103 | 로스 | MGR | 2 |
104 | 레이첼 | PRE | 2 |
dept - 부모 테이블
dept_id | dept_name | dept_number |
1 | 기획부 | 203 |
2 | 인사부 | 204 |
3 | 개발부 | 205 |
Job - 부모 테이블
Job_id | min_salary | max_salary |
Assitant | 4000 | 5000 |
Senior | 5500 | 8000 |
Manager | 8500 | 10000 |
President | 15000 | 99999 |
이렇게 3개의 table을 합쳐보좌. 우선 코드를 먼저 봐보좌.
select *
from hr h inner join dept d h.dept_id = d.dept_id
inner join job j h.job_id = j.job_id;
동일하게 공유하는 컬럼을 조건으로 써서 한 줄 만 추가해주면 됨!
앞에 무엇이랑 합칠지 쓰지 않은 것은, 앞에 합쳐진 테이블 뒤에다 붙이는 것이기 때문에 두번째 줄 수식 전체가 붙일 테이블이기 때문!
이런식으로 작성하다보면 원하는 갯수만큼 테이블을 합칠 수 있음 ✌️