조인의 수행은 기본적으로 두 테이블씩 이루어진다. 두개씩 조인 후 나온 실행 결과 set 을 가지고 또 다른 테이블과 조인을 한다.
Cartesian Product
Select e.name, d.dname
from emp e
cross join depth d;
Cartesian product는 조인 조건 없이 하는 Cross Join으로써 위와 같이 tab1의 row 수 * tab2의 로우 수 만큼 데이터가 출력된다.
이런 조인 조건은 Group by 에서 사용하던 rollup, cube나 grouping sets로 구현하는 것을 구현할 수 있다.
ROLL_UP
select deptno, job, sum(sal) as total from emp
where deptno in ( 10, 20)
group by rollup(deptno, job)
order by deptno, job
을 실행했을 때에는 dept와 job으로 grouping한 sal의 sum값과, dept로 grouping한 sum값이 조회된다.
Job으로도 그룹핑을 하고 싶다 하면 ROLL_UP 대신 CUBE를 사용하면 된다.
GROUPING SETS
Grouping sets를 활용하면 여러 연산 결과를 UNION ALL 로 수행한 것과 동일한 결과를 낼 수 있다.
-- grouping sets
select deptno, job, sum(sal) as total
from emp
where depno in ('10', '20')
group by grouping sets (deptno, job)
order by 1,2;
-- cartesian product
with a AS (
select deptno, job, sum(sal) as total from emp
group by deptno, job
) , (
select rownum as gb from dual
connected by rownum <=2
)
select decode(b.gb,1, a.deptno) as deptno,
decode(b.gb,2,a.job) as job,
sum(a.total) as total
from a, b
group by b.gb, Decode(b.gbn, 1, a.deptno), decode(b.gbn, 2, a.job)
Natural Join & Inner Join
1. Natural Join
Select e.name, deptno, d.dname
FROM emp e Natural JOIN dept d;
네추럴 조인인은 별칭을 사용하지 않는 것이 특징이다. Deptno나 조인조건에 e.depno = d.deptno 이러한 조건을 명시하지 않아도 자동으로 찾아와 준다.
2. Inner Join - Using Join
Select depno, d.dname, e.ename
from dept d Inner Join emp e Using (deptno)
where depno in (10,30)
이너조인은 using 조건과 함께 사용되며 특정 컬럼을 지정하는 것이 특징이다.
네추럴 조인과 유징 조인은 상호 배타적이므로 하나의 쿼리에서 동시에 사용할 수 없다.
네추럴 조인은 컬럼의 이름과 타입이같으면 모두 조인하지만 , 유징 조인은 사용자가 지정한 컬럼에 대해서만 조인한다.
3. Inner Join - On Join
Select e.name, e.sal, s.grade
from emp e Inner Join salgrade s on ( e.sal Between s.losal and s.hisal )
'Study > Oracle' 카테고리의 다른 글
쿼리 성능 측정시 체크 리스트 정리 (0) | 2022.03.19 |
---|---|
조인 기법과 조인 수행 원리 (0) | 2022.03.18 |
Oracle의 B-Tree Index (0) | 2022.03.18 |