MariaDB / LEFT JOIN, RIGHT JOIN, INNER JOIN

JOIN

SQL의 JOIN은 여러 테이블을 한 번에 나타낼 때 사용합니다. 대표적인 JOIN 방식은 LEFT JOIN, RIGHT JOIN, INNER JOIN이 있습니다.

다음은 세 가지 JOIN의 차이를 알아보기 위한 간단한 예제 테이블입니다.

  • A 테이블에는 나라, B 테이블에는 도시가 있습니다.
  • 도시가 어떤 나라의 도시인지는 a_no로 확인합니다.
  • 나라는 있는데 도시가 없는 것도 있고, 나라는 없는데 도시는 있는 것도 있습니다.
  • A 테이블과 B 테이블을 동시에 나타낸 것이 두 번째 표입니다.

LEFT JOIN

FROM A LEFT JOIN B

A에 B를 붙입니다. A 테이블의 자료는 다 나오고, B 테이블에 대응하는 값이 없으면 NULL을 출력합니다.

MariaDB [employees]> SELECT A.a_country, B.b_city
    -> FROM A
    -> LEFT JOIN B
    -> ON A.a_no = B.a_no
    -> ;
+-----------+--------+
| a_country | b_city |
+-----------+--------+
| A         | AA     |
| B         | BB     |
| C         | NULL   |
| D         | NULL   |
| E         | NULL   |
+-----------+--------+
5 rows in set (0.00 sec)

RIGHT JOIN

FROM A RIGHT JOIN B

B에 A를 붙입니다. B 테이블의 자료는 다 나오고, A 테이블에 대응하는 갑이 없으면 NULL을 출력합니다.

MariaDB [employees]> SELECT A.a_country, B.b_city
    -> FROM A
    -> RIGHT JOIN B
    -> ON A.a_no = B.a_no
    -> ;
+-----------+--------+
| a_country | b_city |
+-----------+--------+
| A         | AA     |
| B         | BB     |
| NULL      | FF     |
| NULL      | GG     |
+-----------+--------+
4 rows in set (0.00 sec)

LEFT JOIN으로 같은 결과를 만들 수 있습니다.

MariaDB [employees]> SELECT A.a_country, B.b_city
    -> FROM B
    -> LEFT JOIN A
    -> ON A.a_no = B.a_no
    -> ;
+-----------+--------+
| a_country | b_city |
+-----------+--------+
| A         | AA     |
| B         | BB     |
| NULL      | FF     |
| NULL      | GG     |
+-----------+--------+
4 rows in set (0.00 sec)

INNER JOIN

연결된 값이 있는 것만 출력합니다. 즉, 대응하는 값이 없으면 출력하지 않으므로 NULL은 찾을 수 없습니다.

MariaDB [employees]> SELECT A.a_country, B.b_city
    -> FROM A
    -> INNER JOIN B
    -> ON A.a_no = B.a_no
    -> ;
+-----------+--------+
| a_country | b_city |
+-----------+--------+
| A         | AA     |
| B         | BB     |
+-----------+--------+
2 rows in set (0.00 sec)

LEFT JOIN에 WHERE문을 추가해서 같은 결과를 만들 수 있습니다.

MariaDB [employees]> SELECT A.a_country, B.b_city
    -> FROM A
    -> LEFT JOIN B
    -> ON A.a_no = B.a_no
    -> WHERE B.b_city IS NOT NULL
    -> ;
+-----------+--------+
| a_country | b_city |
+-----------+--------+
| A         | AA     |
| B         | BB     |
+-----------+--------+
2 rows in set (0.00 sec)

세 개 이상 테이블 JOIN

테이블이 세 개 이상인 경우 JOIN을 연달아 입력해서 연결시킵니다. 예를 들어 다음과 같은 자료가 있다고 합시다. 위의 DB에 도시의 인구 수를 담은 C 테이블을 추가한 것입니다.

다음은 나라, 도시, 인구 수를 출력하는 쿼리입니다.

MariaDB [employees]> SELECT A.a_country, B.b_city, C.c_pop
    -> FROM A
    -> INNER JOIN B ON A.a_no = B.a_no
    -> INNER JOIN C ON B.b_no = C.b_no
    -> ;
+-----------+--------+-------+
| a_country | b_city | c_pop |
+-----------+--------+-------+
| A         | AA     |  1000 |
| B         | BB     |  2000 |
+-----------+--------+-------+
2 rows in set (0.01 sec)