코-딩/SQL

SQL - JOIN

ㅋㅂㅋ 2025. 7. 22. 14:27

INNER JOIN (일치하는 행만)

- 양쪽 테이블에 모두 존재하는 데이터만 출력

SELECT *
FROM students s
INNER JOIN scores sc
ON s.id = sc.student_id;
 
 

LEFT JOIN (왼쪽 기준, 오른쪽은 없어도 됨)

- students에는 있지만 scores에는 없는 학생도 포함 (이 경우 NULL이 나옴)

SELECT *
FROM students s
LEFT JOIN scores sc
ON s.id = sc.student_id;
 
 

RIGHT JOIN (오른쪽 기준, 왼쪽은 없어도 됨)

- scores에는 있지만 students에 없는 경우도 포함됨

SELECT *
FROM students s
RIGHT JOIN scores sc
ON s.id = sc.student_id;
 

FULL OUTER JOIN (둘 다 기준, 일치하지 않아도 모두 출력)

 

- 왼쪽, 오른쪽 모두 포함하고 일치하지 않으면 NULL로 채움

- 일부 DB에서는 FULL OUTER JOIN을 지원하지 않음

SELECT *
FROM students s
FULL OUTER JOIN scores sc
ON s.id = sc.student_id;
 
- full outer join을 지원하지 않는다면 UNION 을 사용한다. (중복 제거. 중복 제거 불필요시 UNION ALL)
 
SELECT *
FROM students s
LEFT JOIN scores sc
ON s.id = sc.student_id;
UNION
SELECT *
FROM students s
RIGHT JOIN scores sc
ON s.id = sc.student_id;

UNION / UNION ALL

- UNION은 내부적으로 SORT하거나 GROUP BY처럼 작동하여 중복을 제거.

- UNION ALL은 중복 제거 없이 전체 합치기만

 

중복을 신경 쓸 필요 없는 로그성 데이터, 집계 전 중간 데이터 결합, 성능이 중요한 대용량 데이터의 경우 UNION ALL이 더 효율적이다.

 

CROSS JOIN (모든 조합)

 

- 학생 수 × 과목 수 만큼 결과가 나옴 (곱집합)

SELECT *
FROM students s
CROSS JOIN subjects sub;

 

가능한 모든 조합을 만들어야 하는 상황, 카테고리나 날짜 조합의 생성, 통계 분석이나 시뮬레이션 시에 사용한다.