[SQL] JOIN - FULL OUTER JOIN

김대현·2024년 6월 8일

(1) JOIN
(2) JOIN - FULL OUTER JOIN 문법


(1) JOIN

  • JOIN은 관계형 데이터베이스를 다루는 SQL 에서 두 개 이상의 테이블 간의 데이터를 결합하여 새로운 결과 집합을 생성하는 데 사용되는 연산자이다. 즉, JOIN을 사용하면 서로 다른 테이블에 저장된 데이터를 연관시켜서 필요한 정보를 한 번에 조회하거나 가져오는 것이 가능하다.

(2) JOIN - FULL OUTER JOIN 문법

#실습데이터1
+----+--------+------------+-----+-----+---------------+-------------------+
| ID | NAME  | BIRTHDAY   | AGE | SEX | JOB_TITLE    | AGENCY            |
+----+--------+------------+-----+-----+---------------+-------------------+
|  1 | 아이유 | 1993-05-16 |  29 | F   | 가수, 탤런트   | EDAM엔터테인먼트    |
|  2 | 이미주 | 1994-09-23 |  28 | F   | 가수          | 울림엔터테인먼트     |
|  3 | 송강   | 1994-04-23 |  28 | M   | 탤런트        | 나무엑터스          |
|  4 | 강동원 | 1981-01-18 |  41 | M   | 영화배우, 탤런트| YG엔터테인먼트      |
|  5 | 유재석 | 1972-08-14 |  50 | M   | MC, 개그맨    | 안테나              |
|  6 | 차승원 | 1970-06-07 |  48 | M   | 영화배우, 모델 | YG엔터테인먼트       |
|  7 | 이수현 | 1999-05-04 |  23 | F   | 가수          | YG엔터테인먼트       |
+----+--------+------------+-----+-----+---------------+-------------------+
7 rows in set (0.00 sec)

#실습데이터2
+----+--------+---------+----------------+---------+
| ID | SEASON | EPISODE | BROADCAST_DATE | HOST    |
+----+--------+---------+----------------+---------+
|  1 |     8  |       7 | 2020-09-05     | 강동원   |
|  2 |     8  |       8 | 2020-09-12     | 유재석   |
|  3 |     8  |       9 | 2020-09-19     | 차승원   |
|  4 |     8  |      10 | 2020-09-26     | 이수현   |
|  5 |     9  |       1 | 2021-09-04     | 이병헌   |
|  6 |     9  |       2 | 2021-09-11     | 하지원   |
|  7 |     9  |       3 | 2021-09-18     | 제시     |
|  8 |     9  |       4 | 2021-09-25     | 조정석   |
|  9 |     9  |       5 | 2021-10-02     | 조여정   |
| 10 |     9  |       6 | 2021-10-09     | 옥주현   |
+----+--------+---------+----------------+---------+
10 rows in set (0.00 sec)

🖍️ FULL OUTER JOIN (두개의 테이블에서 공통영역을 포함하여 양쪽 테이블의 다른영역을 모두 포함하는 조인방식)

#FULL OUTER JOIN (두개의 테이블에서 공통영역을 포함하여 양쪽 테이블의 다른영역을 모두 포함하는 조인방식)
SELECT column1, co1umn2,FROM tableA
FULL OUTER JOIN tableB
ON tableA.column = tableB.column
WHERE condition;
  • FULL OUTER JOIN 은 두 개의 테이블 간에 교차하는 데이터뿐만 아니라 양쪽 테이블의 모든 데이터를 포함하는 결과를 반환한다. 이를 통해 왼쪽 테이블과 오른쪽 테이블의 모든 행을 포함하는 결과를 얻을 수 있다.FULL OUTER JOIN은 다음과 같이 작동한다.

  • 왼쪽 테이블과 오른쪽 테이블 간의 공통된 열(column)의 값이 일치하는 행을 반환한다.

  • 왼쪽 테이블에만 있는 행은 결과에 포함되고, 오른쪽 테이블에 대응되는 값이 없는 경우 해당 열의 값은 NULL로 표시된다.

  • 마찬가지로, 오른쪽 테이블에만 있는 행도 결과에 포함되고, 왼쪽 테이블에 대응되는 값이 없는 경우 해당 열의 값은 NULL로 표시된다.

  • 그래서 LEFT, RIGHT 와 다르게 두 테이블을 결합할 때, 양쪽 테이블의 데이터를 완전하게 보존하면서 교차하는 데이터와 함께 결합된 결과를 얻을 수 있다.

  • 예를 들어, "주문(Order)" 테이블과 "고객(Customer)" 테이블을 FULL OUTER JOIN하여 모든 주문과 모든 고객의 정보를 결합할 수 있어 이를 통해 양쪽 테이블에 있는 모든 데이터를 한 번에 조회가 가능하다.


하지만

  • 현재 사용하는 MySQL 에서는 FULL OUTER JOIN 을 지원하지 않으므로 UNION,LEFT, RIGHT 을 사용한 쿼리로 같은 결과를 만들 수 있다
SELECT column1, co1umn2,FROM tableA
LEFT JOIN tableB ON tableA.column = tableB.column
UNION
SELECT column1, co1umn2,FROM tableA
RIGHT JOIN tableB ON tableA.column = tableB.column
WHERE condition;
#예시, snl_show 테이블에 호스트로 출연한 celeb 테이블을 기준으로 celeb 테이블과 snl_show 테이블을 FULL OUTER JOIN

mysql> SELECT celeb.id, celeb.name, snl_show.id, snl_show.host
    -> FROM celeb LEFT JOIN snl_show ON celeb.name = snl_show.host;
    -> UNION
    -> SELECT celeb.id, celeb.name, snl_show.id, snl_show.host
    -> FROM celeb RIGHT JOIN snl_show ON celeb.name = snl_show.host;
+----+-------+------+--------------+
| id   | name   | host | host_name |
+----+-------+------+--------------+
| 1    | 아이유  | NULL | NULL      |
| 2    | 이미주  | NULL | NULL      |
| 3    | 송강    | NULL | NULL      |
| 4    | 강동원  |    1 | 강동원     |
| 5    | 유재석  |    2 | 유재석     |
| 6    | 차승원  |    3 | 차승원     |
| 7    | 이수현  |    4 | 이수현     |
| NULL | NULL   |    5 | 이병헌     |
| NULL | NULL   |    6 | 하지원     |
| NULL | NULL   |    7 | 제시       |
| NULL | NULL   |    8 | 조정석     |
| NULL | NULL   |    9 | 조여정     |
| NULL | NULL   |   10 | 옥주현     |
+----+-------+------+--------------+
13 rows in set (0.00 sec)

  • FROM tableA LEFT JOIN tableB: FROM 은 쿼리의 대상이 되는 테이블을 지정한다.
    LEFT JOINtableA를 기준이 되어서 tableB와 결합하여 결과를 생성하는 것이다.
    그래서 tableA의 모든 행을 반환하고, tableB의 행 중에서 tableAcolumntableBcolumn이 일치하는 경우 그 값도 포함하여 함께 반환한다.

  • FROM tableA RIGHT JOIN tableB: FROM 은 쿼리의 대상이 되는 테이블을 지정한다.
    RIGHT JOINtableA를 기준이 되어서 tableB와 결합하여 결과를 생성하는 것이다.
    그래서 tableB의 모든 행을 반환하고, tableA의 행 중에서 tableBcolumntableAcolumn이 일치하는 경우 그 값도 포함하여 함께 반환한다.

  • ON tableA.column = tableB.column: ON 은 결합할 때 사용할 JOIN 조건을 지정한다. 즉 두 테이블을 연결하여 조회하고 싶은 열(column)을 지정하는 것이다. 그래서 tableAtableB의 특정 열(column) 값이 일치하는 행을 찾아서 결합하여 tableA 의 값과 결합된 값을 합쳐서 결과를 출력한다.

  • 여기에 UNION을 사용하게 된다면 LEFT JOIN 결과와 RIGHT JOIN 결과를 모두 합하고 중복된 값을 제거한 왼쪽 테이블과 오른쪽 테이블의 모든 행을 포함하는 결과를 얻을 수 있다

profile
데이터 분석 스쿨 블로그 입니다.

0개의 댓글