본문 바로가기

Data/MariaDB

DB] JOIN

 

JOIN 이란?

- 둘 이상의 테이블을 연결하여 검색하는 방법
- 두 테이블을 조인을 하려면 최소 하나의 공통된 컬럼이 있어야 한다.
- 그래서 일반적으로 PK 와 FK 를 사용하여 조인에 활용 한다.

 

JOIN 의 방법

1) cross join : 거의 안쓴다.
2) equi join : 제일 많이 사용
3) non-equi join : 안쓴다.
4) self join : 거의 안쓴다.
5) outer join : 많이 사용 한다.

 

1. CROSS JOIN

- 카다시안 곱을 수행한다.

- 두 개의 테이블을 곱한 행을 수행한다.

FROM [table A] CROSS JOIN [table B];

emp 테이블의 ename 행(row)이 11개
dept 테이블의 deptno 행(row)이 5개
11 x 5 = 55개의 행이 나온다.

- cross join 에서는 두 테이블 에서 의미있는 데이터를 뽑아내기가 쉽지 않다.
중복되어서 전부다 나오기 때문에
그래서 equi join 을 수행한다.

 

 

2. Equi join

- 가장 일반적으로 사용한다.

- 조건이 없으면 기본 cross join을 수행한다.

 

1) 등가 조인 (Equi join)

- 등가 조인은 양쪽 테이블 모두에 값이 존재해야 보여준다.

select e.ename, d.deptno from emp e, dept d where d.deptno = e.deptno;

where 절에 어떤 컬럼을 기준으로 할 것인지 조건을 써주어야 한다.

 

deptno 3 과 5는 emp 에 없는 번호기 때문에 보여주지 않는다.
deptno 가 1,2,4 인 값만 가져온다.

 

 

2) 내부 조인 (Inner join)

- 등가 조인과 같은데 사용법이 다르다.

- 테이블과 테이블 사이에 inner join을 넣고 where 대신 on을 사용한다.

[ inner join - on ]
select
e.ename, d.deptno from emp e inner join dept d on d.deptno = e.deptno;

 

- on 대신 USING 으로 조건을 줄 수도 있다.

- USING 안에는 조인에 사용할 컬럼이나 서브쿼리 등을 사용할 수 있다.

[ inner join - using ]
select e.ename, d.deptno from emp e join dept d using (deptno);

inner join 에서 inner는 생략 가능하다.

 

결과값은 위에 등가조인 결과값과 같다.

 

 

3) 내츄럴 조인 (Natural join)

- 자연스럽게 조건없이 두 테이블에 같은 컬럼의 값이 있으면 조인한다.

- 두 테이블 간에 동일한 이름을 갖는 모든 컬럼에 대해 등가조인을 한다.

- using / where / on 절에서의 join 조건절을 정의할 수 없다.

select e.ename, d.deptno from emp e natural join dept d;

 

 

SELF JOIN

자기조인

- 자기 스스로 조인한다.

- 자기 조인을 하면 테이블 안에서 카다시안 곱을 수행한다.

 

emp 테이블을 self join 하면 emp x emp

emp 테이블의 ename
emp X emp ..

 

 

OUTER JOIN

외부 조인

- 등가 조인은 두 테이블 모두에 값이 있어야 보여주는 반면

- 외부 조인은 어느 한 쪽에만 데이터가 있어도 보여준다.

 

SELECT * FROM [table A] [LEFT|RIGHT] OUTER JOIN [table B] ON 조건절;

 

등가 조인 쿼리문
등가조인 결과값

 

1) LEFT OUTER JOIN

- 왼쪽 테이블(dept)을 기준으로 더 있는 값을 보여준다.

- 없는 값은 null 처리한다.

dept 테이블의 deptno 는 1,2,3,4,5
emp 테이블의 deptno 는 1,2,4
따라서 emp에 3,5 가 없어도 null 값으로 처리하여 보여준다.

 

2) RIGHT OUTER JOIN

- 오른쪽 테이블 (emp)을 기준으로 값이 있으면 보여준다.

- 마찬가지로 없는 건 null

결과값이 등가조인 결과와 같다.
emp 에 있는 deptno는 dept 에 있는 deptno 보다 종류가 많지 않아서 등가조인 이상으로 더 보여줄게 없다.
그래서 right outer join을 해도 데이터가 차이가 나지 않는다.

emp 테이블에 deptno = 6 인 데이터를 넣고 다시 실행한 경우는 아래와 같다.

 

 

3) FULL OUTER JOIN

- 양쪽에 있는 값들을 모두 보여준다.

- maria db 에서는 지원하지 않기 때문에 UNION을 활용 해야 한다.