SQL_Non-Equi Join & Outer Join
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에 대해 알아보았습니다.