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;