[TIL] SQL: JOIN vs UNION, INNER JOIN vs OUTER JOIN

Jene Hojin Choi·2021년 2월 7일
0
post-thumbnail

1. JOIN VS UNION

1-1. JOIN


SQL의 JOIN은 서로 다른 테이블들의 공통점을 기반으로 데이터를 합치는 것이다.
JOIN으로 기존의 다양한 column들을 가져와서 새로운 column들이 있는 테이블을 생성한다.

1-2. UNION

SQL의 UNION은 두가지 혹은 더 많은 개수의 SELECT을 이용하여 데이터를 합친다.
UNION으로 같은 column의 데이터들을 합쳐서 새로운 row들이 있는 테이블을 생성한다.

1-3. 예시

다음과 같이 주어진 데이터가 있다고 하자.

mysql> SELECT * FROM students;
+-----------+----------+------+
| StudentID | name     | age  |
+-----------+----------+------+
|         1 | Hojin    |   19 |
|         2 | Antoo    |   10 |
|         3 | student3 |   13 |
|         4 | student4 |   14 |
|         5 | student5 |   15 |
|         6 | student6 |   16 |
+-----------+----------+------+


mysql> SELECT * FROM csmajors;
+-----------+-----------+------------+
| StudentID | name      | language   |
+-----------+-----------+------------+
|         1 | Jene      | python     |
|         7 | csmajor7  | GO         |
|         8 | csmajor8  | Swift      |
|         9 | csmajor9  | java       |
|        10 | csmajor10 | javascript |
+-----------+-----------+------------+


JOIN

mysql> SELECT students.StudentID, students.name, students.age, csmajors.language
    -> FROM students 
    -> INNER JOIN csmajors 
    -> ON students.StudentID=csmajors.StudentID;
+-----------+-------+------+----------+
| StudentID | name  | age  | language |
+-----------+-------+------+----------+
|         1 | Hojin |   19 | python   |
+-----------+-------+------+----------+

UNION

mysql> SELECT students.StudentID, students.name
    -> FROM students
    -> UNION
    -> SELECT csmajors.StudentID, csmajors.name
    -> FROM csmajors;
+-----------+-----------+
| StudentID | name      |
+-----------+-----------+
|         1 | Hojin     |
|         2 | Antoo     |
|         3 | student3  |
|         4 | student4  |
|         5 | student5  |
|         6 | student6  |
|         1 | Jene      |
|         7 | csmajor7  |
|         8 | csmajor8  |
|         9 | csmajor9  |
|        10 | csmajor10 |
+-----------+-----------+

2. INNER JOIN vs OUTER JOIN

2-1. INNER JOIN

INNER JOIN은 두 테이블간의 공통적인 column을 기준으로 공통된 부분을 합쳐서 새로운 데이터를 만든다.

SELECT table1.column1,table1.column2,table2.column1,....
FROM table1 
INNER JOIN table2
ON table1.matching_column = table2.matching_column;
drawing

2-2. OUTER JOIN

LEFT

LEFT JOIN은 OUTER LEFT JOIN이다. 이는 왼쪽 테이블의 모든 row를 가져오는 반면, 오른쪽 테이블에서는 공통된 부분이 존재하는 row만 가져온다. 만약 오른쪽에 맞는 row가 없다면, null을 보여줄 것이다.

SELECT table1.column1,table1.column2,table2.column1,....
FROM table1 
LEFT JOIN table2
ON table1.matching_column = table2.matching_column;
drawing

2-3. 예시

다음과 같이 주어진 데이터가 있다고 하자.

mysql> SELECT * FROM students;
+-----------+----------+------+
| StudentID | name     | age  |
+-----------+----------+------+
|         1 | Hojin    |   19 |
|         2 | Antoo    |   10 |
|         3 | student3 |   13 |
|         4 | student4 |   14 |
|         5 | student5 |   15 |
|         6 | student6 |   16 |
+-----------+----------+------+


mysql> SELECT * FROM csmajors;
+-----------+-----------+------------+
| StudentID | name      | language   |
+-----------+-----------+------------+
|         1 | Jene      | python     |
|         7 | csmajor7  | GO         |
|         8 | csmajor8  | Swift      |
|         9 | csmajor9  | java       |
|        10 | csmajor10 | javascript |
+-----------+-----------+------------+


INNER JOIN

mysql> SELECT students.StudentID, students.name, students.age, csmajors.language
    -> FROM students 
    -> INNER JOIN csmajors 
    -> ON students.StudentID=csmajors.StudentID;
+-----------+-------+------+----------+
| StudentID | name  | age  | language |
+-----------+-------+------+----------+
|         1 | Hojin |   19 | python   |
+-----------+-------+------+----------+

LEFT JOIN

mysql> SELECT students.StudentID, students.name, csmajors.language 
    -> FROM students 
    -> LEFT JOIN csmajors 
    -> ON students.StudentID=csmajors.StudentID;
+-----------+----------+----------+
| StudentID | name     | language |
+-----------+----------+----------+
|         1 | Hojin    | python   |
|         2 | Antoo    | NULL     |
|         3 | student3 | NULL     |
|         4 | student4 | NULL     |
|         5 | student5 | NULL     |
|         6 | student6 | NULL     |
+-----------+----------+----------+

RIGHT JOIN

mysql> SELECT students.StudentID, students.name, csmajors.language 
    -> FROM students 
    -> RIGHT JOIN csmajors 
    -> ON students.StudentID=csmajors.StudentID;
+-----------+-------+------------+
| StudentID | name  | language   |
+-----------+-------+------------+
|         1 | Hojin | python     |
|      NULL | NULL  | GO         |
|      NULL | NULL  | Swift      |
|      NULL | NULL  | java       |
|      NULL | NULL  | javascript |
+-----------+-------+------------+

2-4. Wrap-up

  • INNER JOIN:
    순서는 상관이 없다, 무조건적으로 공통된 것을 기준으로 합친다.

  • OUTER JOIN(LEFT, RIGHT, FULL)
    순서가 상관이 있다. LEFT JOIN은 LEFT 테이블의 모든 row를 가져온다. RIGHT는 마찬가지로 RIGHT 테이블의 모든 row를 가져온다.

다음의 그림을 보면 이해가 쉽다.

0개의 댓글