[SQL] 09-Join

김지현·2024년 6월 9일

SQL

목록 보기
8/16

📂 JOIN

: 두 개 이상의 테이블을 결합하는 것


📍 INNER JOIN

  • 두 개의 테이블에서 공통된 요소들을 통해 결합하는 조인 방식

SELECT column1, column2, ...
FROM tableA
INNER JOIN tableB
ON tableA.column = tableB.column  -- join 기준 컬럼
WHERE condition;

(예제) snl_show에 호스트로 출연한 celeb을 기준으로 INNER JOIN → 출연한 celeb 결과만 출력

SELECT celeb.id, celeb.name, snl_show.id, snl_show.host
FROM celeb
INNER JOIN snl_show
ON celeb.name = snl_show.host;

+----+--------+----+--------+
| id | name   | id | host   |
+----+--------+----+--------+
|  4 | 강동원 |  1 | 강동원 |
|  5 | 유재석 |  2 | 유재석 |
|  6 | 차승원 |  3 | 차승원 |
|  7 | 이수현 |  4 | 이수현 |
+----+--------+----+--------+

📍 LEFT JOIN

  • 두 개의 테이블에서 공통 영역을 포함하여 왼쪽 테이블의 다른 데이터를 포함하는 조인 방식

SELECT column1, column2, ...
FROM tableA
LEFT JOIN tableB
ON tableA.column = tableB.column  -- 기준
WHERE condition;

(예제) snl_show에 호스트로 출연한 celeb을 기준으로 LEFT JOIN → celeb 전체 + 출연한 host 결과

SELECT celeb.id, celeb.name, snl_show.id, snl_show.host
FROM celeb
LEFT JOIN snl_show
ON celeb.name = snl_show.host;

+----+--------+------+--------+
| id | name   | id   | host   |
+----+--------+------+--------+
|  1 | 아이유 | NULL | NULL   |
|  2 | 이미주 | NULL | NULL   |
|  3 | 송강   | NULL | NULL   |
|  4 | 강동원 |    1 | 강동원 |
|  5 | 유재석 |    2 | 유재석 |
|  6 | 차승원 |    3 | 차승원 |
|  7 | 이수현 |    4 | 이수현 |
+----+--------+------+--------+

📍 RIGHT JOIN

  • 두 개의 테이블에서 공통 영역을 포함하여 오른쪽 테이블의 다른 데이터를 포함하는 조인 방식

SELECT column1, column2, ...
FROM tableA
RIGHT JOIN tableB
ON tableA.column = tableB.column  -- 기준
WHERE condition;

(예제) snl_show에 호스트로 출연한 celeb을 기준으로 RIGHT JOIN → 출연한 celeb + host 전체

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   | id | host   |
+------+--------+----+--------+
|    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 | 옥주현 |
+------+--------+----+--------+

📍 FULL OUTER JOIN

  • 두 개의 테이블에서 공통 영역을 포함하여 양쪽 테이블의 다른 영역을 모두 포함하는 조인 방식

SELECT column1, column2, ...
FROM tableA
FULL OUTER JOIN tableB
ON tableA.column = tableB.column  -- 기준
WHERE condition;

❗ MySQL에서는 FULL OUTER JOIN을 지원하지 않음 (FULL OUTER JOIN을 지원하는 다른 DBMS에서는 사용 가능)

📍 그러면? LEFT JOIN 결과와 RIGHT JOIN 결과를 UNION으로 포함하여 같은 결과 도출 가능

SELECT column1, column2, ...
FROM tableA
LEFT JOIN tableB ON tableA.column = tableB.column
WHERE condition;
UNION
SELECT column1, column2, ...
FROM tableA
RIGHT JOIN tableB ON tableA.column = tableB.column
WHERE condition;

+------+--------+------+--------+ 
+------+--------+------+--------+
|    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 | 옥주현 |
+------+--------+------+--------+

📍 SELF JOIN

  • INNER JOIN과 동일한 결과
SELECT column1, column2, ...
FROM tableA, tableB, ...
WHERE condition;

(예제) snl_show에 호스트로 출연한 celeb을 기준으로 celeb 테이블과 snl_show 테이블을 SELF JOIN

SELECT celeb.id, celeb.name, snl_show.id, snl_show.host
FROM celeb, snl_show
WHERE celeb.name = snl_show.host;

❗ 동일한 컬럼명이 존재하는 경우 테이블명 명시 필요
가독성을 위해 테이블명을 같이 작성하는 것을 권장

0개의 댓글