Oracle SQL 강좌
Outer Join (LEFT, RIGHT, FULL OUTER JOIN) 35 29 99,999+

by 구루비 OUTER JOIN LEFT OUTER JOIN RIGHT OUTER JOIN FULL OUTER JOIN [2002.01.20]


Outer Join 이란?

  • - Equi Join은 조인을 생성하려는 두 개의 테이블의 한쪽 컬럼에서 값이 없다면 테이터를 반환하지 못한다.
  • - 동일 조건에서 조인 조건을 만족하는 값이 없는 행들을 조회하기 위해 Outer Join을 사용 한다.
  • - Outer Join 연산자는 "(+)" 이다.
  • - 조인시 값이 없는 조인측에 "(+)"를 위치 시킨다.
  • - Outer Join 연산자는 표현식의 한 편에만 올 수 있다.

Outer Join 예제

Equi Join과 Outer Join의 비교.

 
-- Equi Join 으로 부서 번호를 조회하는 예제
SELECT DISTINCT(e.deptno), d.deptno, d.dname
  FROM emp e, dept d
 WHERE e.deptno = d.deptno;

DEPTNO     DEPTNO
------ ----------
    10         10
    20         20
    30         30

-- Outer Join 으로 부서 번호를 조회하는 예제
SELECT DISTINCT(e.deptno), d.deptno
  FROM emp e, dept d
 WHERE e.deptno(+) = d.deptno;

DEPTNO  DEPTNO
 ------- --------
     10       10
     20       20
     30       30
              40

Outer Join을 사용하는 테이블에 추가로 조건절이 있다면 (+)연산자를 모두 해야 한다.

 
-- ename LIKE 조건절에 (+)연산자가 누락된 경우
SELECT DISTINCT(a.deptno), b.deptno
  FROM emp a, dept b
 WHERE a.deptno(+) = b.deptno
   AND a.ename LIKE '%';

DEPTNO     DEPTNO
---------- ----------
        10         10
        20         20
        30         30

-- ename LIKE 조건절에 (+)연산자를 추가해야 정상적으로 데이터가 조회 된다. 
SELECT DISTINCT(a.deptno), b.deptno
  FROM emp a, dept b
 WHERE a.deptno(+) = b.deptno
   AND a.ename(+) LIKE '%';

DEPTNO  DEPTNO
 ------- --------
     10       10
     20       20
     30       30
              40

LEFT, RIGHT, FULL Outer Join

Oracle9i 부터는 ANSI/ISO SQL 표준인 LEFT OUTER JOIN , RIGHT OUTER JOIN, FULL OUTER JOIN를 지원 한다.

LEFT OUTER JOIN

LEFT OUTERL JOIN은 오른쪽 테이블(아래 예제에서 emp테이블)에 조인시킬 컬럼의 값이 없는 경우 사용한다.

-- LEFT OUTER JOIN 조인 예제
SELECT DISTINCT(e.deptno), d.deptno
  FROM dept d 
  LEFT OUTER JOIN emp e
  ON d.deptno = e.deptno;  

RIGHT OUTER JOIN

RIGHT OUTERL JOIN은 왼쪽 테이블(아래 예제에서 emp테이블)에 조인시킬 컬럼의 값이 없는 경우 사용한다.

-- RIGHT OUTER JOIN 조인 예제
SELECT DISTINCT(e.deptno), d.deptno
  FROM emp e 
 RIGHT OUTER JOIN dept d
    ON e.deptno = d.deptno;

FULL OUTER JOIN

FULL OUTERL JOIN은 양쪽 테이블 모두 Outer Join걸어야 하는 경우 사용 한다.

-- FULL OUTER JOIN 조인 예제
SELECT DISTINCT(e.deptno), d.deptno
  FROM emp e 
  FULL OUTER JOIN dept d
    ON e.deptno = d.deptno;

참고링크

- 강좌 URL : http://www.gurubee.net/lecture/1021

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

by soda [2004.05.13 18:20:05]
20개요~

b 테이블을 기준으로 생기리라고 봅니다.

by smile [2005.11.09 20:03:46]
퍼갑니다.

by 허륜 [2006.03.17 15:56:15]
개인적으로는 ANSI 표준이 사용하기가 간편하던데.. ^^

by 지나가는놈 [2007.05.09 17:57:24]
테이블 3,4개씩 조인해보세요.. 안시가 쉽나.. 걍 + 쓰시길..

by kiss [2007.09.11 12:02:56]
퍼퍼갑니다.

by 채준 [2007.10.01 17:43:56]
저두 갠적으로 ANSI가 더 명확하게 보인는듯한 느낌이 드는데요..^^

by 김덕봉 [2008.03.04 17:29:19]
오라클만의 문법으로 쿼리를 작성하는 것보다 ANSI 표준을 지키면서 작성하면 여러모로 장점이 많습니다. 타 DB로의 이전이 쉽고, 상호간의 관리가 용이합니다. 표준은 좋은 것이죠~

by 빼인트 [2008.03.16 00:37:23]
저도 ANSI.. 훨씬 보기 편한..
9i방식도 익숙해지면 괜찮을 거 같은데.. 아직은 어색하다는..ㅋ

by 궁금이 [2008.06.27 14:50:23]
☞ LEFT OUTER JOIN
왼쪽 테이블에 조인시킬 컬럽의 값이 없는 경우 사용합니다.

---> 이거 아닌거 같은데요..그 반대가 아닐까요????

by 궁금이 [2008.06.27 14:54:36]
☞ LEFT OUTER JOIN
왼쪽 테이블에 조인시킬 컬럽의 값이 없는 경우 사용합니다.

--> 왼쪽 테이블에 조인시킬 컬럽의 값이 오른쪽 테이블에 없는 경우 사용합니다.
이건가요????

by 김기열 [2008.09.02 09:50:00]
쉽게 설명해주셔서 감사합니다.

by MJW [2009.06.14 17:28:01]
9I에서 PL/SQL내에서는 표준 OUTER JOIN를 사용하면 에러가 나는 것을 알고 있습니다. 참고 하십시오.

by 옹네 [2009.06.25 11:29:44]
select a.id, b.name
from a, b
where a.id =+ b.id

요런쿼리를 보았어요...

=+

이것도 outer join 인가요???


by 허륜 [2009.12.16 09:16:23]
테이블 3,4개씩 조인할때도 ANSI가 쉽던데요..
ㅎㅎ아마도 기존 +에 너무 익숙해서 그럴거에요..

by finecomp [2009.12.16 11:06:42]
*=나 =* 는 MSSQL에서 아우터조인을 하던 예전 방식으로 오라클의 (+)와 사용법이 비슷합니다.

by guest [2010.05.11 15:26:36]
left outer join이랑 RIGHT OUTER JOIN 설명이 바뀐거 같은데요.

by 김정식 [2010.05.12 17:05:19]
guest님 감사합니다.
잘 못 설명된 부분 수정 하였습니다.

by 오상철 [2011.05.06 09:36:40]
오타요.ㅎㅎㅎ

left join, right join 설명부분에 컬럼을 컬럽으로.. 되있네요

오른쪽 테이블(아래 예제에서 emp 테이블)에 조인시킬 컬럽의 값이 없는 경우 사용한다.


by 김정식 [2011.05.12 00:19:21]
오상철님 오타수정하였습니다. 감사합니다. ^^

by 김컴 [2011.08.04 17:02:10]
퍼갑니다..
설명이 알아먹기 쉽게 되있어서 좋아요..

by 조인 [2011.12.20 16:09:56]
설명이 참 이해하기 쉽게 되어있네요. 감사합니다. :)

by 무대광풍 [2012.01.18 17:46:48]
설명이 간편하고 좋습니다. -_-/

by 손님 [2012.06.01 17:38:49]
Equi Join 문장들의 한 가지 제약점은 그것들이 조인을 생성하려 하는 두 개의 테이블의 두 개 컬럼에서 공통된 값이 없다면 테이블로부터 테이터를 반환하지 못하는 것이다

이 위에서 테이블로부터 테이터를 반환하지 못하는것이다에

테이터가 데이터의 오타인거같아서 한자 적어봅니다''a...

by 서병준 [2012.10.29 21:02:43]
distinct ㄱ ㅏ 중복 제가 맞지요?? 

아 왜 이해가 안가지...

by 비비엘소프트 [2016.03.09 10:34:37]

좋은 강좌 감사합니다.

오타정정 건의입니다. 글 하단부에

LEFT OUTERL JOIN은 오른쪽 테이블... -> OUTER

RIGHT OUTERL JOIN은 왼쪽 테이블... -> OUTER

FULL OUTERL JOIN은 양쪽 테이블... -> OUTER

가 아닌지요?


by 우리집아찌 [2016.04.26 15:33:53]

아웃털~ ^^*


by 화수요일 [2017.01.12 14:16:47]

아 정말 감사합니다. 

left join 으로 하다가 옛날쿼리에서 (*) 이게 나와가지고 이걸로 코딩 하는데 자꾸 아우터 조인이 안되는데

추가 조건절에도 (+) 연산자를 붙일 줄은 생각도 못했습니다. 하... 아까운 내 시간 ㅠㅠ

감사합니다 덕분에 해결 했습니다.


by 이태훈 [2017.02.28 13:29:30]

select distinct(e.deptno), d.deptno, d.dname
from emp e
right outer join dept d 
on e.deptno=d.deptno;

이 구문에서 left outer join 과 full outer join 수행 결과를 보면

출력 된 값의 데이터의 정렬 결과가 right outer join (위 구문) 과는 달리 desc 로 나오는데 이유가 먼가요?

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입