관계형 데이터베이스에서는 중복 데이터를 최대한 없애기 위해 데이터를 여러 테이블로 나눠서 저장한다.
DB에 데이터들을 저장하고 데이터들을 조회하려고 할 때 여러 테이블들을 JOIN해서 데이터를 얻는 과정을 꼭 거쳐한 한다.
조인은 여러 테이블에 분산된 데이터를 연결하여 원하는 결과를 도출하는 중요한 도구이다.
그렇기 때문에 "JOIN"에 대해서 자세히 알아보고 사용하는게 좋을 것 같아서 이 글을 작성하게 되었다.
조인(Join)이란?
조인은 두 개 이상의 테이블에서 데이터를 연결하여 원하는 정보를 조회하는 SQL 연산이다. 테이블 간의 관계를 정의하는 "키(Key)"를 기반으로 데이터를 결합하며, 이를 통해 복잡한 데이터 구조에서도 필요한 정보를 가져올 수 있다
고객 테이블과 주문 테이블이 따로 있는 경우 조인 예시를 보겠다.
고객(Customer)
고객ID | 이름 | 이메일 |
1 | 홍길동 | hong@example.com |
2 | 김철수 | kim@example.com |
3 | 박영희 | park@example.com |
주문(Order)
주문ID | 고객ID | 상품 | 주문일자 |
101 | 1 | 노트북 | 2024-01-01 |
102 | 1 | 스마트폰 | 2024-01-15 |
103 | 2 | 태블릿 | 2024-01-20 |
위 두 테이블을 조인하여 "홍길동"의 주문 내역을 가져오려면 고객ID를 기준으로 데이터를 연결해야 한다.
SELECT 고객.이름, 주문.상품, 주문.주문일자
FROM 고객
JOIN 주문 ON 고객.고객ID = 주문.고객ID;
결과:
이름 | 상품 | 주문일자 |
홍길동 | 노트북 | 2024-01-01 |
홍길동 | 스마트폰 | 2024-01-15 |
김철수 | 태블릿 | 2024-01-20 |
조인은 다양한 유형으로 나뉘며, 각각의 조인은 특정 요구사항에 맞는 데이터를 조회하는 데 사용된다.
조인의 종류를 알아보자!
INNER JOIN
- 두 테이블에서 조건에 일치하는 데이터만 반환한다.
- 공통된 데이터만 결과에 포함되기 때문에 조인에 부합되지 않는 레코드는 모두 삭제 된다.
해당 조인은 위에서 보인 예시와 같은 동작을 한다.
LEFT JOIN (또는 LEFT OUTER JOIN)
- 왼쪽 테이블의 모든 데이터를 가져오고, 오른쪽 테이블에 일치하는 데이터가 없으면 NULL을 반환합니다.
- ex) 특정 고객이 주문을 하지 않은 경우에도 고객 정보를 포함하고 싶을 때.
SELECT 고객.이름, 주문.상품
FROM 고객
LEFT JOIN 주문 ON 고객.고객ID = 주문.고객ID;
결과: 박영희는 주문하지 않은 고객이지만 LEFT JOIN에 따라서 상품은 NULL 값을 가진 상태로 조인된 것을 볼 수 있다.
이름 | 상품 |
홍길동 | 노트북 |
홍길동 | 스마트폰 |
김철수 | 태블릿 |
박영희 | NULL |
RIGHT JOIN (또는 RIGHT OUTER JOIN)
- 오른쪽 테이블의 모든 데이터를 가져오고, 왼쪽 테이블에 일치하는 데이터가 없으면 NULL을 반환한다.
- ex) 주문 내역은 있지만 고객 정보가 누락된 경우에도 주문 정보를 포함하고 싶을 때.
FULL OUTER JOIN
- 두 테이블의 모든 데이터를 가져오며, 일치하지 않는 데이터는 NULL로 채운다.
- FULL OUTER JOIN은 두 테이블 간의 데이터 겹침 여부와 상관없이 모든 데이터를 포함한다.
- ex) 양쪽 테이블의 모든 데이터를 결합하여 누락된 데이터까지 확인하고 싶을 때.
테이블 A: 고객 정보
고객ID | 이름 |
1 | 홍길동 |
2 | 김철수 |
3 | 박영희 |
테이블 B: 주문 정보
주문ID | 고객ID | 상품 |
101 | 1 | 노트북 |
102 | 2 | 태블릿 |
103 | 4 | 스마트폰 |
SELECT A.고객ID, A.이름, B.주문ID, B.상품
FROM 고객 A
FULL OUTER JOIN 주문 B
ON A.고객ID = B.고객ID;
결과:
고객ID | 이름 | 주문ID | 상품 |
1 | 홍길동 | 101 | 노트북 |
2 | 김철수 | 102 | 태블릿 |
3 | 박영희 | NULL | NULL |
4 | NULL | 103 | 스마트폰 |
대부분 DB는 FULL OUTER JOIN을 지원하지 않는다. 하지만, LEFT JOIN, RIGHT JOIN, UNION을 통해서 구현할 수 있다.
-- LEFT JOIN 결과
SELECT A.고객ID, A.이름, B.주문ID, B.상품
FROM 고객 A
LEFT JOIN 주문 B
ON A.고객ID = B.고객ID
UNION
-- RIGHT JOIN 결과
SELECT A.고객ID, A.이름, B.주문ID, B.상품
FROM 고객 A
RIGHT JOIN 주문 B
ON A.고객ID = B.고객ID;
CROSS JOIN
- 두 테이블의 모든 가능한 조합을 반환한다. (카테시안 곱)
- [주의] 조인 조건이 없기 때문에, 데이터 양이 많아질 경우 성능 문제가 발생할 수 있다.
SELECT 고객.이름, 주문.상품
FROM 고객
CROSS JOIN 주문;
결과: 모든 고객이 모든 주문과 조합된 결과 반환한다.
SELF JOIN
- 같은 테이블 내의 데이터를 조인한다.
- ex) 직원 테이블에서 상사와 부하 직원의 관계를 표현.
SELECT A.이름 AS 직원, B.이름 AS 상사
FROM 직원 A
JOIN 직원 B ON A.상사ID = B.직원ID;
조인 활용 팁과 주의사항
인덱스 활용: 조인의 성능을 향상시키기 위해 조인 조건에 사용되는 열에 인덱스를 설정한다.
필요한 데이터만 조회: 조인 결과에서 필요한 열만 선택하여 네트워크와 처리 부하를 줄인다.
조인 전 중복 제거: 조인 전에 중복제거를 하여 성능을 개선한다.(SELECT DISTINCT는 간단하지만 성능이 느려서 조인할 테이블에 먼저 distinct로 중복을 제거한 select문을 서브쿼리로 불러와 임시 테이블로 만든 뒤 조인하면 좋다.)
데이터량 주의: 조인되는 데이터가 많아질수록 성능이 저하될 수 있으므로 조건을 명확히 지정한다.
NULL 처리: OUTER JOIN 사용 시 NULL 값 처리를 염두에 두고 데이터를 가공해야한다.
'Database > SQL' 카테고리의 다른 글
인덱스에 대해서 알아보자! (0) | 2024.12.27 |
---|---|
데이터베이스 튜닝에 대하여 (3) | 2024.12.26 |
데이터베이스 자료형에 대해 알아보자! (0) | 2024.12.18 |
[JPA] flush는 언제 일어날까? (1) | 2024.12.18 |
[DB] PK (Primary Key) ID 길이가 성능에 영향을 미칠까? (1) | 2024.12.11 |