SQL- Join on절에 세부 조건

hyun-jin·2025년 3월 11일

데이터 분석

목록 보기
17/100
post-thumbnail

데이터 분석 15일차

🔥 JOIN의 ON 절에서 세부 조건 넣기 정리

✅ JOIN을 사용할 때 ON 절에서 추가적인 조건을 넣을 수 있다.
✅ 조인을 수행할 때 특정한 조건을 적용하여 원하는 데이터를 필터링할 수 있다.
✅ LEFT JOIN, INNER JOIN 등에서 ON과 WHERE의 차이가 있음.

1. 기본 JOIN ON 문법

SELECT 컬럼들
FROM A JOIN B ON A.컬럼 = B.컬럼 AND 추가 조건

✔️ ON 절에서 AND를 사용하면 조인을 수행하는 과정에서 필터링됩니다.
✔️ 이 방식은 WHERE 절에서 필터링하는 것과 다르다!


2. JOIN ON vs WHERE 차이점

🚀 ON에서 필터링하면, 조인할 때 특정 데이터만 매칭
🚀 WHERE에서 필터링하면, 조인이 끝난 후 추가적으로 필터링


📌 예제 테이블

📅 students 테이블 (학생 정보)

student_idname
1Alice
2Bob
3Charlie

📚 enrollments 테이블 (수강 신청 기록)

student_idcourse_nameenrollment_date
1Math2023-01-10
1Science2023-02-15
2Math2022-12-01
3History2023-05-20

📌 1) ON 조건으로 필터링 (조인 전에 필터링)

SELECT s.student_id, s.name, e.course_name, e.enrollment_date
FROM students s
LEFT JOIN enrollments e ON s.student_id = e.student_id 
     AND e.enrollment_date >= '2023-01-01';

✔️ 출력 결과

student_idnamecourse_nameenrollment_date
1AliceMath2023-01-10
1AliceScience2023-02-15
2BobNULLNULL
3CharlieHistory2023-05-20

✅ 조인할 때 enrollment_date >= '2023-01-01' 조건을 적용
✅ 조건을 만족하지 않는 경우(Bob)은 NULL이 반환됨
✅ 학생 정보는 그대로 유지되면서, 2023년 이후 수강 신청한 정보만 매칭됨


📌 2) WHERE 조건으로 필터링 (조인 후 필터링)

SELECT s.student_id, s.name, e.course_name, e.enrollment_date
FROM students s
LEFT JOIN enrollments e 
    ON s.student_id = e.student_id
WHERE e.enrollment_date >= '2023-01-01';

✔️ 출력 결과

student_idnamecourse_nameenrollment_date
1AliceMath2023-01-10
1AliceScience2023-02-15
3CharlieHistory2023-05-20

🚨 문제점:

  • LEFT JOIN을 사용했지만 WHERE에서 e.enrollment_date >= '2023-01-01'를 걸면 Bob이 사라짐
  • 조건을 만족하지 않는 학생(Bob)이 제거됨 → 사실상 INNER JOIN처럼 동작

✅ 결론:

  • ON에서 조건을 주면 학생(Bob) 정보는 유지되면서 조인되는 데이터만 필터링됨
  • WHERE에서 조건을 주면 조건을 만족하지 않는 학생(Bob)이 아예 삭제됨

🎯 JOIN ON에서 조건을 사용할 때 주의할 점

✅ 조인할 때만 필요한 데이터를 가져오려면 ON에서 조건 추가
✅ LEFT JOIN에서 NULL을 유지하려면 ON에서 필터링
✅ 조인 후 추가 필터링하려면 WHERE 사용


SQl문제 풀면서 또 새로운걸 알게 되었다~^^

0개의 댓글