Join(조인)
앞서 정리한 서브쿼리를 이용하면 쿼리문을 합칠 수 있어서 간결해 보일 수 있지만,
서브쿼리가 쌓이고 쌓이다보면 되려 복잡해질 수 있다.
이럴 경우에는 Join을 이용할 수 있다.
Join은 둘 이상의 테이블을 연결하여 검색하는 방법이다. 두 테이블을 join 하려면 최소 하나의 공통된 컬럼이 있어야 한다. 그래서 일반적으로 기본키(PK)와 외래키(FK) 를 사용하여 조인에 활용한다.
join의 방법으로는 cross join, equi join, non-equi join, self join, outer join이 있다.
이 중 제일 사용빈도가 높은 것은 equi join과 outer join으로, 나머지 cross join과 non-equi join은 거의 쓰지 않는 편이고 noo-equi join은 쓰지 않는다.
오늘도 역시 emp 테이블과 dept 테이블을 가지고 join을 정리해보자.

1. Cross Join
크로스 조인은 카다시안 곱(데카르트 곱)을 수행한다.
카다시안 곱이란 두 집합에서 원소를 하나씩 골라 순서쌍으로 이루어진 집합을 만드는 연산이다.
쉽게 설명해 두 자리 수를 만드려고 하는데 각 자리에는 1에서 3까지 수만 들어가는 경우의 수를 구할 때
3*3=9 의 식을 통해 경우의 수를 구할 수 있다. 이러한 연산이 카다시안 곱으로,
두 개의 테이블을 곱한 행을 수행하는 것이다.
from [table A] cross join [table b]; 의 식으로 실행할 수 있다.
|
1
|
select e.ename,d.deptno from emp e cross join dept d;
|
cs |
cross join 에서는 두 테이블에서 의미있는 데이터를 뽑아내기가 쉽지 않다. 그래서 equi join을 수행한다.
ㅇ
2. Self Join (자기 조인)
셀프 조인은 자기 스스로를 조인하는 것으로, 자기 조인을 하면 테이블 안에서 카다시안 곱을 수행한다.
|
1
2
|
select a.ename as aname,b.ename as bname from emp a, emp b;
|
cs |
3. Equi join
가장 일반적으로 사용하는 조인으로, 조건이 없으면 기본 cross join을 하게 된다.
equi join의 종류로는 등가 조인, 내부 조인, 내추럴 조인이 있다.
1) 등가 조인
등가조인은 양쪽 모두에 값이 존재해야 값을 보여준다.
|
1
2
3
4
5
|
select e.ename,d.deptno from emp e, dept d where d.deptno = e.deptno;
select * from emp; -- 1,2,4
select * from dept; -- 1,2,3,4,5
insert into dept(deptno,deptname,loc) values (5,'dev02','florida');
-- deptno 3 과 5는 emp 에 없는 번호이기 때문에 보여주지 않는다.
|
cs |
두 테이블의 겹치는 값이 아닌 3과 5는 보여주지 않는다.
2) 내추럴 조인
자연스럽게 조건없이(where 쓰지 않음) 두 테이블에 같은 컬럼의 값이 있으면 조인한다.
|
1
|
select e.ename,d.deptno from emp e natural join dept d;
|
cs |
3) 내부 조인(Inner Join)
테이블과 테이블 사이에 inner join을(inner는 생략 가능), where 대신 on을 사용한다.
|
1
|
select e.ename,d.deptno from emp e inner join dept d on d.deptno = e.deptno;
|
cs |
on 대신에 using으로 조건을 줄 수도 있다. 이 때 using 안에는 조인에 사용할 컬럼이나 서브쿼리 등을 사용할 수 있다.
|
1
|
select e.ename,d.deptno from emp e join dept d using(deptno);
|
cs |

4. Outer Join (외부 조인)
equi join은 두 테이블에 값이 모두 있어야 값을 보여주지만, outer join은 어느 한쪽에만 데이터가 있어도 보여준다.
from [table A] [left][right] outer join [table B] on 조건절 의 식으로 사용하며
Left outer join, Right outer join, Full outer join 세 종류가 있다.
1) Left Outer Join
왼쪽 테이블(dept)을 기준으로 값이 있으면 보여준다.
|
1
|
select * from dept d left outer join emp e on d.deptno = e.deptno;
|
cs |
2) Right Outer Join
오른쪽 테이블(emp)을 기준으로 값이 있으면 보여준다.
|
1
|
select * from dept d left outer join emp e on d.deptno = e.deptno;
|
cs |
3) Full Outer Join
MariaDB에서는 지원하지 않으며, union을 활용해야한다.
Union 게시글에서 한 것처럼 합집합과 중복제거 기능을 이용해 구할 수 있다.
|
1
2
3
4
5
6
7
8
9
10
11
12
|
-- dept 와 emp 의 합집합을 구한다.
select deptno from dept
union all
select deptno from emp;
-- 이 데이터를 하나의 테이블로 삼아 deptno 의 중복을 제거한다.
select distinct u.deptno from (
select deptno from dept
union all
select deptno from emp order by deptno
)u;
|
cs |

배우 Join성씨 움짤 출처: umjjal2.tistory.com/m
