[DB] Join SQL 정리

이현경·2026년 3월 21일

Database

목록 보기
4/13

📊 예시 데이터

Student

student_idname
1철수
2영희
3민수

Course

course_idtitle
101수학
102영어
103과학
104미술

CourseEnroll

student_idcourse_id
1101
1102
2103



1. 세타 조인

  • 형식: [INNER] JOIN ... ON ...
  • 조건: 두 테이블을 임의의 비교 연산자(=, <>, <, > 등)로 연결
-- 학생이 수강한 과목 중 특정 과목(예: course_id=101, 수학)을 제외한 나머지 과목을 조회하기
SELECT S.name, C.title
	FROM CourseEnroll CE
		INNER JOIN Student S ON CE.student_id=S.student_id
		INNER JOIN Course C ON CE.course_id=C.course_id
	WHERE CE.course_id<>101;


2. 동등 조인

  • 형식: [INNER] JOIN ... ON ...
  • 조건: 두 테이블을 동등 연산자(=)로 연결
-- 학생이 수강한 과목 조회하기
SELECT S.name, C.title
	FROM CourseEnroll CE
		INNER JOIN Student S ON CE.student_id=S.student_id
		INNER JOIN Course C ON CE.course_id=C.course_id;


3. 자연 조인

  • 형식: NATURAL JOIN ...
  • 조건: 두 테이블에서 동일한 이름의 컬럼을 자동으로 매칭
  • 자동 매칭
    • ON 조건 불필요
    • 주의점: 같은 이름의 컬럼이 여러 개 있으면 모두 조인 조건에 포함되어 원하지 않는 컬럼까지 조인될 수 있다.
  • 제어가 어려워 실무에서는 잘 쓰지 않는다.
-- 학생이 수강한 과목 조회하기
SELECT S.name, C.title
	FROM CourseEnroll CE
		Natural JOIN Student S
		Natural JOIN Course C;


4. 외부 조인

LEFT OUTER JOIN

  • 왼쪽 테이블의 모든 행을 포함하며, 매칭되지 않은 것은 NULL로 채움
  • 형식: LEFT [OUTER] JOIN … ON …
-- 모든 학생의 과목 수강 상태 표시. 수강 과목이 없으면 NULL
SELECT S.name, C.title
	FROM student S
		LEFT OUTER JOIN courseenroll CE ON S.student_id = CE.student_id
		LEFT OUTER JOIN course C ON CE.course_id = C.course_id;

✔️ 다중 조인의 구체적인 동작방식

-- 첫 번째 조인: student[왼] + courseenroll[오]
FROM student S
LEFT OUTER JOIN courseenroll CE ON S.student_id = CE.student_id
S.student_idS.nameCE.student_idCE.course_id
1철수1101
1철수1102
2영희2103
3민수NULLNULL
-- 두 번째 조인: (student + courseenroll)[왼] + course[오]
LEFT OUTER JOIN course C ON CE.course_id = C.course_id
S.student_idS.nameCE.student_idCE.course_idC.course_idC.title
1철수1101101수학
1철수1102102영어
2영희2103103과학
3민수NULLNULLNULLNULL

RIGHT OUTER JOIN

  • 오른쪽 테이블의 모든 행을 포함하며, 매칭되지 않은 것은 NULL로 채움
  • 형식: RIGHT [OUTER] JOIN … ON …
-- 모든 과목을 기준으로 수강상태 표시. 수강생이 없으면 NULL
SELECT C.title, S.name
	FROM Student S
		RIGHT OUTER JOIN CourseEnroll CE ON CE.student_id=S.student_id
		RIGHT OUTER JOIN Course C ON C.course_id=CE.course_id;

✔️ 다중 조인의 구체적인 동작방식

-- 첫 번째 조인: Student[왼] + CourseEnroll[오]
FROM Student S
RIGHT OUTER JOIN CourseEnroll CE ON CE.student_id=S.student_id
S.student_idS.nameCE.student_idCE.course_id
1철수1101
1철수1102
2영희2103
-- 두 번째 조인: (CourseEnroll + Student)[왼] + Course[오]
RIGHT OUTER JOIN Course C ON C.course_id=CE.course_id;
S.student_idS.nameCE.student_idCE.course_idC.course_idC.title
1철수1101101수학
1철수1102102영어
2영희2103103과학
NULLNULLNULLNULL104미술

FULL OUTER JOIN

  • 양쪽 테이블의 모든 행을 포함하며, 매칭되지 않은 것은 NULL로 채움
  • 구현 방법: LEFT + RIGHT JOIN을 UNION
-- LEFT JOIN: 학생 기준으로 모든 행 포함
SELECT s.name AS student_name, c.title AS course_title
	FROM student s
		LEFT JOIN courseenroll ce ON s.student_id = ce.student_id
		LEFT JOIN course c ON ce.course_id = c.course_id

UNION

-- RIGHT JOIN: 과목 기준으로 모든 행 포함
SELECT s.name AS student_name, c.title AS course_title
	FROM student s
		RIGHT JOIN courseenroll ce ON s.student_id = ce.student_id
		RIGHT JOIN course c ON ce.course_id = c.course_id;


5. 세미 조인

  • 한쪽 테이블의 행이 다른 테이블에 존재하는지 존재 여부만 확인
  • 결과는 중복 없이 왼쪽 테이블 행만 반환
  • 구현 방법: WHERE절에 EXISTS 혹은 IN을 사용
-- EXISTS 사용 예
-- 수강과목이 있는 학생들만 표시.  과목정보는 표시 X
SELECT s.name
	FROM student s
	WHERE EXISTS (
	  SELECT 1
		  FROM courseenroll ce
		  WHERE ce.student_id = s.student_id
	);

✔️ SELECT 1을 사용하는 이유

  • EXISTS는 조건에 맞는 데이터가 존재하는지 존재 여부만 궁금할 뿐 정확히 어떤 데이터가 있는지는 관심이 없다.
  • 무겁게 데이터를 반환하지 않고 가벼운 1만을 받아서 존재여부를 판단
  • 1을 반환하면 존재한다는 의미 / 아무것도 반환하지 않는다면 존재하지 않는다는 의미.

-- IN 사용 예
-- 만약 s.student_id에 NULL 이 있으면 결과는 달라지므로 처리해야 함. EXISTS 권장
SELECT s.name
	FROM student s
	WHERE s.student_id IN (
	  SELECT ce.student_id
		  FROM courseenroll ce
	);

✔️ IN 동작방식

  1. 서브쿼리 실행하여 명단 만들기
  2. 메인 쿼리 대조하기
    : student 테이블에서 student_id를 하나씩 꺼내와 서브쿼리 명단과 일일이 대조

✔️ 주의해야 할 점 - NULL

SQL에서 NULL은 비어있는 값이 아니라 ‘아직 모르는 값(Unknown)’이라는 의미를 가진다.

  • 예1) NULL IN (1, 1, 2)
    • NULL이 1, 2일 수도 있는 가능성 존재 → UNKNOWN → FALSE 처리
  • 예2) 3 NOT IN (1, 2, NULL)
    • NULL이 3일 수도 있는 가능성 존재 → UNKNOWN → 아무것도 출력X

EXISTS 사용 권장!


EXISTS / IN 실행 결과



요약

  • 세타조인: 다양한 비교 연산자 활용
  • 동등조인: = 조건으로 매칭 (가장 흔함)
  • 자연조인: 동일 컬럼 자동 매칭 (실무에서는 잘 안 씀)
  • 외부조인: 매칭 안 돼도 행 유지 (LEFT/RIGHT/FULL)
  • 세미조인: 존재 여부만 확인 (EXISTS, IN)
profile
커피 한 잔의 여유를 아는 품격있는 여자

0개의 댓글