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 |