내부 조인과 외부 조인의 차이: 남는 행·NULL·왼쪽 외부 조인과 오른쪽 외부 조인·SQL 작성법 비교
조인(JOIN)은 두 테이블의 행을 ON으로 지정한 조건(대개 외래 키와 기본 키의 값이 같은 것)으로 조합해 하나의 결과 테이블을 만드는 연산입니다. 내부 조인은 조건에 맞는 짝이 있는 행의 조합만 결과에 남기고, 짝이 없는 행은 어느 테이블의 것이든 사라집니다. 외부 조인은 일치하는 조합에 더해, 지정한 쪽 테이블의 행을 짝이 없어도 남기고 상대 테이블의 열을 NULL로 채웁니다. 왼쪽 테이블의 행을 모두 남기는 것이 왼쪽 외부 조인(LEFT OUTER JOIN), 오른쪽을 남기는 것이 오른쪽 외부 조인(RIGHT OUTER JOIN), 양쪽을 남기는 것이 완전 외부 조인(FULL OUTER JOIN)입니다. '짝이 없는 행도 결과에 내고 싶은가'로 골라 씁니다.
| 비교 항목 | 내부 조인(INNER JOIN) | 외부 조인(OUTER JOIN) |
|---|---|---|
| 결과에 남는 행 | 조인 조건에 맞는 행의 조합만 | 일치하는 조합에 더해, 남기는 쪽으로 지정한 테이블에서 일치하는 짝이 없는 행 |
| 짝이 없는 행의 처리 | 왼쪽과 오른쪽 어느 테이블의 행이든 결과에서 사라진다 | 남기는 쪽의 행은 상대 테이블의 열을 NULL로 하여 1행으로 남는다. 남기는 쪽이 아닌 테이블의 행은 사라진다 |
| 종류 | 1종류. INNER를 생략하고 JOIN이라고만 써도 된다 | 왼쪽 외부 조인(LEFT), 오른쪽 외부 조인(RIGHT), 완전 외부 조인(FULL)의 3종류. OUTER는 생략해도 된다 |
| SQL 작성 예 | SELECT … FROM 사원 INNER JOIN 부서 ON 사원.부서ID = 부서.부서ID | SELECT … FROM 사원 LEFT OUTER JOIN 부서 ON 사원.부서ID = 부서.부서ID |
| 결과 행 수의 예(사원 4명 중 1명은 부서ID가 NULL, 부서 3개 중 1개는 사원이 없음) | 3행. 부서ID가 NULL인 사원과 사원이 없는 부서는 나오지 않는다 | 사원 테이블을 남기는 왼쪽 외부 조인에서는 4행(부서ID가 NULL인 사원은 부서명이 NULL이 된다). 양쪽을 남기는 완전 외부 조인에서는 5행 |
| 테이블을 쓰는 순서 | 왼쪽과 오른쪽을 바꾸어도 결과 행은 같다(열의 순서는 바뀐다) | 왼쪽 외부 조인과 오른쪽 외부 조인에서는 어느 테이블을 왼쪽에 쓰느냐에 따라 결과가 바뀐다. A LEFT OUTER JOIN B와 B RIGHT OUTER JOIN A는 같은 행을 반환한다 |
| 상대 테이블의 열에 대한 조건 | ON에 쓰든 WHERE 절에 쓰든 결과는 같다 | WHERE 절에 쓰면 NULL로 채운 행이 조건을 만족하지 못해 사라지고, 내부 조인과 같은 결과가 되는 경우가 있다. 짝이 없는 행도 남기고 싶을 때는 ON에 쓴다 |
| 주요 용도 | 양쪽 테이블에 데이터가 갖추어진 것만 쓰고 싶을 때(주문에 고객 이름을 붙이는 등) | 짝이 없는 행도 포함해 목록을 만들고 싶을 때(부서가 지정되지 않은 사원도 포함한 사원 목록 등), 짝이 없는 행을 찾고 싶을 때 |
수치는 대략적인 자릿수 기준이며, 공정 세대와 제품에 따라 달라져요.