관리 메뉴

FU11M00N

[ Oracle ] 조인(Join) (내부조인, 외부조인 , 교차조인) 본문

Programming/Oracle SQL

[ Oracle ] 조인(Join) (내부조인, 외부조인 , 교차조인)

호IT 2021. 3. 22. 22:13


 

 

- 테이블 소개

 

위 사진의 구조를가진 테이블들을 대상으로 실습을 진행하겠습니다.

 

 


 

 

- 조인의 종류

 

- 교차조인(cross join) = cartesian product

 

dept 안에 있는 데이터는 4개 입니다.

emp 안에 있는 데이터는 14개입니다.

 

select d.deptno,dname,empno,ename,sal
from emp e, dept d;

 

 

 

위의 쿼리문과 같이 모든 데이터들을 조인해서 보여주는 것이 교차조인입니다.

 

 

- 내부조인(inner join) : theta, [non-]equi, natural

 

 

아래의 그림으로 설명 가능합니다. A 와 B 의 교집합을 의미합니다.

 

 

 

--  부서별로 사원의 sal이 낮은 순으로 deptno,dname,empno,ename,sal출력

select d.deptno,d.dname,e.empno,e.ename,e.sal from dept d join emp e on d.deptno=e.deptno
order by 1 asc,5 asc;

 

 

dept 테이블과 emp 테이블을 조인하여 출력했습니다.

on 뒤에는 그 두 테이블의 관계를 적습니다.

 

일반적으로는 외래키나 프라이머리키를 적는데, 아닌 경우도 존재합니다.

 

- 외부조인(outer join) : [left | right | full] [outer] join

 

 

right 조인은 아래 그림과 같습니다.

 

left 조인은 아래 그림과 같습니다.

 

 

 

 

 

full 조인은 아래 그림과 같습니다.

 

 

 

 

 

 

 

 

위의 내용의 예제들 입니다.

 

-- 3) 부서별로 사원의 sal이 낮은 순으로 deptno,dname,empno,ename,sal출력

select d.deptno,d.dname,e.empno,e.ename,e.sal from dept d join emp e on d.deptno=e.deptno
order by 1 asc,5 asc;

select d.deptno,dname,empno,ename,sal
from emp e, dept d;

-- 4) 부서별 사원은 몇명인지 empno,dname,부서별 인원수 출력

select e.deptno,dname, 
count(*) as "부서별 인원수"
from dept d join emp e on d.deptno=e.deptno
group by e.deptno,d.dname;

-- 4 upgrade
-- 부서별 사원은 몇명인지 deptno,dname, 부서별 인원수를 출력하되
-- 5명 이상인 부서만 부서별 인원수 높은 순으로 출력하라

select e.deptno,dname, 
count(*) as "부서별 인원수"
from dept d join emp e on d.deptno=e.deptno
group by e.deptno,d.dname
having count(*)>=5
order by 3 desc;

-- 4 upgrade!!
-- 부서별 사원은 몇명인지 20번 이상 부서만 deptno,dname, 부서별 인원수를 출력하되
-- 5명 이상인 부서만 부서별 인원수 높은 순으로 출력하라

select e.deptno,dname, 
count(*) as "부서별 인원수"
from dept d join emp e on d.deptno=e.deptno
where e.deptno >=20
group by e.deptno,d.dname
having count(*)>=5
order by 3 desc;

 

Comments