LEFT JOIN과 일치하지 않는 행 보존하기
LEFT JOIN이 보존하는 값과 일치하지 않는 행에 NULL이 나타나는 방식을 알아봅니다.
LEFT JOIN과 일치하지 않는 행 보존하기은(는) CoddyKit의 무료 SQL Interview Prep 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Interview Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
면접 상황
면접관이 다음과 같이 말합니다. "모든 고객과 해당 고객의 주문을 나열하되, 한 번도 주문하지 않은 고객도 포함하십시오." INNER JOIN은 주문이 없는 고객을 제외하므로 이 요구 사항을 충족하지 못합니다. 따라서 LEFT JOIN을 사용해야 합니다.
LEFT JOIN은 왼쪽(먼저 이름이 나온) 테이블의 모든 행을 유지하고, 오른쪽 테이블에 일치하는 행이 있을 때 이를 연결합니다. 이 과정을 통해 면접관이 기대하는 정확한 사고방식을 익힐 수 있습니다.
LEFT JOIN이 보장하는 것
핵심 약속은 다음과 같습니다. 왼쪽 테이블의 모든 행은 일치 여부와 관계없이 출력에 최소 한 번 나타납니다.
- 왼쪽 행이 오른쪽에서 일치하는 행을 찾으면 일치하는 행마다 출력 행이 하나씩 생깁니다.
- 왼쪽 행이 일치하는 행을 하나도 찾지 못해도 출력 행은 하나 생기며, 오른쪽 테이블의 모든 열은
NULL로 설정됩니다.
이 때문에 면접관은 이를 외부 조인이라고 부릅니다. 일치 집합에서 벗어난 행도 버리지 않고 보존하기 때문입니다.
두 테이블
이 단원에서는 간단한 두 테이블을 계속 사용합니다. customers에는 모든 고객이 들어 있고, orders에는 구매 기록이 저장되며 customer_id를 통해 고객을 참조합니다.
고객 3(Carol)에게는 orders에 해당하는 행이 없습니다. 이 일치하지 않는 고객이 바로 LEFT JOIN이 보존해야 하는 대상입니다.
-- customers
-- id | name
-- 1 | Alice
-- 2 | Bob
-- 3 | Carol
-- orders
-- id | customer_id | amount
-- 10 | 1 | 50
-- 11 | 1 | 75
-- 12 | 2 | 20LEFT JOIN 작성하기
구문은 내부 조인과 비슷하지만 INNER를 LEFT로 바꿉니다. (OUTER라는 단어는 선택 사항이므로 LEFT JOIN과 LEFT OUTER JOIN은 동일합니다.)
키워드 앞에 작성된 테이블이 보존되는 왼쪽입니다. 순서가 중요합니다. customers LEFT JOIN orders은 모든 고객을 유지하며, 모든 주문을 유지하는 것이 아닙니다.
SELECT c.name, o.amount
FROM customers c
LEFT JOIN orders o
ON o.customer_id = c.id;결과 읽기
다음은 해당 질의의 출력 결과입니다. Alice는 두 번 일치하므로 두 번 나타납니다. Bob은 한 번 일치합니다. Carol은 전혀 일치하지 않았지만 amount 열이 NULL인 상태로 여전히 나타납니다.
NULL인 Carol의 행 하나가 LEFT JOIN의 특징입니다. 면접관이 여러분의 사고 과정을 듣고 있다면 다음과 같이 말해야 합니다. "일치하지 않는 왼쪽 행은 오른쪽에 NULL 값이 있는 상태로 남습니다."
-- name | amount
-- Alice | 50
-- Alice | 75
-- Bob | 20
-- Carol | NULL <-- preserved, no matchNULL은 어디에서 생기는가
NULL은 어디엔가 저장되어 있는 값이 아닙니다. 오른쪽 테이블에서 amount를 제공할 행이 없기 때문에 데이터베이스가 이를 만들어 냅니다.
오른쪽 테이블에서 가져온 모든 열은 일치하지 않는 왼쪽 행에 대해 NULL이 됩니다. Carol의 행에서는 o.id, o.customer_id, o.amount가 모두 NULL입니다. 이는 중요한 차이입니다. o.customer_id가 NULL이라는 것은 고객에게 식별자가 없다는 뜻이 아니라, 일치하는 주문 자체가 없었다는 뜻입니다.
고객별 주문 수 세기
자주 나오는 추가 질문은 다음과 같습니다. "주문이 없는 고객도 포함하여 고객마다 주문이 몇 개인지 어떻게 구하겠습니까?" LEFT JOIN과 COUNT를 사용하면 정확히 해결할 수 있지만, *이 아니라 오른쪽 테이블의 열을 세어야 합니다.
COUNT(o.id)는 NULL을 무시하므로 Carol의 결과는 0입니다. COUNT(*)는 생성된 NULL 행도 행으로 세기 때문에 Carol에 대해 잘못하여 1을 반환합니다.
SELECT c.name, COUNT(o.id) AS order_count
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;
-- Alice | 2
-- Bob | 1
-- Carol | 0COUNT(*)과 COUNT(열)의 함정
이는 면접에서 자주 나오는 전형적인 함정입니다. LEFT JOIN 뒤에는 일치하지 않는 왼쪽 행이 오른쪽 열에 NULL이 있는 상태로 결과에 실제로 존재합니다.
COUNT(*)는 해당 행을 세므로 주문이 없는 고객에 대해 1을 반환합니다.COUNT(o.id)는 NULL을 건너뛰므로 정확하게 0을 반환합니다.
정확한 0이 필요하다면 일치하는 행이 없을 때 NULL이 되는 열을 항상 세십시오.
-- WRONG: Carol shows 1
SELECT c.name, COUNT(*) AS n
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;LEFT JOIN으로 합계 구하기
COUNT 이외의 집계 함수도 생성된 NULL을 자연스럽게 처리합니다. SUM은 NULL을 무시하므로 일치하지 않는 고객의 결과는 오류가 아니라 NULL이 됩니다.
면접관은 보고서에서 NULL 대신 0을 원하는 경우가 많습니다. 집계 함수를 COALESCE로 감싸 기본값을 대신 사용하십시오.
SELECT c.name,
COALESCE(SUM(o.amount), 0) AS total_spent
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;
-- Alice | 125
-- Bob | 20
-- Carol | 0왼쪽 테이블과 오른쪽 테이블을 정확히 말하기
면접관이 "어느 테이블이 보존되나요?"라고 물으면 자신 있게 다음과 같이 답하십시오. JOIN 키워드의 왼쪽에 있는 테이블입니다. 왼쪽에서 오른쪽으로 읽으면 됩니다.
A LEFT JOIN B는 A를 모두 유지한다는 뜻입니다. B를 모두 유지하려면 B LEFT JOIN A로 순서를 바꾸거나 RIGHT JOIN을 사용하면 됩니다. 대부분의 팀은 가독성을 위해 RIGHT JOIN을 전혀 사용하지 않고, 단순히 테이블 순서를 바꿉니다.
사고 과정 점검표
면접에서 LEFT JOIN을 보면 다음 점검표를 소리 내어 확인하십시오.
- 보존되는 쪽? 왼쪽 테이블이며, 모든 행이 유지됩니다.
- 일치하지 않는 행? 오른쪽에서 가져온 NULL 값과 함께 한 번 나타납니다.
- 개수를 세는가? 정확한 0을 얻으려면
COUNT(right_col)을 사용합니다. - 합계를 구하는가? NULL이 아닌 0이 필요하다면
COALESCE로 감쌉니다.
이 점검표를 말로 설명하면 숙련된 수준의 엄밀함을 보여 줄 수 있습니다.
간단한 확인
개수 세기를 통해 LEFT JOIN에 대한 감각을 확인해 보십시오.
요약
LEFT JOIN은 왼쪽 테이블의 모든 행을 보존합니다. 일치하는 왼쪽 행은 오른쪽의 일치하는 행과 연결되고, 일치하지 않는 왼쪽 행은 오른쪽 테이블의 모든 열이 NULL인 상태로 한 번 남습니다.
- 왼쪽 테이블은
JOIN키워드 앞에 있는 테이블입니다. - 생성된 NULL은 일치하는 행이 없는 경우를 나타냅니다.
COUNT(right_col)은 정확한 0을 제공하지만COUNT(*)은 그렇지 않습니다.COALESCE(SUM(...), 0)은 NULL인 합계를 0으로 바꿉니다.
이는 앞으로 나올 단원에서 누락된 데이터와 안티 조인을 찾는 기반이 됩니다.
자주 묻는 질문
“LEFT JOIN과 일치하지 않는 행 보존하기” 강의는 무료인가요?
네 — “LEFT JOIN과 일치하지 않는 행 보존하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Interview Prep 강의 전체를 잠금 해제할 수 있습니다. SQL Interview Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
“LEFT JOIN과 일치하지 않는 행 보존하기”에서 뭘 배우나요?
LEFT JOIN이 보존하는 값과 일치하지 않는 행에 NULL이 나타나는 방식을 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Interview Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
SQL Interview Prep을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 SQL Interview Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“LEFT JOIN과 일치하지 않는 행 보존하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 SQL Interview Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 SQL Interview Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- LEFT JOIN과 일치하지 않는 행 보존하기
- RIGHT 및 FULL OUTER JOIN의 의미
- 일치하는 값이 없는 행 찾기(안티 조인)
- 외부 JOIN에서 WHERE를 사용하는 함정