NullNull

MySQL DB JOIN 정리 본문

SQL

MySQL DB JOIN 정리

KYBee 2022. 3. 1. 00:30

MySQL의 JOIN을 정리해보려 한다. 아래의 그림이 JOIN을 잘 설명하고 있다.

 

예시를 통해 하나씩 알아보자. 예시 테이블은 다음과 같다.

A table

ID NAME
1 KIM
2 LEE

B table

ID HOME
2 SEOUL
3 ANSAN
4 DAEGU

 

1. INNER JOIN

INNER JOIN은 두 테이블의 교집합을 찾는 것이다. A 테이블과 B 테이블을 id값을 기준으로 JOIN 할 때 두 테이블에 모두 존재하는 값들만 결과로 조회된다. 

SELECT A.ID ID, A.NAME NAME, B.HOME HOME 
FROM A INNER JOIN B
ON A.ID = B.ID

 

2. LEFT JOIN

LEFT JOIN은 A와 B 테이블을 합치되, A 테이블에는 존재하지만 B 테이블에 없는 속성에 대해서는 NULL이 된다. 예를 들어 A 테이블에는 id가 1인 레코드가 있지만 B 테이블에는 id가 1인 레코드가 존재하지 않는다. 따라서 A LEFT JOIN B를 하면 id가 1인 레코드의 HOME 속성은 NULL이 된다.

SELECT A.ID, A.NAME, B.HOME FROM A LEFT JOIN B
ON A.ID = B.ID;

 

3. LEFT JOIN without INNER JOIN

LEFT JOIN 을 한 상태에서 WHERE B.ID IS NULL 속성을 추가하면 A에만 존재하는 속성을 조회할 수 있다. LEFT JOIN 을 실행하면 왼쪽 테이블에는 존재하지만 오른쪽 테이블에 없는 레코드는 NULL 값을 가진다. 이때 WHERE 절에 그러한 NULL값을 가지는 값들만 표시하도록 조건을 주면 결과적으로 왼쪽에만 있는 데이터가 나오게 된다.

SELECT A.ID, A.NAME, B.HOME FROM A LEFT JOIN B
ON A.ID = B.ID
WHERE B.ID IS NULL;

 

4. RIGHT JOIN

RIGHT JOIN은 LEFT JOIN과 같은 방법으로 동작하지만 기준이 오른쪽 테이블이 된다는 점만 다르다. B 테이블에는 id가 3인 레코드가 있지만 A 테이블에는 id가 3인 레코드가 존재하지 않는다. 따라서 A RIGHT JOIN B를 하면 id가 3인 레코드의 NAME 속성은 NULL이 된다.

SELECT B.ID, A.NAME, B.HOME FROM A RIGHT JOIN B
ON A.ID = B.ID;

 

5. RIGHT JOIN without INNER JOIN

RIGHT JOIN 을 한 상태에서 WHERE A.ID IS NULL 속성을 추가하면 B에만 존재하는 속성을 조회할 수 있다.

SELECT B.ID, A.NAME, B.HOME FROM A RIGHT JOIN B
ON A.ID = B.ID
WHERE A.ID IS NULL;

 

6. FULL OUTER JOIN

MySQL에는 OUTER JOIN이 존재하지 않는다. 따라서 UNION을 사용해서 LEFT JOIN의 결과와 RIGHT JOIN의 결과를 합쳐주는 방법으로 구현해야 한다.

SELECT B.ID, A.NAME, B.HOME FROM A RIGHT JOIN B
ON A.ID = B.ID
UNION
SELECT A.ID, A.NAME, B.HOME FROM A LEFT JOIN B
ON A.ID = B.ID
ORDER BY ID;

 

7. FULL OUTER JOIN without INNER JOIN

LEFT JOIN과 RIGHT JOIN을 합친 이후에 두 테이블에 공통으로 들어있는 데이터를 제거한다. 즉 LEFT OUTER JOIN without INNER JOIN과 RIGHT OUTER JOIN without INNER JOIN을 합친 것과 같다.

SELECT B.ID, A.NAME, B.HOME FROM A RIGHT JOIN B
ON A.ID = B.ID
WHERE A.ID IS NULL
UNION
SELECT A.ID, A.NAME, B.HOME FROM A LEFT JOIN B
ON A.ID = B.ID
WHERE B.ID IS NULL
ORDER BY ID;

Comments