SQL : 09. JOIN

yeppi1802·2024년 6월 7일
0

❇️ 요약

  • INNER JOIN
  • LEFT JOIN
  • RIGHT JOIN
  • FULL OUTER JOIN
  • SELF JOIN

📖 INNER JOIN

🔆 INNER JOIN

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

🔆 INNER JOIN 문법

SELECT column1, column2, ...
FROM tableA
INNER JOIN tableB
ON tableA.column = tableB.column -- JOIN할 기준 정하기
WHERE condition;

🔆 INNER JOIN 예제

  • snl_show에 호스트로 출연한 celeb을 기준으로 celeb테이블과 snl_show 테이블을 INNER JOIN
mysql> 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 | 이수현    |
+----+-----------+----+-----------+
4 rows in set (0.01 sec)

📖 LEFT JOIN

🔆 LEFT JOIN

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

🔆 LEFT JOIN 문법

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

🔆 LEFT JOIN 예제

  • snl_show에 호스트로 출연한 celeb을 기준으로 celeb테이블과 snl_show 테이블을 LEFT 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;
+----+-----------+------+-----------+
| ID | NAME      | ID   | HOST      |
+----+-----------+------+-----------+
|  1 | 아이유    | NULL | NULL      |
|  2 | 이미주    | NULL | NULL      |
|  3 | 송강      | NULL | NULL      |
|  4 | 강동원    |    1 | 강동원    |
|  5 | 유재석    |    2 | 유재석    |
|  6 | 차승원    |    3 | 차승원    |
|  7 | 이수현    |    4 | 이수현    |
+----+-----------+------+-----------+
7 rows in set (0.01 sec)

📖 RIGHT JOIN

🔆 RIGHT JOIN

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

🔆 RIGHT JOIN 문법

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

🔆 RIGHT JOIN 예제

  • snl_show에 호스트로 출연한 celeb을 기준으로 celeb테이블과 snl_show 테이블을 RIGHT JOIN
mysql> 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 | 옥주현    |
+------+-----------+----+-----------+
10 rows in set (0.00 sec)

📖 FULL OUTER JOIN

🔆 FULL OUTER JOIN

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

🔆 FULL OUTER JOIN 문법

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

🔆 MYSQL에서 FULL OUTER JOIN 지원 X

  • MYSQL에서 FULL OUTER JOIN과 같은 결과 만들기
SELECT column1, column2, ...
FROM tableA
LEFT JOIN tableB
ON tableA.column = tableB.column 
UNION
SELECT column1, column2, ...
FROM tableA
RIGHT JOIN tableB
ON tableA.column = tableB.column 
WHERE condition;

🔆 FULL OUTER JOIN 예제

  • snl_show에 호스트로 출연한 celeb을 기준으로 celeb테이블과 snl_show 테이블을 FULL OUTER JOIN
    mysql> SELECT celeb.ID, celeb.NAME, snl_show.ID, snl_show.HOST
        -> FROM celeb
        -> FULL OUTER JOIN snl_show
        -> ON celeb.NAME = snl_show.HOST;
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'OUTER JOIN snl_show
    ON celeb.NAME = snl_show.HOST' at line 3

🔆 FULL OUTER JOIN 예제 - MySQL

  • 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      | ID   | HOST      |
+------+-----------+------+-----------+
|    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)

📖 SELF JOIN

🔆 SELF JOIN 문법

  • INNER JOIN과 같은 효과
SELECT column1, column2, ...
FROM tableA, tableB, ...
WHERE condition; -- WHERE절에 기준 명시

🔆 SELF JOIN 예제 1

  • snl_show에 호스트로 출연한 celeb을 기준으로 celeb테이블과 snl_show 테이블을 SELF JOIN
mysql> SELECT celeb.ID, celeb.NAME, snl_show.ID, snl_show.HOST
    -> FROM celeb, snl_show
    -> WHERE celeb.NAME = snl_show.HOST;
+----+-----------+----+-----------+
| ID | NAME      | ID | HOST      |
+----+-----------+----+-----------+
|  4 | 강동원    |  1 | 강동원    |
|  5 | 유재석    |  2 | 유재석    |
|  6 | 차승원    |  3 | 차승원    |
|  7 | 이수현    |  4 | 이수현    |
+----+-----------+----+-----------+
4 rows in set (0.00 sec)

🔆 SELF JOIN 예제 2

  • snl_show에 출연한 연예인의 snl_show 아이디, 시즌, 에피소드, 이름, 직업 정보 검색
mysql> SELECT snl_show.ID, snl_show.season, snl_show.episode, celeb.name, celeb.job_title
    -> FROM  snl_show, celeb
    -> WHERE snl_show.host = celeb.name;
+----+--------+---------+-----------+-------------------------+
| ID | season | episode | name      | job_title               |
+----+--------+---------+-----------+-------------------------+
|  1 |      8 |       7 | 강동원    | 영화배우, 텔런트        |
|  2 |      8 |       8 | 유재석    | MC, 개그맨              |
|  3 |      8 |       9 | 차승원    | 영화배우, 모델          |
|  4 |      8 |      10 | 이수현    | 가수                    |
+----+--------+---------+-----------+-------------------------+
4 rows in set (0.00 sec)
  • snl_show에 출연한 연예인의 snl_show 아이디, 시즌, 에피소드, 이름, 직업 정보 검색(동일한 컬럼명인 경우)
    • 중복 컬럼이 없으면 이렇게 작성해도 시스템이 다 구분할 수 있다.
mysql> SELECT ID, SEASON, EPISODE, NAME, JOB_TITLE
    -> FROM snl_show, celeb
    -> WHERE host = name;
ERROR 1052 (23000): Column 'ID' in field list is ambiguous
  • 동일한 컬럼명이 존재하는 경우에만 테이블명을 암시(but, 가독성을 위해 전부 테이블명 붙이는 것이 좋음!)
mysql> SELECT snl_show.ID, SEASON, EPISODE, NAME, JOB_TITLE
    -> FROM snl_show, celeb
    -> WHERE host = name;
+----+--------+---------+-----------+-------------------------+
| ID | SEASON | EPISODE | NAME      | JOB_TITLE               |
+----+--------+---------+-----------+-------------------------+
|  1 |      8 |       7 | 강동원    | 영화배우, 텔런트        |
|  2 |      8 |       8 | 유재석    | MC, 개그맨              |
|  3 |      8 |       9 | 차승원    | 영화배우, 모델          |
|  4 |      8 |      10 | 이수현    | 가수                    |
+----+--------+---------+-----------+-------------------------+
4 rows in set (0.00 sec)

🔆 SELF JOIN 예제 3

STEP1. snl_show 에 출연한 celeb 중, 에피소드 7, 9, 10 중에 출연했거나, 소속사가 YG로 시작하고 뒤에 6글자로 끝나는 사람중 작년 9월 15일 이후에 출연했던 사람을 검색

mysql>  SELECT celeb.name, snl_show.episode, celeb.agency, snl_show.BROADCAST_DATE
    -> FROM celeb, snl_show
    -> WHERE (celeb.name  = snl_show.host)
    -> AND (
    -> (snl_show.episode in (7,9,10)));
+-----------+---------+----------------------+----------------+
| name      | episode | agency               | BROADCAST_DATE |
+-----------+---------+----------------------+----------------+
| 강동원    |       7 | YG엔터테이먼트       | 2020-09-05     |
| 차승원    |       9 | YG엔터테이먼트       | 2020-09-19     |
| 이수현    |      10 | YG엔터테이먼트       | 2020-09-26     |
+-----------+---------+----------------------+----------------+
3 rows in set (0.00 sec)

STEP2. snl_show 에 출연한 celeb 중, 에피소드 7, 9, 10 중에 출연했거나, 소속사가 YG로 시작하고 뒤에 6글자로 끝나는 사람중 작년 9월 15일 이후에 출연했던 사람을 검색

mysql> SELECT celeb.name, snl_show.episode, celeb.agency, snl_show.BROADCAST_DATE
    -> FROM celeb, snl_show
    -> WHERE (celeb.name  = snl_show.host)
    -> AND (
    ->   celeb.agency like 'YG______%');
+-----------+---------+----------------------+----------------+
| name      | episode | agency               | BROADCAST_DATE |
+-----------+---------+----------------------+----------------+
| 강동원    |       7 | YG엔터테이먼트       | 2020-09-05     |
| 차승원    |       9 | YG엔터테이먼트       | 2020-09-19     |
| 이수현    |      10 | YG엔터테이먼트       | 2020-09-26     |
+-----------+---------+----------------------+----------------+
3 rows in set (0.00 sec)

STEP3. snl_show 에 출연한 celeb 중, 에피소드 7, 9, 10 중에 출연했거나, 소속사가 YG로 시작하고 뒤에 6글자로 끝나는 사람 중
작년 9월 15일 이후에 출연했던 사람을 검색

mysql> SELECT celeb.name, snl_show.episode, celeb.agency, snl_show.BROADCAST_DATE
    ->  FROM celeb, snl_show
    -> WHERE (celeb.name  = snl_show.host)
    -> AND (
    ->   snl_show.BROADCAST_DATE > '2020-09-15');
+-----------+---------+----------------------+----------------+
| name      | episode | agency               | BROADCAST_DATE |
+-----------+---------+----------------------+----------------+
| 차승원    |       9 | YG엔터테이먼트       | 2020-09-19     |
| 이수현    |      10 | YG엔터테이먼트       | 2020-09-26     |
+-----------+---------+----------------------+----------------+
2 rows in set (0.00 sec)

STEP4. snl_show 에 출연한 celeb 중, 에피소드 7, 9, 10 중에 출연했거나, 소속사가 YG로 시작하고 뒤에 6글자로 끝나는 사람중 작년 9월 15일 이후에 출연했던 사람을 검색

mysql> SELECT celeb.name, snl_show.episode, celeb.agency, snl_show.BROADCAST_DATE
    -> FROM celeb, snl_show
    -> WHERE (celeb.name  = snl_show.host)
    -> AND (
    ->   snl_show.episode in (7,9,10)
    ->   AND
    ->   celeb.agency like 'YG______%'
    -> )
    -> AND (snl_show.BROADCAST_DATE > '2020-09-15');
+-----------+---------+----------------------+----------------+
| name      | episode | agency               | BROADCAST_DATE |
+-----------+---------+----------------------+----------------+
| 차승원    |       9 | YG엔터테이먼트       | 2020-09-19     |
| 이수현    |      10 | YG엔터테이먼트       | 2020-09-26     |
+-----------+---------+----------------------+----------------+
2 rows in set (0.00 sec)
profile
제로베이스 DA7 김예빈입니다.

0개의 댓글