6.2 JOIN ~ 1999 ANSI
※ EMP, DEPT, SALGRADE 테이블 구조
※ 1999 ANSI JOIN ~ Oracle, My-SQL, Maria DB 등 공용
left | right | full outer | natural | cross |
1. full outer join
# 문제 103. 이름, 부서위치를 출력하는데 (+) outer 사인을 양쪽에 작성해 보시오.
select e.ename, d.loc from emp e, dept d where e.deptno (+) = d.deptno (+);
select e.ename, d.loc from emp e full outer join dept d on (e.deptno = d.deptno); |
![]() |
- 첫번째 쿼리는 작동을 안함. 따라서 양쪽을 모두 outer join하고 싶을 땐, ANSI 방법을 사용해야 한다. |
# 문제 104. 위의 결과에서 DALLAS에서 근무하는 사원만 출력하시오.
select e.ename, d.loc from emp e join dept d on (e.deptno = d.deptno) where d.loc = 'DALLAS' |
# 문제 105. 이름, 월급, 부서위치, 급여등급을 출력하시오. (3개 JOIN하는 방법)
select e.ename, e.sal, d.loc, s.grade from emp e join dept d on (e.deptno = d.deptno) join salgrade s on (e.sal between s.losal and s.hisal); |
![]() |
- 구조 : dept ----- emp ----- salgrade |
2. left, right outer JOIN
# 문제 106. 아래의 오라클 조인 문법을 1999 ANSI 문법으로 변경하시오.
<oracle> select e.ename, d.loc from emp e, dept d where e.deptno (+) = d.deptno;
<1999 ANSI> select e.ename, d.loc from emp e right outer join dept d on (e.deptno = d.deptno); |
- (+) 붙이는 직관적인 이해 (+)가 붙은 쪽의 데이터 도메인을 늘려준다고 이해 그래서 도메인이 없는 값은 null로 처리해서 JOIN성사 |
3. using절 사용
# 문제 107. 이름, 부서위치를 출력하는데, using절을 사용하시오.
select e.ename, d.loc from emp e join dept d using (deptno); |
- 주의! : e.deptno 이런 식으로 테이블 별칭을 사용할 경우에는 에러 |
4. natural join
# 문제 108. 이름, 부서위치를 출력하는데 natural join으로 수행하시오.
select e.ename, d.loc from emp e natural join dept d; |
- 자동으로 조인 조건을 찾아 연결해준다. |
5. corss join
# 문제 109. 아래의 cross join을 oracle 문법으로 수행하시오.
- cross join select e.ename, d.loc from emp e cross join dept d;
select e.ename, d.loc from emp e, dept d; |
![]() |
# 문제 110. 부서위치와 부서위치별 총월급을 출력하는데, 부서위치가 BOSTON도 출력되게 하고, 부서위치가 CHICAGO는 제외하고 총월급이 4000 이상이고 높은 것부터 출력하는데 null값은 맨 아래로 출력되게 하시오.
select d.loc, sum(e.sal) as sumsal from emp e, dept d where e.deptno (+) = d.deptno and d.loc != 'CHICAGO' group by d.loc having sum(e.sal) >= 4000 order by sum(e.sal) desc nulls last; |
![]() |