Data Base_Oracle/SQL

SQL_Non-Equi Join & Outer Join

pathas 2020. 1. 6. 22:21

Non-Equi Join

두 개 이상의 테이블에 동일 칼럼이 없을 때
다른 조건식을 사용하여 데이터를 조회하는 Join 형식

# 예제

▷ salgrade 테이블 구조, 레코드 확인
[ SQL> select * from salgrade; ]

GRADE LOSAL HISAL
1 700 1200
2 1201 1400
3 1401 2000
4 2001 3000
5 3001 9999

{ 문제 }
▷ emp테이블에서 사번, 이름, 업무, 급여 출력
salgrade 테이블에서 grade 출력
grade 내림차순으로 정렬
조회시마다 부서번호를 입력받도록 작성

 

▶ SQL> select empno, ename, sal, grade from emp e, salgrade s
where e.sal between s.losal and s.hisal and e.deptno=&deptno
order by 4 desc;
deptno의 값을 입력하십시오: 10 ]

EMPNO ENAME SAL GRADE
7839 KING 5000 5
7782 CLARK 2450 4
7934 MILLER 1300 2

Outer Join

  • 두 테이블의 데이터 총량이 비대칭일 때 사용
  • 데이터양이 많은 테이블의 정보가 무조건 나올 수 있도록 설정
    ※ 데이터가 많은 쪽 테이블에서 정보가 누락될 수 있기 때문
  • left outer join (대 - 소) / right outer join (소 - 대)
    나누기도 하지만 큰 의미는 없음, 요즘엔 잘 구분하지 않음

§ 형식

[ SQL> ~ where 데이터 양이 적은 필드명(+) = 데이터 양이 많은 필드명 ]

레코드가 적은 쪽에 (+) 를 붙여주면 됨
(+)가 가상 로우(null)를 만들어줌

# 예제

▷ emp, dept 테이블을 Join해서 ename, job, deptno, dname 출력
단, dept테이블의 40번부서까지 다 출력이 되도록 작성

▶ [ SQL> select e.ename, e.job, d.deptno, d.dname from emp e, dept d
where e.deptno(+)=d.deptno; ]

ENAME JOB DEPTNO DNAME
SMITH CLERK 20 RESEARCH
ALLEN SALESMAN 30 SALES
... ... ... ...
    40 OPERATIONS

※ inner join으로는 40번부서를 조회할 수 없음

# 에러

▷ [ SQL> select e.ename, e.job, d.deptno, d.dname from emp e, dept d
where e.deptno(+) = d.deptno(+); ]

▷▷ [ 1행에 오류: ORA-01468: outer-join된 테이블은 1개만 지정할 수 있습니다 ]
※ (+)기호는 한 쪽 필드에만 사용할 수 있음

데이터양이 많은 곳에도 사용할 수는 있지만 적은 쪽에 맞춰서 잘리기 때문에 데이터 조회 불가능


동일 컬럼이 없을 때 데이터를 조회하는 Non-Equi Join과 데이터가 누락되지 않도록 하는 Outer Join에 대해 알아보았습니다.