DQL> Select - ANSI Join (Cross, Inner, Natural, Outer)
ANSI(미국 표준협회)의 표준안에 따라 만들어진 조인 방법.
여태 배웠던 Join은 다소 복잡한데 Ansi를 사용하면 조금 더 간결하게 명령문을 작성하고 깔끔한 결과를 볼 수 있다.
1. ANSI Cross join
기존의 크로스 조인처럼 emp 14행 * dept 4행으로 총 56행의 데이터가 출력된다. 유의미한 데이터x
select*from emp cross join dept;
select*from dept cross join emp;
2. ANSI INNER JOIN ( = Equi Join)
기존의 등가조인문:
select ename, dname from emp, dept
where emp.deptno=dept.deptno and ename='SCOTT';
1) on
select ename, dname from emp inner join dept
on emp.deptno=dept.deptno
where ename='SCOTT';
2) using절
dept와 emp의 공통 컬럼을 매개로 묶어주던 문장을 짧게 using (deptno) 이라고 축소했다.
select emp.ename, dept.dname from emp inner join dept
using (deptno)
where ename='SCOTT';
3. ANSI NATURAL JOIN (= Equi Join)
INNER JOIN의 using 절 사용보다 더 간단하게 줄여서 사용.
공통 컬럼을 자동으로 찾아주기 때문에 아예 명시하지 않아도 된다.
select emp.ename, dept.dname
from emp natural join dept
where ename='SCOTT';
4. ANSI OUTER JOIN (= Outer Join)
Left, Right, Full 세 가지 옵션 중 하나를 사용하게 된다.
SELECT*FROM table01 [LEFT / RIGHT / FULL] OUTER JOIN table02;
Left : 왼쪽의 테이블의 모든 정보가 나온다
Right : 오른쪽 테이블의 모든 정보가 나온다.
FULL : 모든 테이블의 모든 정보가 나온다.
공통 컬럼과 각기 다른 컬럼이 있는 두 테이블
dept01, dept02가 있을 때,
1) LEFT
왼쪽 테이블의 모든 정보가 출력되고,
오른쪽 테이블은 공통 컬럼만 출력된다.
select*from dept01
left outer join dept02
on dept01.deptno = dept02.deptno;
2) RIGHT
LEFT와는 반대로
왼쪽 테이블에서는 공통 컬럼만,
오른쪽 테이블은 모든 데이터가 출력된다.
select*from dept01
right outer join dept02
on dept01.deptno = dept02.deptno;
3) FULL
왼쪽, 오른쪽 테이블 모두의 값이 출력된다.
select*from dept01
full outer join
dept02 on dept01.deptno = dept02.deptno;
이때 on 대신 using을 사용하면 조금 더 깔끔한 결과가 나오는 것을 발견했다.
select*from dept01
full outer join dept02
using (deptno);