데이터 분석 15일차
✅ JOIN을 사용할 때 ON 절에서 추가적인 조건을 넣을 수 있다.
✅ 조인을 수행할 때 특정한 조건을 적용하여 원하는 데이터를 필터링할 수 있다.
✅ LEFT JOIN, INNER JOIN 등에서 ON과 WHERE의 차이가 있음.
SELECT 컬럼들 FROM A JOIN B ON A.컬럼 = B.컬럼 AND 추가 조건✔️
ON절에서AND를 사용하면 조인을 수행하는 과정에서 필터링됩니다.
✔️ 이 방식은WHERE절에서 필터링하는 것과 다르다!
🚀 ON에서 필터링하면, 조인할 때 특정 데이터만 매칭
🚀 WHERE에서 필터링하면, 조인이 끝난 후 추가적으로 필터링
📌 예제 테이블
📅 students 테이블 (학생 정보)
| student_id | name |
|---|---|
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |
📚 enrollments 테이블 (수강 신청 기록)
| student_id | course_name | enrollment_date |
|---|---|---|
| 1 | Math | 2023-01-10 |
| 1 | Science | 2023-02-15 |
| 2 | Math | 2022-12-01 |
| 3 | History | 2023-05-20 |
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_id | name | course_name | enrollment_date |
|---|---|---|---|
| 1 | Alice | Math | 2023-01-10 |
| 1 | Alice | Science | 2023-02-15 |
| 2 | Bob | NULL | NULL |
| 3 | Charlie | History | 2023-05-20 |
✅ 조인할 때 enrollment_date >= '2023-01-01' 조건을 적용
✅ 조건을 만족하지 않는 경우(Bob)은 NULL이 반환됨
✅ 학생 정보는 그대로 유지되면서, 2023년 이후 수강 신청한 정보만 매칭됨
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_id | name | course_name | enrollment_date |
|---|---|---|---|
| 1 | Alice | Math | 2023-01-10 |
| 1 | Alice | Science | 2023-02-15 |
| 3 | Charlie | History | 2023-05-20 |
🚨 문제점:
✅ 결론:
✅ 조인할 때만 필요한 데이터를 가져오려면 ON에서 조건 추가
✅ LEFT JOIN에서 NULL을 유지하려면 ON에서 필터링
✅ 조인 후 추가 필터링하려면 WHERE 사용