Study/Oracle

조인의 개념과 실행 절차

going.yoon 2022. 3. 19. 00:27

 

조인의 수행은 기본적으로 두 테이블씩 이루어진다. 두개씩 조인 후 나온 실행 결과 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