
Oracle에서 데이터를 조회하다 보면 하나의 테이블만 사용하는 경우보다 여러 테이블을 함께 조회해야 하는 경우가 훨씬 많습니다.
예를 들어 회원 정보와 주문 정보를 함께 조회하거나, 사원 정보와 부서 정보를 같이 조회하는 것처럼 말입니다.
이때 사용하는 것이 JOIN입니다.
하지만 JOIN에는 INNER JOIN, LEFT JOIN, RIGHT JOIN 등 여러 종류가 있어 처음에는 어떤 JOIN을 사용해야 할지 헷갈리는 경우가 많습니다.
이번 글에서는 Oracle JOIN의 종류와 각각의 차이점, 언제 사용하는 것이 좋은지 예제를 통해 알아보겠습니다.
JOIN이란?
JOIN은 두 개 이상의 테이블을 하나의 결과로 연결하여 조회하는 기능입니다.
예를 들어 다음과 같은 두 개의 테이블이 있다고 가정해보겠습니다.
EMP (사원)
| EMPNO | ENAME | DEPTNO |
|---|---|---|
| 1001 | 홍길동 | 10 |
| 1002 | 김철수 | 20 |
| 1003 | 이영희 | 30 |
DEPT (부서)
| DEPTNO | DNAME |
|---|---|
| 10 | 개발팀 |
| 20 | 인사팀 |
EMP에는 부서번호만 있고 부서명은 없습니다.
이때 부서명까지 함께 조회하려면 JOIN을 사용합니다.
INNER JOIN
INNER JOIN은 양쪽 테이블 모두에 존재하는 데이터만 조회합니다.
가장 많이 사용하는 JOIN입니다.
SELECT
E.EMPNO,
E.ENAME,
D.DNAME
FROM EMP E
INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
결과
| EMPNO | ENAME | DNAME |
|---|---|---|
| 1001 | 홍길동 | 개발팀 |
| 1002 | 김철수 | 인사팀 |
EMPNO 1003은 부서번호가 30인데 DEPT 테이블에는 존재하지 않으므로 조회되지 않습니다.
INNER JOIN은 서로 매칭되는 데이터만 가져오고 싶을 때 사용합니다.
LEFT JOIN
LEFT JOIN은 왼쪽 테이블의 모든 데이터를 조회합니다.
오른쪽 테이블에 일치하는 데이터가 없으면 NULL이 출력됩니다.
SELECT
E.EMPNO,
E.ENAME,
D.DNAME
FROM EMP E
LEFT JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
결과
| EMPNO | ENAME | DNAME |
|---|---|---|
| 1001 | 홍길동 | 개발팀 |
| 1002 | 김철수 | 인사팀 |
| 1003 | 이영희 | NULL |
LEFT JOIN은 기준이 되는 테이블의 데이터는 모두 확인해야 할 때 많이 사용합니다.
예를 들어
- 회원 전체 조회
- 주문이 없는 회원 찾기
- 게시글은 있는데 댓글이 없는 게시글 찾기
등에서 자주 사용됩니다.
RIGHT JOIN
RIGHT JOIN은 오른쪽 테이블의 모든 데이터를 조회합니다.
왼쪽 테이블에 일치하는 데이터가 없으면 NULL이 출력됩니다.
SELECT
E.EMPNO,
E.ENAME,
D.DNAME
FROM EMP E
RIGHT JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
만약 DEPT 테이블에 다음과 같이 영업팀이 추가되어 있다면
| DEPTNO | DNAME |
|---|---|
| 10 | 개발팀 |
| 20 | 인사팀 |
| 40 | 영업팀 |
결과
| EMPNO | ENAME | DNAME |
|---|---|---|
| 1001 | 홍길동 | 개발팀 |
| 1002 | 김철수 | 인사팀 |
| NULL | NULL | 영업팀 |
실무에서는 RIGHT JOIN보다 LEFT JOIN을 사용하는 경우가 훨씬 많습니다.
필요하다면 테이블의 위치를 바꿔 LEFT JOIN으로 작성하는 경우도 많습니다.
JOIN 결과 비교
같은 데이터를 JOIN 방식에 따라 비교하면 다음과 같습니다.
| JOIN 종류 | 조회 결과 |
|---|---|
| INNER JOIN | 양쪽 모두 존재하는 데이터만 조회 |
| LEFT JOIN | 왼쪽 테이블은 모두 조회 |
| RIGHT JOIN | 오른쪽 테이블은 모두 조회 |
이 차이만 이해해도 대부분의 JOIN을 쉽게 사용할 수 있습니다.
언제 어떤 JOIN을 사용할까?
INNER JOIN
- 회원과 주문 정보 조회
- 사원과 부서 조회
- 주문과 상품 조회
서로 연결된 데이터만 필요할 때 사용합니다.
LEFT JOIN
- 주문하지 않은 회원 찾기
- 댓글이 없는 게시글 조회
- 부서가 없는 사원 확인
기준 테이블은 모두 조회해야 하는 경우 사용합니다.
RIGHT JOIN
LEFT JOIN과 동일한 기능이지만 기준 테이블이 오른쪽입니다.
실무에서는 사용 빈도가 높지 않습니다.
Oracle 구문과 ANSI JOIN
예전 Oracle에서는 다음처럼 JOIN을 작성했습니다.
SELECT
E.EMPNO,
E.ENAME,
D.DNAME
FROM EMP E,
DEPT D
WHERE E.DEPTNO = D.DEPTNO;
현재는 ANSI SQL 표준인 다음 방식이 권장됩니다.
SELECT
E.EMPNO,
E.ENAME,
D.DNAME
FROM EMP E
INNER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO;
JOIN 종류가 명확하게 보이고 유지보수도 쉬워 대부분의 프로젝트에서는 ANSI JOIN을 사용합니다.
요약
Oracle JOIN은 여러 테이블의 데이터를 하나의 결과로 조회하기 위해 사용하는 기능입니다.
INNER JOIN은 양쪽 모두 존재하는 데이터만 조회하며, LEFT JOIN은 왼쪽 테이블의 모든 데이터를, RIGHT JOIN은 오른쪽 테이블의 모든 데이터를 조회합니다.
실무에서는 INNER JOIN과 LEFT JOIN을 가장 많이 사용하며, 가독성과 유지보수를 위해 ANSI JOIN 문법을 사용하는 것이 일반적입니다.
자주 묻는 질문(FAQ)
Q. INNER JOIN과 LEFT JOIN의 가장 큰 차이는 무엇인가요?
INNER JOIN은 양쪽에 모두 존재하는 데이터만 조회하고, LEFT JOIN은 왼쪽 테이블의 모든 데이터를 조회합니다.
Q. RIGHT JOIN은 많이 사용하나요?
사용은 가능하지만 실무에서는 LEFT JOIN을 사용하는 경우가 훨씬 많습니다.
Q. Oracle의 (+) JOIN도 사용할 수 있나요?
가능합니다. 하지만 Oracle 고유 문법이며, 현재는 ANSI JOIN 문법(LEFT JOIN, INNER JOIN 등)을 사용하는 것이 권장됩니다.
Q. JOIN을 많이 사용하면 성능이 느려지나요?
JOIN 자체가 문제가 되는 것은 아닙니다. 인덱스 설계, 데이터 양, JOIN 조건 등에 따라 성능이 달라질 수 있습니다.
함께 보면 좋은 Oracle 글
