데이터베이스 연구실.log

OUTER JOIN

조인 조건에 맞지 않는 행까지 보여 주는 OUTER JOIN을 Oracle (+) 문법과 ANSI LEFT, RIGHT, FULL OUTER JOIN으로 쓰는 방법과 (+) 연산자의 제약

OUTER JOIN(+)LEFT OUTER JOINRIGHT OUTER JOINFULL OUTER JOIN

#핵심 요약

outer join은 equi join으로는 볼 수 없는 결과(상대 테이블에 짝이 없는 행)를 볼 때 씀

Oracle 문법은 데이터가 모자란 쪽 컬럼에 (+)를 붙임
e.deptno (+) = d.deptno는 사원이 없는 부서까지 보여 줌

ANSI 문법은 LEFT, RIGHT, FULL OUTER JOIN ... ON임
양쪽 모두를 보려면 FULL OUTER JOIN을 씀

Oracle은 (+) 연산자보다 FROM 절의 OUTER JOIN 문법을 쓰라고 권함

#개념과 동작 원리

보고 싶은 행 Oracle 문법 ANSI 문법
사원이 없는 부서(40번)까지 e.deptno (+) = d.deptno emp e RIGHT OUTER JOIN dept d ON (...)
부서가 없는 사원(부서 70 사원)까지 e.deptno = d.deptno (+) emp e LEFT OUTER JOIN dept d ON (...)
메모리와 SPFILE 실습에서는 (+) = (+)로 시도한 뒤 ANSI로 해야 한다고 적음 emp e FULL OUTER JOIN dept d ON (...)

(+) 연산자의 제약:

  1. (+)는 WHERE 절(또는 TABLE 절의 왼쪽 상관 문맥)에만 쓸 수 있음
  2. 바깥 쿼리와 안쪽 쿼리에 나뉜 두 테이블에는 outer join이 되지 않음
  3. 테이블을 자기 자신과 (+)로 outer join할 수 없음
    셀프 조인 자체는 됨
  4. (+)는 컬럼에만 붙일 수 있고 임의의 식에는 붙일 수 없음
    식 안의 컬럼에는 붙일 수 있음
  5. (+)가 있는 조건은 OR로 다른 조건과 묶을 수 없고, IN으로 식과 비교할 수 없음
  6. 테이블 B의 컬럼을 상수와 비교하는 조건이 있으면 그 컬럼에도 (+)를 붙여야 함
    아니면 경고나 오류 없이 일반 조인 결과만 나옴

#필수 명령어 또는 SQL

#사원이 없는 부서까지

SQL Developer 또는 SQL*Plus조회만 함
SELECT e.ename, e.job, e.sal, d.loc
  FROM emp e, dept d
 WHERE e.deptno (+) = d.deptno;

SELECT e.ename, e.job, e.sal, d.loc
  FROM emp e RIGHT OUTER JOIN dept d
    ON (e.deptno = d.deptno);

결과 해석: 개별 실행 출력은 기재 없음

#부서가 없는 사원까지

실습에서는 dept에 없는 부서번호 70의 사원을 넣었음

SQL Developer 또는 SQL*Plus객체 또는 설정을 변경함
INSERT INTO emp (empno, ename, sal, deptno)
VALUES (8392, 'JACK', 3400, 70);
COMMIT;
SQL Developer 또는 SQL*Plus조회만 함
SELECT e.ename, d.loc
  FROM emp e LEFT OUTER JOIN dept d
    ON (e.deptno = d.deptno);

결과 해석: 개별 실행 출력은 기재 없음

#양쪽 모두

SQL Developer 또는 SQL*Plus조회만 함
SELECT e.ename, e.job, e.sal, d.loc
  FROM emp e FULL OUTER JOIN dept d
    ON (e.deptno = d.deptno);

결과 해석: 부서가 없는 사원(JACK)과 사원이 없는 부서(BOSTON)가 함께 나옴(실습 데이터 기준 해석)
실습에서는 같은 결과를 e.deptno (+) = d.deptno (+)로 시도했고 "반드시 1999 ANSI 문법으로 수행해야 한다"고 적었음
양쪽에 (+)를 붙인 문장의 오류 내용은 기재 없음

#사용 조건과 주의사항

실습 쇼핑몰 실습의 비회원 주문(고객번호 NULL)은 고객 테이블과 equi join하면 빠지고, 주문 테이블 쪽을 살리는 outer join으로 볼 수 있음(동등 조인과 비동등 조인)

SEO_HKabsumveritas@gmail.comBuilt with Claude Code & Codex

마지막 갱신 개인 학습 기록이며 운영 환경 적용 전 공식 문서 확인 필요

두 글자 이상 입력, 위아래 화살표로 이동하고 Enter로 열기