해당 글은 코드잇에서 실습한 내용을 토대로 정리한 글입니다 :)
이때까지 제가 실습하고 배웠던 JOIN은 결합연산과 집합연산에 대해 배웠습니다.
두 테이블을 가로 방향으로 합치는 결합 연산과 세로 방향으로 합치는 집합 연산입니다.
결합 연산 중에는 LEFT OUTER JOIN, RIGHT OUTER JOIN, INNER JOIN이 있고,
집합 연산 중에는 INTERSECT, MINUS, UNION, UNION ALL이 있습니다.
이중 INTERSECT와 MINUS 연산자는 제가 실습하는 환경인 MySQL에서 지원하지 않아서, 다른 조인을 통해 원하는 결과를 얻기도 했습니다.
이번 글에서는 제가 배우지 않았던 조인 종류들에 대해 간단한 정리를 해보겠습니다. 실무적인 활용도는 떨어지지만, 알아두면 좋은 내용들입니다.
1. NATURAL JOIN
2. CROSS JOIN
3. SELF JOIN
4. FULL OUTER JOIN
5. Non-Equi JOIN
순서대로 배워보도록 합시다!
1. NATURAL JOIN
위의 테이블은 item_id라는 같은 이름의 컬럼이 있습니다. 이 두 컬럼을 기준으로 조인하면 아이템별로 평점,리뷰와 재고량을 한눈에 볼 수 있을 것 같습니다. 이 두 테이블을 INNER JOIN을 해보겠습니다.
제가 생각했던 대로 조인이 아주 잘되는군요,
혹시 INNER JOIN을 방법을 쓰는 또 다른 조인이 있다는 사실을 아시나요,
현재 INNER JOIN이라고 쓴 부분을 NATURAL JOIN 바꿨고, ON 절을 삭제했습니다. 결과가 다르게 나온걸 볼 수 있습니다. 그 이유는 NATURAL JOIN은 두 테이블에서 같은 이름의 컬럼을 찾아서 자동으로 그것들을 조인 조건을 설정하고, INNER JOIN 해주는 조인입니다. id와 item_id 컬럼이 겹치게 되어 위와 같은 결과를 얻게 되는 겁니다.
저는 이때까지 조인을 할때마다 조인 조건을 설정해주는 것을 배웠는데요, NATURAL JOIN은 조인 조건을 자동으로 설정해주기 때문에 ON 절을 쓸 필요가 없는 장점을 가지고 있습니다. NATURAL이라는 말처럼 자연스럽게 진행되는 조인이랍니다.
하지만, NATURAL JOIN을 쓰기보다는 기존의 LEFT, RIGHT 등 조인을 쓰고, ON 절에 조인 조건을 명시해주는 것이 좋습니다. NATURAL JOIN을 하면 SQL 문을 보더라도, 테이블 구조를 모르는 사람이면 어떤 컬럼을 기준으로 조인이 됐는지 알 수가 없기 때문입니다.
2. CROSS JOIN
CROSS JOIN은 두 테이블의 row들의 모든 조합을 보여주는 조합입니다. 위의 두 테이블로 똑같이 보여드리겠습니다.
id 컬럼의 1이 해당하는 모든 row들이 매칭되어서 표시되고, 그 아래에는 다음 숫자 2에 대해서 모든 결과가 나오게 되는 식으로 두 테이블의 모든 row들의 조합이 표시됩니다. 이처럼 두 집합의 모든 조합을 나타내는 것을 수학의 집합 이론에서는 카르테시안 곱(Cartesian Product)이라고 하는데요. CROSS JOIN은 두 테이블의 Cartesian Product를 구하는 조인이라고 할 수 있습니다.
이 조인을 사용하는 경우에는 아마 상의정보가 담긴 테이블과 하의 정보가 담긴 테이블이 있는 상황에서 상-하의 조합들을 한눈에 보고싶을 때 사용할 수 있을 것 같습니다. 하지만 일반적인 경우에는 잘 쓸 일이 없는 종류입니다..
3. SELF JOIN
SELF JOIN은 새로운 조인이 아닙니다. 셀프라는 단어의 뜻 그대로 테이블이 자기 자신과 조인하는 경우를 말합니다. SELF JOIN이라고 해서 헷갈릴 수도 있겠지만, 그냥 서로 다른 두 테이블을 조인한다고 생각하면 됩니다.
review 테이블을 SELF JOIN을 해봤습니다. 같은 테이블이기 때문에 구별하기 위해서 r1, r2 이름을 주었습니다. 결과를 보니 각 item_id마다 다른 item_id(자신 포함)이 함께 출력되는 것을 볼 수 있습니다.
(주황박스)item_id가 1인 아이템에 대해 (초록 박스)mem_id가 1, 6, 10, 13, 16 등인 회원이 단 리뷰를 볼 수 있습니다. 이렇게 SELF JOIN을 통해 하나의 테이블 안에서 다양한 정보를 추출해볼 수 있습니다. 유의미한 정보를 추출하려면 그 분석가의 통찰력이 중요할 것 같습니다.
4. FULL OUTER JOIN
FULL OUTER JOIN은 두 테이블의 LEFT OUTER JOIN과 RIGHT OUTER JOIN을 합치는 조인입니다. 이때, 두 테이블에 공통으로 존재하던 row들은 한번만 표시합니다. UNION과 기능이 비슷하다고 생각되는군요.
참고로 MySQL에서는 FULL OUTER JOIN 연산자가 내장되어 있지 않아 실습해보지 않아서 아쉽습니다..
5. Non-Equi JOIN
드디어 미자막입니다! Non-Equi JOIN은 성격이 전혀 다른 조인입니다. 이때까지 조인 조건을 설정할 때 두 컬럼 값이 같은지를 기준으로 했습니다. 즉, 조인 조건에 항상 등호(=)를 사용했죠. 이러한 조인은 Equi JOIN이라고 합니다.
하지만 동등 조건이 아닌 다른 종류의 조건을 사용해서 조인을 할 수도 있는데요, 그 조인이 Non-Equi JOIN입니다.
저는 member 테이블과 item 테이블을 LEFT OUTER JOIN 했습니다. ON 절의 조인 조건에 등호가 아닌 부등호(<)가 들어있습니다.
(빨간 박스)결과를 보면 member 테이블의 sign_up_day(회원 사이트 가입일)보다 더 이후인 registration_date(상품 등록일)을 사진 item들이 연결되어 있습니다. 이를 보면, 특정 회원이 가입한 이후에 사이트에 올라온 상품들이 무엇인지 확인할 수 있습니다.
(노란 박스)맨 마지막 두줄은 두 회원 이후로 새롭게 사이트에 올라온 상품들이 없는 상태인 것을 알 수 있습니다. 2019년 11월 23일 이후로는 새로 올라온 상품들이 없네요. 상품 업데이트가 시급합니다 ^^..
Non-Equi JOIN은 Equi JOIN만큼 보편적으로 사용하진 않지만, 위의 특정 조건에서는 충분히 유용하게 사용할 수 있는 조인이라고 생각합니다.
이렇게 기본 조인들 말고도 특이한(?) 조인들을 배워봤는데요, 아직 저는 실무에서 사용하지는 않지만 사실 자격증 공부할 때 많은 도움을 받았습니다! 얼릉 실무에서도 사용해봤으면 좋겠습니다 :)
'데이터분석 공부하기' 카테고리의 다른 글
데이터 모델링 (0) | 2021.10.24 |
---|---|
ANY, SOME, ALL (0) | 2021.10.10 |
Primary Key의 종류 (0) | 2021.08.15 |
Seaborn 시각화 (0) | 2021.04.23 |
시각화와 그래프 (0) | 2021.04.22 |
댓글