JOIN에서 ON과 WHERE 비교하기
조건이 ON에 들어가야 하는지 WHERE에 들어가야 하는지와 이것이 결과에 중요한 이유를 알아봅니다.
JOIN에서 ON과 WHERE 비교하기은(는) CoddyKit의 무료 SQL Interview Prep 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
조건식은 두 위치에 놓을 수 있습니다
INNER JOIN을 작성할 수 있게 되면 다음 면접 질문은 더 날카로워집니다. 이 조건은 ON에 넣어야 할까요, WHERE에 넣어야 할까요?
INNER JOIN에서는 결과에 영향을 주지 않는 경우가 많습니다. 하지만 외부 조인으로 바꾸는 순간 선택에 따라 결과가 완전히 달라집니다. 초보자가 습관적으로 모든 조건을 WHERE에 넣기 때문에 면접관은 바로 이 점을 질문합니다.
이 레슨에서는 이 규칙을 명확하게 설명합니다.
ON의 역할
ON 절은 행을 어떻게 짝지을지 정의합니다. 조인이 구성되는 동안 실행되며, 왼쪽 테이블의 어떤 행이 오른쪽 테이블의 어떤 행과 일치하는지 결정합니다.
ON은 다음 질문에 답한다고 생각하십시오. "이 두 행은 함께 속하는가?"
SELECT c.name, o.amount
FROM customers c
JOIN orders o
ON o.customer_id = c.id; -- pairing ruleWHERE의 역할
WHERE 절은 조인이 결합된 행을 만든 후에 실행됩니다. 결과 집합을 필터링하여 검사를 통과하지 못한 행을 버립니다.
WHERE는 다음 질문에 답한다고 생각하십시오. "이제 행을 조인했으니, 그중 어떤 행을 유지할 것인가?"
SELECT c.name, o.amount
FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 30; -- filter after pairingINNER JOIN에서는 대개 결과가 같습니다
INNER JOIN에서는 추가 필터를 ON과 WHERE 중 어디에 넣든 같은 결과를 얻습니다. 아래 두 질의는 Ada의 $50 주문과 Bob의 $99 주문만 반환합니다.
일치하지 않는 행은 이미 내부 조인에서 제거되므로 조건식을 옮겨도 어떤 행이 남는지는 달라지지 않습니다.
-- predicate in ON
SELECT c.name, o.amount FROM customers c
JOIN orders o
ON o.customer_id = c.id AND o.amount > 30;
-- predicate in WHERE -- same result here
SELECT c.name, o.amount FROM customers c
JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 30;조인 키에는 여전히 ON을 선호하는 이유
결과가 같더라도 일반적으로 다음과 같이 작성합니다. 조인 관계 조건은 ON에 넣고 업무 필터는 WHERE에 넣습니다.
- ON:
o.customer_id = c.id(테이블이 어떻게 관계되는지) - WHERE:
o.amount > 30(어떤 결과를 원하는지)
이렇게 분리하면 다음 독자와 작성자의 스타일을 평가하는 면접관 모두 의도를 쉽게 파악할 수 있습니다.
정말 중요한 경우: 외부 조인
오른쪽 행과 일치하는 행이 없어도 모든 왼쪽 행을 유지하는 LEFT JOIN에서는 이 구분이 결정적으로 중요해집니다. 고객과 주문을 사용해 간단히 살펴보면 Cleo에게는 주문이 없습니다.
LEFT JOIN은 주문 열이 NULL인 Cleo도 유지합니다. 이제 ON과 WHERE가 Cleo에게 어떤 영향을 주는지 살펴보십시오.
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id;
-- keeps Ada, Bob, AND Cleo (NULL amount)ON에 조건 넣기: 행이 보존됩니다
amount > 30 조건을 LEFT JOIN의 ON에 넣으면 연결되는 오른쪽 행만 결정합니다. 일치하지 않는 왼쪽 행은 NULL과 함께 여전히 유지됩니다.
Cleo는 남습니다. 검사를 통과하지 못한 주문은 연결되지 않을 뿐이며 NULL이 남습니다.
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o
ON o.customer_id = c.id AND o.amount > 30;
-- Ada 50, Bob 99, Cleo NULL (3 rows, Cleo kept)WHERE에 조건 넣기: 외부 조인이 무너집니다
같은 조건을 WHERE로 옮기면 조인된 결과를 필터링하게 됩니다. Cleo의 행에는 amount = NULL이 있고 NULL > 30은 참이 아니므로 Cleo가 제거됩니다.
LEFT JOIN이 조용히 INNER JOIN처럼 동작하게 됩니다. 이는 면접에서 가장 잘 알려진 조인 함정입니다.
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.amount > 30;
-- Ada 50, Bob 99 (Cleo GONE -> back to inner-join behavior)외워 둘 규칙
면접에서는 다음과 같이 명확하게 설명하십시오.
- ON의 조건은 오른쪽 행을 연결할지 결정하며, 왼쪽 행은 보존합니다.
- WHERE의 조건은 최종 행을 필터링하므로 NULL일 수 있는 열에 적용하면 보존된 왼쪽 행을 제거할 수 있습니다.
따라서 외부 조인에서는 일치하지 않는 행을 의도적으로 제거하려는 경우가 아니라면 선택적 테이블에 대한 조건식을 ON에 넣으십시오.
WHERE에서 NULL을 조건으로 사용하는 정당한 경우
외부 조인된 열을 WHERE에서 필터링하는 것이 정확히 올바른 경우도 하나 있습니다. 바로 안티 조인입니다. IS NULL을 검사하면 일치하는 행이 없었던 왼쪽 행을 찾을 수 있습니다.
여기서 WHERE는 의도적으로 일치하지 않는 행만 유지하여 주문이 하나도 없는 고객을 반환합니다. 작동 방식은 같지만 의도는 반대입니다.
SELECT c.name
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
WHERE o.id IS NULL; -- customers with no orders -> Cleo빠른 사고 점검
퀴즈를 풀기 전에 조인 조건을 볼 때 다음 점검표를 사용하십시오.
- 테이블을 연결하는 조인 키인가요? -> ON.
- 필수 테이블에 대한 필터인가요? -> WHERE와 ON 모두 괜찮습니다.
- 선택적(외부) 테이블에 대한 필터이고 일치하지 않는 행을 유지하고 싶나요? -> ON.
- 불일치하는 행을 찾고 싶나요? -> WHERE ... IS NULL.
빠른 확인
외부 조인에 ON과 WHERE 규칙을 적용합니다.
복습: ON과 WHERE
면접에서 기억해야 할 핵심 내용입니다.
- ON은 짝짓기를 제어하며, 외부 조인에서는 유지되는 쪽을 보존하면서 선택적 행을 연결할지 결정합니다.
- WHERE는 이미 조인된 결과를 필터링하므로 보존된 행을 제거할 수 있습니다.
- INNER JOIN에서는 둘을 서로 바꾸어도 결과가 같은 경우가 많지만, 외부 조인에서는 그렇지 않습니다.
- 외부 테이블에 대한 필터는
IS NULL을 WHERE에 사용한 안티 조인을 의도한 경우가 아니라면 ON에 넣어야 합니다.
자주 묻는 질문
“JOIN에서 ON과 WHERE 비교하기” 강의는 무료인가요?
네 — “JOIN에서 ON과 WHERE 비교하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Interview Prep 강의 전체를 잠금 해제할 수 있습니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
“JOIN에서 ON과 WHERE 비교하기”에서 뭘 배우나요?
조건이 ON에 들어가야 하는지 WHERE에 들어가야 하는지와 이것이 결과에 중요한 이유를 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
SQL Interview Prep을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 SQL Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“JOIN에서 ON과 WHERE 비교하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 SQL Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 SQL Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- INNER JOIN이 행을 일치시키는 방식
- JOIN에서 ON과 WHERE 비교하기
- JOIN의 확장과 행 복제
- 세 개 이상의 표 JOIN하기