DB

SQL ) JOIN에 대해서 알아봅시다. WITH MySQL

ruu++ 2024. 5. 8. 13:33

JOIN에 대해서 한번 정리 해보는 시간을 가지려고 합니다.

사용한 테이블

  • 예시와 테스트 자료이므로 FK키는 따로 걸지 않았습니다.
  • 데이터 모델링을 통해 나온 자료가 아니라 단지 테스트 및 설명 용도 입니다.

테스트용 ERD
테스트용 ERD

사용한 데이터

Script-2.sql
0.00MB

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;
  • 결과

EQUI 조인
EQUI JOIN

2. NON-EQUI JOIN

>, <, <=, >= 을 통한 조인 방법

  • 문제 . 주문 금액이 5만원 이상인 모든 유저 정보를 가져와 주세요.
SELECT user_name, totalprice

FROM USERS, ORDERS

WHERE USERS.user_id = ORDERS.user_id

AND totalprice > 50000;
  • 결과

NON EQUI
NON EQUI

2. JOIN 정리

JOIN을 처음 접했을 때, 수학의 집합이라고 생각했다면 크게 어렵지 않았을 것 입니다. 그렇다면 JOIN이 왜 필요할까요?

  • DB는 사람의 상호작용으로 생기는 정보와 데이터를 집합을 통해서 저장합니다.
  • 이런 상호작용을 사용하기 위해서 JOIN을 사용하거나 여러 서브쿼리, 윈도우 함수 종류를 사용하기도 합니다.

SQL 정리
여러 가지 SQL 방식

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;
  • 결과

INNER JOIN 결과
INNER JOIN 결과

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;
  • 결과

LEFT JOIN 결과
LEFT JOIN 결과

상품을 가지지 않는 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;
  • 결과

RIGHT OUTER JOIN
RIGHT OUTER JOIN

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;
  • 결과

FULL OUTER JOIN
FULL OUTER JOIN

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 입니다.