본문으로 바로가기

SQL JOIN 결과 행 수 계산: 중복 키·LEFT JOIN·NULL까지

같은 키의 행 개수를 곱하고 미일치 행을 더하는 방식으로 INNER·LEFT·FULL JOIN 결과를 계산해요. WHERE와 DISTINCT가 행 수를 바꾸는 경우도 확인해요.

INNER JOIN은 조건을 만족하는 행의 쌍을 모두 만들어요. 같은 조인 키가 왼쪽에 m행, 오른쪽에 n행 있으면 그 키에서 m × n행이 나와요. LEFT JOIN은 여기에 짝이 없는 왼쪽 행을 한 행씩 남겨요. 왼쪽 행 수와 항상 같다고 계산하면 안 돼요.

아래 설명은 별도 필터·DISTINCT·그룹화·LIMIT을 적용하기 전의 결과를 기준으로 해요. 등가 조인은 일반적인 등호 조건을 사용하며 NULL과 NULL을 같다고 처리하는 특별한 연산은 사용하지 않아요.

작은 표로 직접 세어 봐요

다음 L·R은 새로 만든 설명용 테이블이며 기출 자료가 아니에요. id는 각 행의 식별자이고 code는 중복되거나 NULL일 수 있는 조인 열이에요.

L.idL.codeR.idR.code
l110r110
l210r210
l320r320
l430r440
l5NULLr5NULL

읽기 편하게 두 테이블을 나란히 놓았어요. 같은 줄에 적혀 있다는 이유로 두 행이 연결되는 것은 아니에요. 연결 여부는 L.code = R.code로 판단해요.

code왼쪽 행 수오른쪽 행 수등호 조인에서 일치하는 쌍
10224
20111
30100
40010
NULL110

code 10에서는 (l1,r1), (l1,r2), (l2,r1), (l2,r2) 네 쌍이 생겨요. code 20에서 한 쌍을 더하므로 INNER JOIN은 5행이에요. NULL = NULL은 참이 아니므로 NULL 행끼리는 연결되지 않아요.

JOIN 종류별 결과를 비교해요

연산세는 방법위 예시 결과
CROSS JOIN모든 행의 조합, 5 × 525행
INNER JOIN조건이 참인 쌍, 4 + 15행
LEFT JOIN일치한 5행 + 미일치 왼쪽 l4·l57행
RIGHT JOIN일치한 5행 + 미일치 오른쪽 r4·r57행
FULL OUTER JOIN일치한 5행 + 양쪽 미일치 4행9행

LEFT JOIN의 실제 결과를 펼치면 다음과 같아요. 결과의 순서는 ORDER BY를 지정하지 않는 한 보장되지 않아요.

SELECT L.id AS left_id, R.id AS right_id
FROM L LEFT JOIN R ON L.code = R.code;
left_idright_id
l1r1
l1r2
l2r1
l2r2
l3r3
l4NULL
l5NULL

여기서 마지막 두 행의 right_id는 대응하는 R 행이 없어서 채워진 NULL이에요. 원래 R의 r5 행이 l5와 연결된 것이 아니에요.

LEFT JOIN 뒤의 WHERE가 결과를 바꿔요

다음 쿼리는 LEFT JOIN 결과를 만든 뒤 오른쪽 code가 10인 행만 남겨요.

SELECT L.id, R.id
FROM L LEFT JOIN R ON L.code = R.code
WHERE R.code = 10;

위 예시에서는 4행이 남아요. l3는 code 20이어서 제거되고, l4·l5의 오른쪽 code는 NULL이어서 WHERE 조건을 통과하지 못해요.

반대로 조건을 ON에 넣으면 왼쪽 행은 보존돼요.

SELECT L.id, R.id
FROM L LEFT JOIN R
  ON L.code = R.code AND R.code = 10;

이번에는 code 10의 네 쌍과, 일치하지 않은 l3·l4·l5 각 한 행이 남아 7행이에요. 행 수만 우연히 원래 LEFT JOIN과 같을 뿐, l3의 오른쪽 값은 r3가 아니라 NULL로 달라져요. ON은 일치 조건, WHERE는 조인 결과를 남길 조건이라는 차이를 읽어야 해요.

DISTINCT·COUNT도 따로 확인해요

쿼리의 변화위 예시에서의 결과이유
INNER JOIN 후 L.code만 SELECT5행: 10 네 개와 20 한 개같은 값도 기본적으로 남아요
INNER JOIN 후 SELECT DISTINCT L.code2행: 10과 20선택한 값 조합의 중복을 제거해요
LEFT JOIN 후 COUNT(*)7미일치로 만들어진 행도 세어요
LEFT JOIN 후 COUNT(R.id)5R.id가 NULL인 두 행은 세지 않아요

COUNT(R.id)가 여기서 일치 행 수와 같은 것은 예시의 R.id가 모든 원래 행에서 NULL이 아닌 식별자이기 때문이에요. NULL이 허용되는 다른 열을 세면, 실제로 일치한 행도 COUNT에서 빠질 수 있어요.

문제를 풀 때 확인할 순서

  1. CROSS JOIN인지, 어떤 ON 조건이 있는지 읽어요. 단순 등가 조인이라면 키별로 양쪽 행 수를 세어요.
  2. 일치하는 키별로 행 수를 곱해 더해요. 키가 중복되지 않는다는 조건을 임의로 가정하지 않아요.
  3. OUTER JOIN이면 보존하는 쪽의 미일치 행을 한 행씩 더해요. NULL의 등호 비교도 따로 확인해요.
  4. WHERE, DISTINCT, GROUP BY, 집계, LIMIT 등이 결과를 어떻게 바꾸는지 순서대로 반영해요.

수록 기출에서 기초를 확인해요

정보처리기사 2021년 2회 52번은 카티션 프로덕트의 차수와 카디널리티를 묻는 문항이에요. 열 수는 더하고 행 수는 곱하므로, 저장된 정답은 ③: 차수 10, 카디널리티 35예요. CROSS JOIN의 모든 조합을 세는 원리와 연결할 수 있어요.

같은 회차 42번은 DISTINCT의 위치를 포함한 SELECT 문법 문제이며 저장된 정답은 ②예요. 중복 제거는 WHERE의 역할이 아니라 SELECT DISTINCT로 지정한다는 점을 확인해요. 이 두 기출은 각각 모든 조합과 중복 처리의 기초를 연습하는 문항이며, 위의 INNER·OUTER JOIN 예시 자체가 기출이라는 뜻은 아니에요.

문서와 수록 문항의 확인일은 2026년 10월 29일이에요. SQL 예시는 PostgreSQL의 JOIN·NULL·중복 처리 규칙을 기준으로 설명했어요.

개념 확인 자료

기출에서 확인해 보세요

수록된 실제 문항으로 이동해 직접 답을 골라보세요.