JOIN에 대해서 한번 정리 해보는 시간을 가지려고 합니다.
사용한 테이블
- 예시와 테스트 자료이므로 FK키는 따로 걸지 않았습니다.
- 데이터 모델링을 통해 나온 자료가 아니라 단지 테스트 및 설명 용도 입니다.

사용한 데이터
1. EQUI JOIN과 NON-EQUI JOIN
등가 조건 ( = ) 을 사용하는 조인을 EQUI JOIN이라고 하며, 부등호( >, < , BETWEEN) 을 사용한 JOIN을 말합니다.
1. EQUI JOIN
- ( = ) 을 사용한 조인 방법
SELECT u.user_id, user_name, version
FROM users u, logged_in l
WHERE u.user_id = l.user_id;
- 결과

2. NON-EQUI JOIN
>, <, <=, >= 을 통한 조인 방법
- 문제 . 주문 금액이 5만원 이상인 모든 유저 정보를 가져와 주세요.
SELECT user_name, totalprice
FROM USERS, ORDERS
WHERE USERS.user_id = ORDERS.user_id
AND totalprice > 50000;
- 결과

2. JOIN 정리
JOIN을 처음 접했을 때, 수학의 집합이라고 생각했다면 크게 어렵지 않았을 것 입니다. 그렇다면 JOIN이 왜 필요할까요?
- DB는 사람의 상호작용으로 생기는 정보와 데이터를 집합을 통해서 저장합니다.
- 이런 상호작용을 사용하기 위해서 JOIN을 사용하거나 여러 서브쿼리, 윈도우 함수 종류를 사용하기도 합니다.

1. INNER JOIN
- A와 B의 동일한 부분을 찾습니다.
SELECT order_id ,products_name, totalprice
FROM ORDERS O INNER JOIN PRODUCTS P ON O.product_id = P.product_id;
- 결과

2. LEFT OUTER JOIN
집합으로 표현하자면 A - B + A ⋂ B 다. INNER JOIN 부분과 그 것에 속하지 않는 A를 구하는 방법입니다. 여기서 A를 기준으로 데이터를 구하는 것을 말합니다.
- ORDERS 테이블 기준으로 LEFT JOIN을 사용해보겠습니다.
SELECT order_id ,products_name, totalprice
FROM ORDERS O LEFT JOIN PRODUCTS P ON O.product_id = P.product_id;
- 결과

상품을 가지지 않는 order 정보까지 모두 가져옵니다.두 테이블 관계에서 우측 테이블에 존재 하지 않는 데이터를 가져온다는 것이 가장 중요합니다.
3. RIGHT OUTER JOIN
집합으로 표현하자면 B - A + A ⋂ B 다. INNER JOIN 부분과 그 것에 속하지 않는 A를 구하는 방법입니다. 여기서 A를 기준으로 데이터를 구하는 것을 말합니다.
기준을 B로 잡고 LEFT JOIN을 사용하면 사실 똑같은 값을 가집니다.
- ORDERS 테이블 기준으로 RIGHT JOIN을 사용해보겠습니다.
SELECT order_id ,products_name, totalprice
FROM ORDERS O RIGHT JOIN PRODUCTS P ON O.product_id = P.product_id;
- 결과

ORDER에 사용되지 않은 PRODUCTS의 내용도 가져오게 됩니다!.두 테이블 관계에서 좌측 테이블에 존재 하지 않는 데이터를 가져온다는 것이 가장 중요합니다.
4. FULL OUTER JOIN
사용을 권장하지 않는 방식이지만, 알아두면 좋습니다. 중요성이 높지 않으므로 건너 띄어도 상관 없을 것 같습니다.
모든 테이블의 정보를 가지는 방법입니다.
- ORDER와 PRODUCT의 FULL JOIN
SELECT order_id ,products_name, totalprice
FROM ORDERS O LEFT JOIN PRODUCTS P ON O.product_id = P.product_id
UNION
SELECT order_id ,products_name, totalprice
FROM ORDERS O RIGHT JOIN PRODUCTS P ON O.product_id = P.product_id;
- 결과

ORDER와 PRODUCT에 해당하는 모든 데이터를 가져오게 됩니다.
5. CROSS JOIN
절대 나오면 안되는 방식의 조인문. A 테이블 컬럼 수 * B 테이블 컬럼 수 만큼의 데이터가 나옵니다.
만약 A가 10000, B가 1000 이면 10000000개의 데이터가 나오게 되는 것입니다. 모든 경우의 수가 필요하다면 사용할 법 합니다.
SELECT order_id ,products_name, totalprice
FROM ORDERS O CROSS JOIN PRODUCTS P
총 28개의 데이터가 나오게 됩니다. 4개의 상품 * 7개의 오더 = 28 입니다.
'DB' 카테고리의 다른 글
| Transaction과 ACID (0) | 2024.05.23 |
|---|