웹에서 게시판을 만들어보게 되면서 DataBase
를 접하게 되었다. 각 주제에 따라 테이블을 나누어 작성한 후, 정보를 가져오는 경우 테이블을 합치는 경우가 있었다. 이때 JOIN
을 사용하게 되는데, 그 중 많이 사용하는 것이 LEFT JOIN
과 INNER JOIN
이었다. 이 둘의 차이에 대해 알아보자.
아래는 예제로 사용할 테이블이다. DBMS
는 MariaDB
를 사용했다.
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 JOIN
은 OUTER 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_id
가 NULL
인 행이 결과에서 제외된 것을 알 수 있다.
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 JOIN
과 INNER JOIN
은 같은 조회 결과를 보인다. 이때, INNER JOIN
이 상대적으로 성능이 좋다고 한다.
교집합만 고려하다보니 빠를 것 같긴 하다.
LEFT JOIN
은 합집합,INNER JOIN
은 교집합이다.
결과가 같다면LEFT JOIN
대신INNER JOIN
을 사용하자.