DB - 조인
데이터베이스 스터디 2주차에서 학습하고 정리한 내용입니다.
1. Join
관계 대수에서 조인은 Cross Product한 결과에 여러 조건을 추가한 것이다. Cross Product한 결과에 조건에 맞는 결과만 Selection하거나 Projection 한다. 
예제 테이블
customers
| customer_id | customer_name |
|---|---|
| 1 | Kim |
| 2 | Lee |
| 3 | Park |
orders
| order_id | customer_id | total_amount |
|---|---|---|
| 1 | 1 | 8000 |
| 2 | 1 | 3000 |
| 3 | 2 | 8000 |
| 4 | 2 | 9000 |
| 5 | 4 | 11000 |
2. Cross Join
Cross Join은 관계 대수에서 Cross Product를 적용한 결과와 같다. Cross Product는 두 테이블의 튜플을 조합하여 가능한 모든 경우의 수이다. Cross Join의 튜플 수는 각 테이블의 튜플 수를 곱한 값과 일치한다.
3. Inner Join
Cross Join에서 조인 조건과 일치하는 결과만 반환하면 Inner Join이다. 조인 조건과 일치하는 튜플들만 남고 나머지는 다 버려진다.
1) Theta Join(θ)
Cross Product한 결과의 조건으로 =, >, <, >=, <= 등으로 표현되면 Theta Join이라고 한다.
1
2
SELECT * FROM customers CROSS JOIN orders
ON customers.customer_id > orders.customer_id;
| customer_id | customer_name | order_id | customer_id(orders) | total_amount |
|---|---|---|---|---|
| 2 | Lee | 1 | 1 | 8000 |
| 2 | Lee | 2 | 1 | 3000 |
| 3 | Park | 1 | 1 | 8000 |
| 3 | Park | 2 | 1 | 3000 |
| 3 | Park | 3 | 2 | 8000 |
| 3 | Park | 4 | 2 | 9000 |
2) Equi Join
세타 조인 중 조건 θ가 =인 특별한 경우를 Equi Join이라고 한다. MySQL에서 JOIN은 Equi Join을 의미한다.
1
2
SELECT * FROM customers CROSS JOIN orders
ON customers.customer_id = orders.customer_id;
| customer_id | customer_name | order_id | customer_id(orders) | total_amount |
|---|---|---|---|---|
| 1 | Kim | 1 | 1 | 8000 |
| 1 | Kim | 2 | 1 | 3000 |
| 2 | Lee | 3 | 2 | 8000 |
| 2 | Lee | 4 | 2 | 9000 |
3) Natural Join
Equi Join은 동일한 이름을 가진 customer_id 열이 중복해서 나오고 있다. 이 Equi Join에서 중복되어 나오는 customer_id 열을 하나로 통합하면 자연 조인이 된다.
1
SELECT * FROM customers NATURAL JOIN orders;
| customer_id | customer_name | order_id | total_amount |
|---|---|---|---|
| 1 | Kim | 1 | 8000 |
| 1 | Kim | 2 | 3000 |
| 2 | Lee | 3 | 8000 |
| 2 | Lee | 4 | 9000 |
4. Outer Join
Inner Join과 달리 조인 조건을 만족하지 않는 데이터도 포함될 수 있다.
1) Left Outer Join
조인 조건을 만족하는 데이터에 조인 조건을 만족하지 않는 왼쪽 테이블의 데이터도 모두 추가한다. customers.customer_id = orders.customer_id 조인 조건을 만족하지 않아 포함되지 않았던 Park이 포함되어 있다. order table의 정보는 null로 표시되어 있다.
| customer_id | customer_name | order_id | customer_id(orders) | total_amount |
|---|---|---|---|---|
| 1 | Kim | 1 | 1 | 8000 |
| 1 | Kim | 2 | 1 | 3000 |
| 2 | Lee | 3 | 2 | 8000 |
| 2 | Lee | 4 | 2 | 9000 |
| 3 | Park | null | null | null |
2) Right Outer Join
조인 조건을 만족하는 데이터에 조인 조건을 만족하지 않는 오른쪽 테이블의 데이터도 모두 추가한다. 조인 조건을 만족하지 않아 포함되지 않았던 5번째 주문 내역이 포함되어 있다.
| customer_id | customer_name | order_id | customer_id(orders) | total_amount |
|---|---|---|---|---|
| 1 | Kim | 1 | 1 | 8000 |
| 1 | Kim | 2 | 1 | 3000 |
| 2 | Lee | 3 | 2 | 8000 |
| 2 | Lee | 4 | 2 | 9000 |
| null | null | 5 | 4 | 11000 |
3) Full Outer Join
조인 조건을 만족하는 데이터에 조인 조건을 만족하지 않는 왼쪽, 오른쪽 테이블의 데이터를 모두 추가한다.
| customer_id | customer_name | order_id | customer_id(orders) | total_amount |
|---|---|---|---|---|
| 1 | Kim | 1 | 1 | 8000 |
| 1 | Kim | 2 | 1 | 3000 |
| 2 | Lee | 3 | 2 | 8000 |
| 2 | Lee | 4 | 2 | 9000 |
| 3 | Park | null | null | null |
| null | null | 5 | 4 | 11000 |
Reference
0
1
홍봉희 편저, 데이터베이스 SQL 프로그래밍 ‘MySQL 실습’, 부산대학교출판문화원
2
https://velog.io/@haerong22/LEFT-OUTER-JOIN-%EC%9D%98-%ED%95%A8%EC%A0%95