데이터베이스

[DB] JOIN 종류, ON vs WHERE

jooeun 2023. 1. 14. 11:22

JOIN이란? 

RDBMS는 데이터의 중복을 피하기 위해 테이블에 정보를 나누어 저장한다. 이렇게 분리되어 있는 데이터에서 원하는 결과를 조합해서 가져오기 위해서 테이블을 조합할 필요가 있고, 이를 JOIN 연산자를 통해 수행할 수 있다.

JOIN을 통해서 2개 이상의 테이블을 마치 하나의 테이블인 것처럼 보여준다.

 

 

기본 구조

SELECT (조회할 컬럼)
FROM (기준 테이블)
JOIN (대상 테이블)
[ ON (조인 조건) ]
[ WHERE (추가 조건) ]

 

 

JOIN의 종류

 

 

 

 

1. 내부 조인(Inner Join): 2개 이상의 테이블에서 교집합만 추출

SELECT 조회할 컬럼
FROM 테이블A
(INNER) JOIN 테이블B
ON 테이블A.컬럼 = 테이블B.컬럼
[WHERE 추가조건]

 

 

2. 자연 조인(Natural Join) : 내부 조인에 속한다

SELECT 조회할 컬럼
FROM 테이블A
NATURAL JOIN 테이블B
[WHERE 조건문]

두 테이블에서 동일한 컬럼명을 갖는 컬럼은 모두 조인이된다. 

두 테이블이 동시에 가지고 있는 컬럼의 값이 전부 같은 것만 골라낸다

이 때 반드시 두 테이블 간의 동일한 이름과 동일한 타입을 가진 컬럼이 필요하다(이름만 같고 타입이 달라도 안된다)

기존 테이블과 조인테이블 모두에 데이터가 존재해야 조회가

 

 

 

3. 외부 조인(Full Outer Join, Left Outer Join, Right Outer Join) : 2개 이상의 테이블에서 합집합 추출

SELECT (조회할 컬럼)
FROM 테이블A
FULL OUTER JOIN 테이블B
ON 조건문
[WHERE 추가조건문]

SELECT (조회할 컬럼)
FROM 테이블A
LEFT OUTER JOIN 테이블B
ON 조건문
[WHERE 추가조건문]

SELECT (조회할 컬럼)
FROM 테이블A
RIGHT OUTER JOIN 테이블B
ON 조건문
[WHERE 추가조건문]

ON 조건문을 만족하는 결과 중 테이블A와 테이블B의 공통된 결과만을 보여주는 것이 내부조인이라면, 공통된 부분이 아니라 JOIN되지 않는 테이블A와 테이블B의 나머지 행들 또한 보여주는 것이 FULL OUTER JOIN이다. 이 때 공통된 부분이 아닌 경우는 NULL로 처리되어 보여진다.

두 테이블 모두의 값을 보여주면 FULL OUTER JOIN,

왼쪽 테이블의 값만을  보여주면 LEFT OUTER JOIN

오른쪽 테이블의 값만을 보여주면 RIGHT OUTER JOIN

(MySql에서는 FULL OUTER JOIN이 없어서 LEFT OUTER JOIN과 RIGHT OUTER JOIN 결과를 UNION해야한다)

 

 

 

4. 크로스 조인(Cross Join) : 곱집합

SELECT (조회할컬럼)
FROM 테이블A, 테이블B

SELECT (조회할컬럼)
FROM 테이블A
JOIN 테이블B

SELECT (조회할컬럼)
FROM 테이블A
CROSS JOIN 테이블B

두 테이블의 데이터의 모든 조합이다(모든 경우의 수)

기준 테이블A에 대해, A 데이터의 ROW를 테이블B 전체와 JOIN하는 방식

테이블A의 row수 * 테이블B의 row수 만큼의 row를 가진 결과를 보여준다

 

 

 

5. 셀프 조인(Self Join) : 자기 자신과 자기 자신을 조인

SELECT (조회할 컬럼)
FROM 테이블A X, 테이블A Y
WHERE X.컬럼1 = Y.컬럼2

테이블A가 2개인것 처럼, 각각 다른 별칭 X, Y를 부여한다.

WHERE절에 X와 Y의 공통컬럼을 지정하여 관계를 설정한다.

FROM절에서 INNER JOIN, OUTER JOIN 모두 적용할 수 있다

 

 

 

[ON vs WHERE]

ON : JOIN을 하기 전에 필터링한다(ON 조건으로 필터링이 된 레코드들간 JOIN이 이루어진다)

WHERE : JOIN을 한 후 필터링을 한다(JOIN을 한 결과에서 WHERE 조건절로 필터링이 이루어진다)

 

INNER JOIN에서의 ON조건과 WHERE조건은 같다

OUTER JOIN 에서 ON vs WHERE를 살펴보자

 

예시)

create table tableA (
	col1 int,
    	col2 varchar(20)
);

create table tableB (
	col1 int,
    	col2 varchar(20)
);

# 데이터 입력
insert into tableA (col1, col2) values (1, '수박');
insert into tableA (col1, col2) values (2, '딸기');
insert into tableA (col1, col2) values (3, '바나나');
insert into tableA (col1, col2) values (4, '키위');

insert into tableB (col1, col2) values (1, 'watermelon');
insert into tableB (col1, col2) values (2, 'strawberry');
insert into tableB (col1, col2) values (3, 'banana');

tableA
tableB

1)  OUTER JOIN에서 ON

SELECT *
FROM   tableA as A
LEFT OUTER JOIN tableB as B
ON A.col1 = B.col1
AND B.col2 = 'watermelon';

tableA의 전체 row와 tableB에서 col2 컬럼값이 'watermelon'인 row를 OUTER JOIN 한다.

ON의 조건을 통해 JOIN 전에 tableA와 tableB에서 row들이 선택된다.

ON 조건 사용

2) OUTER JOIN에서 WHERE

SELECT *
FROM   tableA as A
LEFT OUTER JOIN tableB as B
ON A.col1 = B.col1
WHERE B.col2 = 'watermelon';

tableA의 전체 row와 tableB 전체를 OUTER JOIN 한 후, tableB의 칼럼 값이 'watermelon'인 row만 뽑는다.

WHERE 조건은 JOIN을 한 이후에 필터링하는 기준이다.

WHERE 조건 사용