본문 바로가기
자격증/SQLD

[SQLD SP01]JOIN에서 ON과 WHERE 차이

by rnasterofmysea 2025. 2. 26.
728x90
반응형

 

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의 차이를 묻는 문제를 만나도 당황하지 않고 해결할 수 있을 것입니다! 🚀

 

 


 

💡 도움이 되셨다면 댓글과 공감 부탁드립니다! 😊
📌 더 많은 알고리즘 풀이와 프로그래밍 자료는 블로그에서 확인하세요!
✉️ 문의나 피드백은 댓글이나 이메일로 남겨주세요.

 

 

728x90
반응형