본문 바로가기
Study/중앙정보처리학원과정

25일차(1). SQL 조인(Join)

by 얏옹이 2022. 11. 28.
반응형

조인(Join)의 종류는 아래와 같이 나뉜다.

 

1. 조인 연산자에 따른 구분 : 동등조인 , 안티조인

2. 조인 대상에 따른 구분 : 셀프조인

3. 조인 조건에 따른 구분: 내부조인, 외부조인, 세미조인, 카타시안조인(CATASIAN PRODUCT)

4. 기타: ANSI 조인

 

이중에서 대표적인 Join을 꼽으라면, Inner Join(내부조인), Outer Join(외부조인), Cross Join(크로스 조인), Self Join(셀프조인)을 꼽을수 있다.

 

이중에서 이너조인, 아우터조인, 셀프조인을 대표적으로 알아보자.

 

먼저 조인의 문법부터 알아보자. 오라클에서 Test로 제공하는 DB인 Scott계정의 테이블 기준으로 알아보겠다.

 

EMP 테이블에는 DEPTNO라는 컬럼이 있고 이는 Foreign_Key로 설정되어있다. DEPTNO는 DEPT 테이블에도 존재하는데 이 DEPTNO와 EMP 테이블에 공통으로 존재해서 두 테이블을 이어주는 Foreing KEY가 되는것이다.

 

이처럼 적어도 한개 이상의 컬럼이 두 테이블 사이에서 공유가 되어있어야 조인이 가능하다.

 

 

 

 

자 그럼 각 조인들의 특징을 알아보자.

 

1. INNER JOIN(이너 조인)

 

각 테이블에서 조인 조건에 일치하는 데이터만 가져오는것을 이너조인이라 한다. 수학에서 교집합을 생각하면 된다.

 

--Inner Join
select e.empno as 사원번호, e.ename as 사원명, e.sal as 급여, d.dname as 부서명
from emp e join dept d on e.deptno = d.deptno;
select e.empno as 사원번호, e.ename as 사원명, e.sal as 급여, d.dname as 부서명
from emp e, dept d
where e.deptno = d.deptno;

 

이렇게 두 테이블의 공통 키인 Deptno로 두 테이블을 묶어주고

두 테이블의 데이터들을 한번에 가져올수 있다.

 

 

이것이 대표적으로 많이 보편적으로 사용하는 Inner Join이다.

 

select e.empno, e.ename, e.sal, d.deptno, d.dname
from emp e, dept d
where e.deptno = d.deptno and  d.deptno in(10,20)
order by d.dname asc;


select e.empno, e.ename, e.sal, d.deptno, d.dname
from emp e join dept d on e.deptno = d.deptno
where d.deptno in(10,20)
order by d.dname asc;

 

이 두 Join문의 결과는 같지만 표현식이 다르다.

 

다만 두 테이블의 공통 키가 where절에 들어가고, On 절에 들어간 차이로 나눌수 있는데 위에는 = 부등호를 Where 절에 사용한다고해서 Equi Join 이라고 불리고, 밑의 Join과 On이 오는게 바로 ANSI 문법이다. ANSI JOIN이라고도 한다.

ANSI 조인은 미국 국립 표준협회에서 SQL에 대한 보편적인 문법을 제시한 문법이다.

 

따라서 난 개인적으로 Oracle Join문법보다는 ANSI 문법으로 좀더 손에 익힐 예정이다.

 

 

2. OUTER JOIN(아우터 조인)

 

아우터 조인은 조인 조건에 부합하면서, 기준점이 되는 테이블의 데이터값을 모두 가져오는 조인이다.

 

위의 Inner Join의 조인한 두 테이블 EMP 와 DEPT 테이블에는 분명 NULL 값도 존재한다. 하지만 조인조건에 부합하지 않아 출력이 되지않는것이다. 내부적으로 NOT NULL 처리가 되는것이다.

 

때론 NULL값을 포함해서 출력을 해줘야하는 일도 있을것이다. 이럴때는 OUTER JOIN을 사용해서 출력해줄수 있다.

 

1.LEFT OUTER JOIN

2.RIGHT OUTER JOIN

3.FULL OUTER JOIN

 

이렇게 3분류로 나뉘는데 보기만해도 어떤뜻인지 알수 있을것 같다.

 

LEFT OUTER JOIN인은 조인조건을 충족하는 데이터와 조인조건을 충족하지 않는 조건중, 왼쪽 테이블의 데이터를 추가로 보여준다.

 

--LEFT OUTER JOIN
select e.empno as 사원번호, e.ename as 사원명, e.sal as 급여, d.dname as 부서명
from emp e left outer join dept d on e.deptno = d.deptno;
select e.empno as 사원번호, e.ename as 사원명, e.sal as 급여, d.dname as 부서명
from emp e, dept d
where e.deptno = d.deptno(+);

 

이렇게 두가지 방법으로 표현해줄수 있다. 현재 EMP 테이블에서는 조인조건을 충족하지 않는 데이터가 없어서 데이터가 달라보이지 않지만. RIGHT OUTER JOIN을 이용하면 데이터가 달라진다

 

--RIGHT OUTER JOIN

select e.empno as 사원번호, e.ename as 사원명, e.sal as 급여, d.dname as 부서명
from emp e right outer join dept d on e.deptno = d.deptno;

select e.empno as 사원번호, e.ename as 사원명, e.sal as 급여, d.dname as 부서명
from emp e, dept d
where e.deptno(+) = d.deptno;

 

조인조건에 일치하는 12개의 행에 추가로 DEPT 테이블에 NULL값이 들어가있는 3개의 행이 추가되었다.

 

마지막으로 FULL OUTER JOIN은 말 그대로 양쪽 다 데이터를 보여준다

 

--FULL OUTER JOIN
select e.empno as 사원번호, e.ename as 사원명, e.sal as 급여, d.dname as 부서명
from emp e full outer join dept d on e.deptno = d.deptno;

 

FULL OUTER JOIN은 이렇게 표현해주면 된다

 

FULL OUTER JOIN은 합집합이라고 이해하면 좋을거같다.

 

 

 

3. SELF JOIN

 

셀프조인은 문자 그대로 스스로가 스스로를 조인하는, 즉 한 테이블로 조인을 구성하는 방식이다.

 

하나의 테이블에 Alias를 추가하여 From절에 두개의 테이블을 사용하는것처럼 조인한다.

 

--SELF JOIN
select e.empno, e.ename, e.mgr, e1.ename
from emp e join emp e1 on e.mgr = e1.empno;

 

여기서 보면 emp테이블을 가지고 Alias를 e와 e1으로 선언하고 이 두개인것같지만 하나인 테이블을 셀프 조인했다.

 

 

위의 코드는 EMP 테이블의 셀프조인으로 통해 각 사원들의 사수가 누구인지 알아보는 쿼리문이다.

 

 

반응형