[SQL] LEFT JOIN, INNER JOIN 차이

웹에서 게시판을 만들어보게 되면서 DataBase를 접하게 되었다. 각 주제에 따라 테이블을 나누어 작성한 후, 정보를 가져오는 경우 테이블을 합치는 경우가 있었다. 이때 JOIN을 사용하게 되는데, 그 중 많이 사용하는 것이 LEFT JOININNER JOIN이었다. 이 둘의 차이에 대해 알아보자.


아래는 예제로 사용할 테이블이다. DBMSMariaDB를 사용했다.

SELECT * FROM topic;
+-----+------------+------------------+-----------+
| tid | title      | description      | author_id |
+-----+------------+------------------+-----------+
|   1 | HTML       | HTML is ...      | 1         |
|   2 | CSS        | CSS is ...       | 2         |
|   3 | JavaScript | JavaScript is .. | 1         |
|   4 | Database   | Database is ...  | NULL      |
+-----+------------+------------------+-----------+

SELECT * FROM author;
+-----+----------+--------+------------+
| aid | name     | city   | profile_id |
+-----+----------+--------+------------+
|   1 | egoing   | seoul  |          1 |
|   2 | leezche  | jeju   |          2 |
|   3 | blackdew | namhae |          3 |
+-----+----------+--------+------------+

교집합, 합집합에 대한 설명은 아래 이미지를 참고해라.


OUTER JOIN - 합집합

LEFT JOINOUTER JOIN의 일종이다. 따라서 LEFT OUTER JOIN이라고 볼 수 있다.
OUTER JOIN합집합을 의미한다.

여기서 LEFT JOIN은 왼쪽의 모든 행을 조회한다. 따라서 topic테이블의 author_id 필드의 값이 NULL이면, author 테이블은 해당 행이 존재하지 않으므로 해당 행의 필드 값들은 NULL로 채워진다.

SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.aid;
+-----+------------+------------------+-----------+------+---------+-------+------------+
| tid | title      | description      | author_id | aid  | name    | city  | profile_id |
+-----+------------+------------------+-----------+------+---------+-------+------------+
|   1 | HTML       | HTML is ...      | 1         |    1 | egoing  | seoul |          1 |
|   2 | CSS        | CSS is ...       | 2         |    2 | leezche | jeju  |          2 |
|   3 | JavaScript | JavaScript is .. | 1         |    1 | egoing  | seoul |          1 |
|   4 | Database   | Database is ...  | NULL      | NULL | NULL    | NULL  |       NULL |
+-----+------------+------------------+-----------+------+---------+-------+------------+

INNER JOIN - 교집합

말 그대로 교집합을 나타낸다. 따라서 겹치지 않는 행이 존재할 경우, 그 행은 결과에서 제외된다.
결과를 보면 author_idNULL인 행이 결과에서 제외된 것을 알 수 있다.

SELECT * FROM topic INNER JOIN author ON topic.author_id = author.aid;
+-----+------------+------------------+-----------+-----+---------+-------+------------+
| tid | title      | description      | author_id | aid | name    | city  | profile_id |
+-----+------------+------------------+-----------+-----+---------+-------+------------+
|   1 | HTML       | HTML is ...      | 1         |   1 | egoing  | seoul |          1 |
|   2 | CSS        | CSS is ...       | 2         |   2 | leezche | jeju  |          2 |
|   3 | JavaScript | JavaScript is .. | 1         |   1 | egoing  | seoul |          1 |
+-----+------------+------------------+-----------+-----+---------+-------+------------+

성능 차이

두 테이블에서 JOIN을 위한 기준 열이 서로 값을 가지고 있는 경우 조회에서 누락되는 행은 존재하지 않는다.

그렇다면 LEFT JOININNER JOIN은 같은 조회 결과를 보인다. 이때, INNER JOIN이 상대적으로 성능이 좋다고 한다.

교집합만 고려하다보니 빠를 것 같긴 하다.


정리

LEFT JOIN합집합, INNER JOIN교집합이다.
결과가 같다면 LEFT JOIN 대신 INNER JOIN을 사용하자.


게시판 프로젝트 URL

Github - Profile-exe/CRUDboardsite

좋은 웹페이지 즐겨찾기