SKN/02. DB

16. JOIN

claovy☘️ 2025. 2. 20. 17:04

1. JOIN

01. JOIN 개요

💡JOIN은 두개 이상의 테이블을 관련 있는 컬럼을 통해 결합하는데 사용된다. 두개 이상의 테이블은 반드시 연관 있는 컬럼이 존재해야 하며 이를 통해 JOIN된 테이블들의 컬럼을 모두 활용할 수 있다.

 

02. ALIAS

  • SQL문의 컬럼 또는 테이블에 별칭을 달아줄 수 있다. 이러한 별칭을 ALIAS라고 한다.
  • 컬럼 별칭
    • 별칭에 띄어쓰기나 특수 기호가 없다면 홑 따옴표(')와 AS는 생략 가능하다.
  • 테이블 별칭
    • 테이블에 별칭을 작성할 수 있으며 어떤 테이블 소속 인지를 쉽게 알 수 있게 한다.
    • 테이블 별칭은 AS를 써도 되고 생략도 가능하다.

03. JOIN 종류

(1) INNER JOIN

  • 두 테이블의 교집합을 반환하는 SQL JOIN 유형
  • INNER JOIN에서 INNER 키워드는 생략이 가능하다.

(2) LEFT JOIN

  • 첫 번째(왼쪽) 테이블의 모든 레코드와 두 번째(오른쪽) 테이블에서 일치하는 레코드를 반환하는 SQL JOIN 유형

(3) RIGHT JOIN

  • 두 번째(오른쪽) 테이블의 모든 레코드와 첫 번째(왼쪽) 테이블에서 일치하는 레코드를 반환하는 SQL JOIN 유형

(4) CROSS JOIN

  • 두 테이블의 모든 가능한 조합을 반환하는 SQL JOIN 유형

(5) SELF JOIN

  • 같은 테이블 내에서 행과 행 사이의 관계를 찾기 위해 사용되는 SQL JOIN 유형

2. JOIN 알고리즘

(1) NESTED LOOP JOIN

  • MySQL은 기본적으로 NESTED LOOP JOIN을 사용한다.
  • 두 개 이상의 테이블에서 하나의 집합을 기준으로 순차적으로 상대방 Row를 결합하여 조합하는 방식
  • 중첩 반복문처럼 첫 번째 테이블의 Row와 관련된 두 번째 테이블에 대한 Row를 검색하고 이후 첫 번째 테이블의 다음 Row에 대해 두 번쨰 테이블에 대한 것을 검색하며 이후 이와 같은 방식을 반복한다.
  • MySQL은 기본적으로 NESTED LOOP JOIN을 사용하지만 이를 강제하려면 힌트절을 작성해 HASH JOIN을 사용하지 않도록 강제할 수 있다.
SELECT /*+ NO_HASH_JOIN(a) */
    a.menu_name,
    b.category_name
FROM 
    tbl_menu a
JOIN tbl_category b ON a.category_code = b.category_code;

 

(2) HASH JOIN

  • MySQL 8.0.18버전 이후 지원하게 되었다.
  • 대규모 데이터 세트에 대한 조인 연산을 효과적으로 진행할 수 있다.
  • 해싱 단계에서 조인을 수행하는 두 테이블 중 작은 쪽을 선택하여 해시 테이블을 만들어 메모리에 저장하고 해시 함수를 사용해서 각 행을 특정 "해시 버킷"에 할당한다.
  • 조인 단계에서 다른 테이블을 순회하며 각 행에 대해 동일한 해시 함수를 사용하여 해당 행이 어떤 버킷에 속하는지 결정하고 이 버킷의 모든 행과 해당 행을 비교하여 조인 조건을 만족한다.
  • 이 방법은 조인할 테이블 중 하나가 메모리에 적합할 만큼 충분히 작아야 한다. 그렇지 않으면 해시 테이블이 메모리를 넘어서 디스크로까지 넘어가고 이는 성능 저하를 초래한다.
  • HASH JOIN은 등가 조인('=' 연산자를 사용하는 조인)에만 사용할 수 있고 비등가 조인에는 사용할 수 없다.
SELECT /*+ HASH_JOIN(a) */
    a.menu_name,
    b.category_name
FROM
    tbl_menu a
JOIN tbl_category b ON a.category_code = b.category_code;

'SKN > 02. DB' 카테고리의 다른 글

17. 서브쿼리  (0) 2025.02.20
15. 데이터타입, 내장함수, 연산자  (0) 2025.02.20
14. DML  (0) 2025.02.20
13. SQL 작성 (select / order_by / where / distinct)  (0) 2025.02.19
04. 개념/논리/물리 모델  (1) 2025.02.19