모던지 / SQL 개발자 / SQL 기본 및 활용 7강. 표준 조인

SQL 기본 및 활용 7강. 표준 조인

ON과 WHERE에 같은 조건을 써도 결과가 같습니다. 내부 조인일 때만요. 외부 조인에서는 전혀 다른 답이 나옵니다.

풀고 시작

문제 1. 왼쪽 외부 조인에서 오른쪽 테이블에 대한 조건을 ON 절이 아니라 WHERE 절에 쓰면 어떤 일이 생길까요?
ON은 조인을 만들 때 적용되고 WHERE는 조인이 끝난 결과에 적용됩니다. 짝이 없어 값이 없는 상태로 남은 행은 WHERE 조건을 통과하지 못하므로 외부 조인의 효과가 사라집니다.

왜 표준 문법이 생겼나

옛 방식은 FROM 절에 테이블을 나열하고 WHERE 절에 조인 조건을 적었습니다. 잘 동작하지만 두 가지 문제가 있었습니다. 조인 조건과 검색 조건이 한 절에 섞여 구별되지 않고, 외부 조인 표기가 제품마다 달라 이식되지 않았죠.

표준 SQL의 조인 문법은 이 둘을 해결합니다. 조인은 FROM 절에서 JOIN 키워드로 선언하고, 조인 조건은 ON 절에 씁니다. 그러면 WHERE 절에는 검색 조건만 남습니다. 문장을 읽는 사람이 "이건 잇는 조건, 이건 고르는 조건"을 눈으로 구분할 수 있게 되죠.

종류 특징
INNER JOIN 양쪽에 짝이 있는 행만 기본값이라 INNER는 생략 가능합니다
LEFT OUTER JOIN 왼쪽은 모두, 오른쪽은 있으면 짝 없는 쪽은 값이 없는 상태로 채워집니다
RIGHT OUTER JOIN 오른쪽은 모두, 왼쪽은 있으면 좌우를 바꾼 왼쪽 외부 조인과 같습니다
FULL OUTER JOIN 양쪽 모두 남김 양쪽의 짝 없는 행이 모두 나옵니다
CROSS JOIN 모든 조합 6강의 카티션 곱을 명시적으로 선언한 것입니다
NATURAL JOIN 같은 이름의 컬럼으로 자동 결합 조인 조건을 쓸 수 없습니다

NATURAL JOIN과 USING, 편한 만큼 위험한

NATURAL JOIN은 두 테이블에서 이름과 자료형이 같은 모든 컬럼을 찾아 자동으로 등호 조인을 걸어 줍니다. 조건을 한 줄도 쓰지 않아 편하죠. 그런데 성질이 몇 가지 까다롭습니다.

첫째, ON 절을 함께 쓸 수 없습니다. 조인 조건을 자동으로 만들었으니 사람이 끼어들 자리가 없습니다. 둘째, 조인에 쓰인 컬럼은 결과에 한 번만 나오고, 테이블 별칭을 붙여 참조할 수 없습니다. 셋째, 이것이 가장 위험한데, 이름이 같지만 의미가 다른 컬럼이 있으면 의도하지 않은 조인 조건이 조용히 추가됩니다. 등록일자라는 컬럼이 양쪽에 있으면 등록일자가 같은 행끼리만 붙습니다. 그래서 실무에서는 잘 쓰지 않습니다.

USING 절은 그 위험을 줄인 중간 형태입니다. 조인에 쓸 컬럼을 개발자가 직접 골라 적습니다. 그 컬럼 이름이 양쪽에 같아야 하고, 이때도 조인 컬럼은 결과에 한 번만 나오며 별칭을 붙여 참조할 수 없습니다. 컬럼 이름이 다르거나 조건이 등호가 아니면 ON 절을 써야 합니다. 결론은 단순합니다. ON을 쓰세요. 길어져도 무엇으로 이었는지가 문장에 남습니다.

ON과 WHERE의 차이, 외부 조인에서 갈립니다

이 강에서 반드시 가져가야 할 하나입니다.

내부 조인에서는 조건을 ON에 써도 WHERE에 써도 결과가 같습니다. 양쪽에 짝이 있는 행만 남기는 것이니 언제 걸러 내도 마찬가지죠. 그런데 외부 조인에서는 완전히 다릅니다.

왼쪽 외부 조인으로 고객과 주문을 이었다고 해 보죠. 주문이 없는 고객도 결과에 남고, 그 행의 주문 컬럼들은 값이 없는 상태입니다. 여기서 "주문금액이 만 원 이상"이라는 조건을 어디에 쓰느냐에 따라 답이 갈립니다.

ON 절에 쓰면 만 원 이상인 주문만 짝으로 인정합니다. 주문이 없거나 조건에 안 맞는 고객은 여전히 결과에 남고 주문 컬럼만 비어 있습니다. 즉 모든 고객 목록이 나옵니다. WHERE 절에 쓰면 조인이 다 끝난 뒤에 걸러 냅니다. 값이 없는 행은 조건을 통과하지 못하므로 사라지고, 결과는 만 원 이상 주문이 있는 고객만 남습니다. 사실상 내부 조인이 된 것이죠.

두 결과 모두 필요한 상황이 있으니 어느 쪽이 옳다고 말할 수는 없습니다. 다만 외부 조인을 썼는데 결과에서 없는 쪽이 안 보인다면 조건이 WHERE에 가 있는지 확인하는 것이 첫 번째 점검입니다. 실무에서 가장 자주 나오는 조인 버그입니다.

FULL OUTER JOIN과 조인의 순서

FULL OUTER JOIN은 양쪽의 짝 없는 행을 모두 남깁니다. 두 시스템의 데이터를 맞춰 볼 때 유용합니다. 한쪽에만 있는 건, 다른 쪽에만 있는 건, 양쪽에 다 있는 건이 한 번에 보이니까요. 이 문법을 지원하지 않는 제품에서는 왼쪽 외부 조인과 오른쪽 외부 조인을 합집합으로 묶어 흉내 냅니다. 9강에서 볼 UNION이 그 역할을 합니다.

조인을 여러 번 이어 쓸 때 순서도 중요합니다. 외부 조인을 내부 조인 뒤에 이어 붙이면, 앞의 내부 조인에서 이미 사라진 행은 되살아나지 않습니다. 반대로 외부 조인으로 남겨 둔 행에 다시 내부 조인을 붙이면 그 행이 사라집니다. 여러 테이블을 외부 조인으로 이을 때는 기준이 되는 테이블부터 시작해 한 방향으로만 이어 가는 편이 안전합니다.

다음 강은 서브쿼리입니다. 조인으로 풀 수 있는 문제와 서브쿼리로 풀어야 하는 문제를 가르는 기준까지 함께 봅니다.

인출 문제

문제 1. NATURAL JOIN에 대한 설명으로 옳지 않은 것은?
조인 조건을 자동으로 만들기 때문에 ON 절을 함께 쓸 수 없습니다. 이 통제 불가능성 때문에 실무에서는 컬럼을 직접 고르는 USING이나 ON을 씁니다.
문제 2. USING 절에 대한 설명으로 옳은 것은?
USING으로 지정한 컬럼은 하나로 합쳐지므로 별칭을 붙여 어느 쪽인지 가릴 수 없고 결과에도 한 번만 나옵니다. 이름이 다르거나 등호가 아닌 조건이면 ON을 써야 합니다.
문제 3. 왼쪽 외부 조인에서 오른쪽 테이블 조건을 ON 절에 쓴 경우와 WHERE 절에 쓴 경우의 차이는?
ON은 짝을 인정할 기준이고 WHERE는 조인이 끝난 결과를 걸러 내는 조건입니다. 값이 없는 상태로 남은 행은 WHERE 조건을 통과하지 못해 사라지므로 사실상 내부 조인이 됩니다.
문제 4. FULL OUTER JOIN을 지원하지 않는 환경에서 같은 결과를 만드는 방법으로 가장 적절한 것은?
양쪽의 짝 없는 행을 모두 남겨야 하므로 방향이 다른 두 외부 조인을 합집합으로 묶습니다. 합집합은 중복을 제거하므로 양쪽에 다 있는 행이 두 번 나오지도 않습니다.

더 풀기

출제기준의 세세항목을 따라 이 강의 범위에서 새로 낸 문제입니다. 모의고사도 여기에서 뽑습니다.

묶음 1

문제 1. 표준 조인 문법이 만들어진 가장 큰 이유는?
예전에는 외부 조인을 제품 고유의 기호로 표시했습니다. 표준 문법은 그 표기를 통일하고 조건의 역할도 문장에서 구분되게 했습니다.
문제 2. INNER JOIN과 조건절에 같음 조건을 쓴 조인의 관계로 옳은 것은?
내부 조인에서는 조인 조건을 ON에 쓰든 WHERE에 쓰든 결과가 같습니다. 다만 읽기 좋은 쪽은 ON입니다.
문제 3. CROSS JOIN을 가장 잘 설명한 것은?
CROSS JOIN은 카티션 곱을 의도적으로 만드는 문법입니다. 실수로 만든 것과 의도한 것을 문장에서 구분할 수 있게 해 줍니다.
문제 4. NATURAL JOIN의 동작으로 옳은 것은?
이름이 같은 컬럼을 전부 조인 조건으로 씁니다. 키인지 아닌지는 따지지 않습니다.
문제 5. NATURAL JOIN이 위험한 이유로 가장 알맞은 것은?
등록일 같은 흔한 이름이 양쪽에 생기는 순간 조인 조건이 하나 더 붙습니다. 오류도 나지 않고 결과만 줄어듭니다.
문제 6. NATURAL JOIN에서 조인에 쓰인 컬럼을 참조할 때의 규칙으로 옳은 것은?
자동 조인된 컬럼은 하나로 합쳐진 것으로 취급됩니다. 그래서 어느 쪽 테이블의 것인지 지정할 수 없습니다.
문제 7. USING 절을 가장 잘 설명한 것은?
USING은 NATURAL JOIN의 자동 선택을 사람이 지정하는 방식입니다. 이름이 같아야 쓸 수 있다는 제약은 그대로입니다.
문제 8. USING 절에 쓴 컬럼에 테이블 별칭을 붙이면 어떻게 되나요?
USING에 쓴 컬럼도 하나로 합쳐진 것으로 취급되어 소속을 지정할 수 없습니다. NATURAL JOIN과 같은 규칙입니다.
문제 9. ON 절이 USING이나 NATURAL JOIN보다 실무에서 선호되는 이유로 가장 알맞은 것은?
ON은 무엇으로 잇는지가 문장에 남습니다. 자동으로 정해지는 것이 없으니 나중에 조용히 달라질 일도 없습니다.
문제 10. LEFT OUTER JOIN에서 기준이 되는 테이블은?
왼쪽 테이블의 행은 짝이 없어도 모두 남고 오른쪽 컬럼이 NULL로 채워집니다.

묶음 2

문제 1. RIGHT OUTER JOIN을 LEFT OUTER JOIN으로 바꾸려면?
기준이 되는 쪽이 어디냐만 다릅니다. 순서를 바꾸면 같은 결과를 얻습니다.
문제 2. FULL OUTER JOIN을 가장 잘 설명한 것은?
두 집합의 합집합에 가까운 결과입니다. 어느 쪽에도 빠짐이 없어야 할 때 씁니다.
문제 3. 왼쪽 테이블 10건, 오른쪽 테이블 8건이고 그중 6건이 서로 짝지어질 때 FULL OUTER JOIN 결과 행 수는?
짝지은 여섯 행에 왼쪽만 있는 네 행과 오른쪽만 있는 두 행을 더해 열두 행입니다.
문제 4. 같은 상황에서 LEFT OUTER JOIN 결과 행 수는?
왼쪽 열 건이 모두 남습니다. 짝이 없는 네 건은 오른쪽 컬럼이 NULL이 됩니다.
문제 5. 같은 상황에서 INNER JOIN 결과 행 수는?
양쪽에서 조건이 참인 여섯 행만 남습니다.
문제 6. 외부 조인에서 조건을 ON에 쓸 때와 WHERE에 쓸 때 결과가 달라지는 이유로 가장 알맞은 것은?
ON에서 걸러진 행은 짝을 못 찾은 것으로 처리되어 기준 쪽이 남습니다. WHERE에서 걸러지면 그 행 자체가 사라집니다.
문제 7. 부서를 기준으로 왼쪽 외부 조인을 한 뒤 사원의 직급이 과장이라는 조건을 WHERE에 쓰면 어떤 일이 벌어지나요?
외부 조인의 의미가 사라지는 대표적인 실수입니다. 이럴 때는 그 조건을 ON에 써야 합니다.
문제 8. 같은 의도를 유지하려면 사원의 직급 조건을 어디에 써야 하나요?
ON에 쓰면 과장이 없는 부서도 사원 컬럼이 NULL인 채로 남습니다. 그것이 원래 의도입니다.
문제 9. 외부 조인을 한 뒤 짝이 없는 행만 골라내고 싶다면?
짝이 없으면 그쪽 컬럼이 NULL이 됩니다. 그 성질을 이용해 차집합에 해당하는 결과를 얻을 수 있습니다.
문제 10. 주문한 적이 없는 고객을 찾는 방법으로 가장 알맞은 것은?
외부 조인과 NULL 조건의 조합은 차집합을 구하는 고전적인 방법입니다. NOT EXISTS를 써도 같은 결과를 얻습니다.

묶음 3

문제 1. 세 개 이상의 테이블을 표준 조인 문법으로 이을 때의 처리 방식으로 옳은 것은?
왼쪽부터 차례로 결합합니다. 그래서 외부 조인이 섞이면 순서에 따라 결과가 달라질 수 있습니다.
문제 2. 외부 조인이 섞인 다중 테이블 조인에서 순서가 중요한 이유로 가장 알맞은 것은?
한 번 NULL이 된 컬럼은 다음 조인에서 짝을 찾지 못합니다. 그래서 어느 순서로 잇는지가 결과를 바꿉니다.
문제 3. CROSS JOIN을 의도적으로 쓰는 상황으로 가장 알맞은 것은?
데이터에 없는 조합까지 만들어야 할 때 기준 집합을 곱해 씁니다. 그 뒤 실제 데이터를 외부 조인으로 붙입니다.
문제 4. 표준 조인 문법에서 INNER 키워드를 생략하면 어떻게 되나요?
JOIN만 쓰면 내부 조인입니다. 마찬가지로 OUTER도 생략할 수 있어 LEFT JOIN은 LEFT OUTER JOIN과 같습니다.
문제 5. NATURAL JOIN과 CROSS JOIN을 함께 쓸 수 없는 이유로 가장 알맞은 것은?
조건을 자동으로 만드는 것과 조건을 두지 않는 것은 함께 성립할 수 없습니다.
문제 6. USING 절과 ON 절을 같은 조인에 함께 쓸 수 있나요?
조인 조건을 지정하는 방식은 하나만 고릅니다. 두 가지를 섞으면 문법 오류입니다.
문제 7. 표준 조인 문법이 조인 조건과 필터 조건을 나누어 적게 한 것이 주는 실무적 이점으로 가장 알맞은 것은?
조건이 한곳에 뒤섞여 있으면 의도를 알기 어렵습니다. 나누어 적으면 문장이 스스로 설명합니다.
문제 8. 왼쪽 외부 조인의 결과 행 수가 왼쪽 테이블 행 수보다 많아질 수 있나요?
외부 조인은 최소한 기준 쪽 행 수를 보장할 뿐 상한을 정하지는 않습니다. 일대다라면 결과는 늘어납니다.
문제 9. 부서 3건이고 각 부서에 사원이 각각 2명, 0명, 5명일 때 부서 기준 왼쪽 외부 조인 결과 행 수는?
두 행과 다섯 행에 사원이 없는 부서 한 행을 더해 여덟 행입니다.
문제 10. 다음 중 표준 조인에 대한 설명으로 옳지 않은 것은?
NATURAL JOIN은 키를 보지 않고 컬럼 이름과 자료형만 봅니다. 그래서 관계없는 컬럼이 조건에 끼어들 수 있습니다.

이전: 6강 조인의 원리 · 다음: 8강 서브쿼리

모던지 · 궁금하면 모던지 GitHub · 2026-09-10