데이터베이스/Oracle SQL

오라클 SQL과 PL/SQL ( OUTER JOIN )

동띠기 2021. 8. 13. 00:13

OUTER JOIN ( 아우터 조인)

INNER JOIN은 모든 테이블에 데이터가 존재하는 경우에만 결과값을 출력했습니다.
OUTER JOIN은 INNER JOIN과 반대로 한쪽 테이블에는 데이터가 있고 한쪽 테이블에 없는 경우에 데이터가 있는 쪽 테이블의 내용을 전부 출력하는 방법입니다.
앞에서 살펴본 학생 테이블과 교수테이블의 예에서 학생은 있는데 지도규사가 결정이 안되었을 경우 이너조인으로는 학생이름이나 교수이름이 조회가 안되었습니다.
반드시 지도교수가 결정되지 않은 학생의 이름이나 교수의 이름까지 다 나와야 하는 경우라면 아우터 조인을 사용하면 됩니다.
모든 데이터를 다 출력할 수 있기 때문에 좋을 것 같지만 이 조인방식은 DB성능에 아주 나쁜 영향을 줄 수 있습니다.
만약 A , B 테이블을 조회한다고 하고 A테이블에 데이터를 다 검색하는 경우 A테이블에 인덱스가 있어도 인덱스를 쓰지 않고 FULL SACN하기 떄문입니다.
그리고 아우터 조인이 발생할 경우 튜닝에서 아주 중요하게 생각하는 조인 순서가 고정되어 사용자의 뜻대로 변경할 수 없기 떄문에 아주 심각한 문제를 유발할 수도 있습니다.
그리고 아우터 조인은 오라클과 다른 구문의 차이가 있으니 주의하세요 !

사용 예1. 학생 테이블과 교수 테이블을 조인하여 학생이름과 지도교수 이름을 출력하세요, 단 지도교수가 결정되지 않은 학생의 명단도 함께 출력하세요.

 

SELECT * FROM STUDENT;
SELECT * FROM PROFESSOR;

 

ORACLE

SELECT S.NAME, P.NAME
FROM STUDENT S, PROFESSOR P
WHERE S.PROFNO = P.PROFNO(+);

+기호가 보이실 겁니다. 교수번호 쪽에 +기호가있는데 학생은 존재하지만 교수가 없는 내용을 출력해야 하기에 교수 조건 쪽에 + 기호를 붙인 겁니다.

ANSI

SELECT S.NAME, P.NAME
FROM STUDENT S LEFT OUTER JOIN PROFESSOR P
ON S.PROFNO = P.PROFNO;

ORACLE에서는 데이터가 없는 쪽에 +를 표시하지만 ANSI는 데이터가 존재하는 쪽에 표시를 해줍니다.
LEFT OUTER JOIN이라는 구문은 데이터가 존재하는 쪽에 표시를 하기 때문에 이런 구문을 사용한 것이고 ON 조건절중에 = 기호를 기준으로 왼쪽인 학생데이터는 존재하고 교수가 없으니 왼쪽 조건에는 데이터가 있는 행을 출력하기 위해 LEFT구문을 사용한것 입니다.

사용 예2. 학생테이블과 교수테이블을 조인하여 학생 이름과 지도교수 이름을 출력하세요. 단 지도학생이 결정되지 않은 교수의 명단도 함께 출력하세요.

 

ORACLE 

SELECT S.NAME STU , P.NAME PRO
FROM STUDENT S, PROFESSOR P
WHERE S.PROFNO(+) = P.PROFNO
ORDER BY S.NAME;

ANSI

SELECT S.NAME, P.NAME
FROM STUDENT S RIGHT OUTER JOIN PROFESSOR P
ON S.PROFNO = P.PROFNO
ORDER BY S.NAME;

사용 예1번과 반대되는 상황입니다.


사용 예3. 학생테이블과 교수테이블을 조인하여 지도학생이 결정 안된 교수, 지도교수가 결정안된 학생명단을 한꺼번에 출력하세요.

 

ORACLE 

SELECT S.NAME STU , P.NAME PRO
FROM STUDENT S, PROFESSOR P
WHERE S.PROFNO(+) = P.PROFNO
UNION 
SELECT S.NAME STU , P.NAME PRO
FROM STUDENT S, PROFESSOR P
WHERE S.PROFNO = P.PROFNO(+);

사용 예3은 살펴본 두가지 아우터조인결과를 합쳐서 만들어야 합니다. 
이 경우 오라클은 FULL OUTER JOIN을 지원하지 않습니다. 그래서 UNION을 사용하여 결과를 합쳐서 출력시키는 방법을 많이 사용합니다.

ANSI는 훨씬 간단한 방법을 제공합니다.

ANSI

SELECT S.NAME STU , P.NAME PRO
FROM STUDENT S FULL OUTER JOIN PROFESSOR P
ON S.PROFNO = P.PROFNO
728x90