[SQL/Oracle] LEFT JOIN과 INNER JOIN의 차이

글을 쓰지 못했던 3개월간 정말 많은 일들이 있었다. 중고신입으로 더 좋은 회사에 이직하게되어 인턴 과정을 끝내고 정직원이 되어 부서 배치까지 받았다.

새로운 부서에 아직 적응 중이지만 이곳에서는 SQL 지식이 중요하다는 것을 알게되었고 그동안 많이 부족했던 SQL 지식을 공부하며 늘려가고자 한다.

오늘은 가장 많이 쓰이는 LEFT JOIN과 INNER JOIN의 차이점에 대해서 알아볼 것이다.

OUTER JOIN (합집합)


먼저 OUTER JOIN에 대해서 보면 OUTER JOIN은 기준테이블값과 조인테이블과 중복된 값을 보여준다.

한마디로 합집합을 의미한다.

LEFT JOIN은 OUTER JOIN의 일종이고 LEFT OUTER JOIN이라고 볼 수 있다.

그렇다면 JOIN을 어떤식으로 활용하는지 간단한 예제 테이블을 통해서 보도록 하자.

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 |
+-----+----------+--------+------------+

위 두 테이블을 활용해 LEFT 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 (교집합)


OUTER JOIN과 반대로 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이 상대적으로 성능이 더 좋다고 한다.



마무리


오늘은 자주 쓰이는 JOIN에 대해서 알아봤다. 앞으로 일하면서 굉장히 많이 쓸 것이기에 확실하게 익혀놔야겠다.

현재 회사에서는 내가 원하던 앱 개발을 하기 힘든 환경이라 새로운 업무를 배우며 적응중인데 개발 실력 향상을 위해서는 앞으로 따로 공부가 필요할 것 같다.

퇴근 후에 시간을 내서 틈틈히 앱 개발 공부를 놓지 않고 sql도 공부하며 자격증도 취득할 예정이다.

Categories:

Updated: