SQLD 시험 대비: JOIN에서 ON과 WHERE 차이
SQLD 시험에서는 JOIN 문을 사용할 때 ON과 WHERE의 차이가 결과에 미치는 영향을 이해하는 것이 매우 중요합니다. 특히 INNER JOIN과 LEFT JOIN에서 ON과 WHERE의 차이를 묻는 문제가 자주 출제됩니다.
1. 예제 테이블 생성
employees 테이블
employee_id | name | department_id |
1 | Alice | 10 |
2 | Bob | 20 |
3 | Charlie | 30 |
4 | David | NULL |
5 | Emma | 20 |
departments 테이블
department_id | department_name |
10 | HR |
20 | Sales |
30 | IT |
40 | Marketing |
2. INNER JOIN에서 ON과 WHERE 차이 -> 없음
🔹 INNER JOIN은 ON과 WHERE를 어디에 쓰든 결과가 동일합니다.
✅ ON에서 필터링
SELECT e.employee_id, e.name, d.department_name
FROM employees e
INNER JOIN departments d
ON e.department_id = d.department_id
AND d.department_name = 'Sales';
🔹 결과
employee_id | name | department_name |
2 | Bob | Sales |
5 | Emma | Sales |
-> 부서가 Sales 인 사람의 ID와 이름을 출력함
✅ WHERE에서 필터링
SELECT e.employee_id, e.name, d.department_name
FROM employees e
INNER JOIN departments d
ON e.department_id = d.department_id
WHERE d.department_name = 'Sales';
🔹 결과
employee_id name department_name
2 | Bob | Sales |
5 | Emma | Sales |
-> 부서가 Sales 인 사람의 ID와 이름을 출력함
🟢 결론: INNER JOIN에서는 ON과 WHERE의 위치에 상관없이 동일한 결과가 나옵니다.
3. LEFT JOIN에서 ON과 WHERE 차이
🔹 LEFT JOIN에서는 ON과 WHERE의 위치에 따라 결과가 달라짐!
✅ ON에서 필터링
SELECT e.employee_id, e.name, d.department_name
FROM employees e
LEFT JOIN departments d
ON e.department_id = d.department_id
AND d.department_name = 'Sales';
🔹 결과
employee_id | name | department_name |
1 | Alice | NULL |
2 | Bob | Sales |
3 | Charlie | NULL |
4 | David | NULL |
5 | Emma | Sales |
🟢 설명:
- 'Sales' 부서만 매칭됨.
- 'Sales'가 아닌 부서는 NULL로 남음.
- 직원은 그대로 유지됨.
✅ WHERE에서 필터링
SELECT e.employee_id, e.name, d.department_name
FROM employees e
LEFT JOIN departments d
ON e.department_id = d.department_id
WHERE d.department_name = 'Sales';
🔹결과
employee_id | name | department_name |
2 | Bob | Sales |
5 | Emma | Sales |
🟢 설명:
- 조인된 후 WHERE d.department_name = 'Sales' 조건이 적용됨.
- 'Sales'가 아닌 행들은 삭제됨.
- 결과적으로 INNER JOIN과 동일하게 동작.
4. 차이점 정리
구분 | ON에서 필터링 | WHERE에서 필터링 |
INNER JOIN | 결과 동일 | 결과 동일 |
LEFT JOIN | 'Sales'가 아닌 부서는 NULL로 남음 | 'Sales'가 아닌 직원 자체가 제거됨 (INNER JOIN처럼 동작) |
✅ LEFT JOIN에서 ON을 사용하면 직원 정보는 유지되지만, 조건에 맞지 않는 부서 정보가 NULL로 남음.
✅ LEFT JOIN에서 WHERE를 사용하면 조건에 맞지 않는 직원 자체가 제거됨.
5. SQLD 기출 유형 문제
📌 유형 1: INNER JOIN에서 ON과 WHERE의 위치에 따른 차이
- INNER JOIN에서는 ON과 WHERE이 결과에 영향을 미치지 않음.
- 즉, ON에서 필터링하든, WHERE에서 필터링하든 동일한 결과가 출력됨.
🔹 기출 예제 1 (OX 문제)
다음 두 SQL문의 결과는 동일하다. (O / X)
-- SQL 1 (ON에서 필터링)
SELECT e.employee_id, e.name, d.department_name
FROM employees e
INNER JOIN departments d
ON e.department_id = d.department_id
AND d.department_name = 'Sales';
-- SQL 2 (WHERE에서 필터링)
SELECT e.employee_id, e.name, d.department_name
FROM employees e
INNER JOIN departments d
ON e.department_id = d.department_id
WHERE d.department_name = 'Sales';
✅ 정답: (O)
👉 INNER JOIN에서는 ON과 WHERE의 위치가 다르더라도 결과는 동일합니다.
📌 유형 2: 결과가 동일한 SQL 문 찾기
다음 중 실행 결과가 다른 것은? (①, ②, ③, ④ 중 선택)
-- ① ON에서 필터링
SELECT e.employee_id, e.name, d.department_name
FROM employees e
LEFT JOIN departments d
ON e.department_id = d.department_id
AND d.department_name = 'Sales';
-- ② WHERE에서 필터링
SELECT e.employee_id, e.name, d.department_name
FROM employees e
LEFT JOIN departments d
ON e.department_id = d.department_id
WHERE d.department_name = 'Sales';
-- ③ INNER JOIN 사용
SELECT e.employee_id, e.name, d.department_name
FROM employees e
INNER JOIN departments d
ON e.department_id = d.department_id
AND d.department_name = 'Sales';
-- ④ LEFT JOIN 후 NULL을 허용하는 WHERE 조건 추가
SELECT e.employee_id, e.name, d.department_name
FROM employees e
LEFT JOIN departments d
ON e.department_id = d.department_id
WHERE d.department_name IS NULL OR d.department_name = 'Sales';
✅ 정답: ①
👉 ①과 ②의 차이를 주의해야 함.
- ① ON에서 필터링 → 'Sales'가 아닌 부서는 NULL로 남음 (직원은 유지됨).
- ② WHERE에서 필터링 → 'Sales'가 아닌 직원이 삭제됨 (사실상 INNER JOIN처럼 동작).
- ③은 원래 INNER JOIN이므로 ②와 동일한 결과.
- ④는 'Sales' 부서 직원과, 부서 정보가 NULL인 직원까지 출력됨.
6. 결론
- INNER JOIN은 ON과 WHERE을 어디에 써도 결과가 동일합니다.
- LEFT JOIN에서 ON을 사용하면 필터링되지 않은 행은 NULL이 남음, WHERE을 사용하면 필터링되지 않은 행이 완전히 삭제됨.
- 성능 최적화와 논리적인 데이터 유지 여부를 고려하여 ON과 WHERE을 적절히 사용해야 합니다.
이제 SQLD 시험에서 JOIN에서 ON과 WHERE의 차이를 묻는 문제를 만나도 당황하지 않고 해결할 수 있을 것입니다! 🚀
💡 도움이 되셨다면 댓글과 공감 부탁드립니다! 😊
📌 더 많은 알고리즘 풀이와 프로그래밍 자료는 블로그에서 확인하세요!
✉️ 문의나 피드백은 댓글이나 이메일로 남겨주세요.
'자격증 > SQLD' 카테고리의 다른 글
[SQLD] 오답 노트 및 핵심 문제 (0) | 2025.02.28 |
---|---|
[SQLD SP02] 물리적 JOIN(조인)의 모든 것 (0) | 2025.02.27 |
[SQLD] 5-2: 데이터 정의어(DDL) & 데이터 제어어(DCL) (0) | 2025.02.22 |
[SQLD] 5-1: 데이터 조작어 (DML) 와 트랜잭션 제어(TCL) (0) | 2025.02.22 |
[SQLD] PART 5: 관리 구문(DML, TCL, DDL, DCL) (0) | 2025.02.22 |