[TIL] 20.09.03 MySQL - LEFT JOIN

김지욱·2020년 9월 3일
0

코드스테이츠

목록 보기
34/38

  • JOIN 명령어의 느낌은 알겠는데 머릿속으로 잘 그려지지가 않았다. 오늘 스프린트에서 실제로 사용을 해 보니까 A를 기준으로 JOIN을 해야 할지 B를 기준으로 해야 할지 몰라서 결국 둘 다 해보고 답을 찾아야 했다.
  • 조금 더 연습을 해 보기 위해서 생활코딩 SQL Join 강의를 보고 실습하고 이해한 내용에 대해서 정리를 해 봤다.

1. 테이블들

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

***author 테이블***
+-----+----------+--------+------------+
| aid | name     | city   | profile_id |
+-----+----------+--------+------------+
|   1 | egoing   | seoul  |          1 |
|   2 | leezche  | jeju   |          2 |
|   3 | blackdew | namhae |          3 |
+-----+----------+--------+------------+

***profile 테이블***
+-----+-----------+------------------+
| pid | title     | description      |
+-----+-----------+------------------+
|   1 | developer | developer is ... |
|   2 | designer  | designer is ..   |
|   3 | DBA       | DBA is ...       |
+-----+-----------+------------------+

2. LEFT JOIN

SELECT * FROM topic LEFT JOIN author
ON topic.author_id = author.aid

이 내용을 해석 해 보면
SELECT * FROM topic LEFT JOIN author
⇒ topic 테이블 왼쪽에 두고 그 오른쪽에 author테이블을 넣겠다.

ON topic.author_id = author.aid
⇒ topic테이블의 author_id(식별자)와 author테이블의 aid(식별자)의 값이 같은데 그걸 참고해서 두개의 테이블을 하나로 만든다.

  • 같은 식별자가 없는 공간?은 NULL로 표시된다.
  • 왼쪽을 기준으로 하기 때문에 NULL이 나왔다는건 왼쪽에 있는 데이터가 오른쪽에는 없다는 의미.

결과

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

3. LEFT JOIN 중복 사용하기

SELECT * FROM topic 
LEFT JOIN author 
ON topic.author_id = author.aid 
LEFT JOIN profile 
ON author.profile_id = profile.pid;
  • 이렇게 세 가지를 붙일 수도 있다.
  • 기존에 만든거에 오른쪽에 profile을 넣는다.

결과

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

4. 특정한 값들만 SELECT 해 줄수도 있다.

SELECT tid, topic.title, author_id, name, profile.title 
AS job_title 
FROM topic 
LEFT JOIN author 
ON topic.author_id = author.aid 
LEFT JOIN profile 
ON author.profile_id = profile.pid;

SELECT tid, topic.title, author_id, name, profile.title
⇒ 위의 내용들과 비슷하지만 다른점은 표에 이 정보들만 담아 온다.

결과

mysql> SELECT tid, topic.title, author_id, name, profile.title AS job_title FROM topic LEFT JOIN author ON topic.author_id = author.aid LEFT JOIN profile ON author.profile_id = profile.pid;
+-----+------------+-----------+---------+-----------+
| tid | title      | author_id | name    | job_title |
+-----+------------+-----------+---------+-----------+
|   1 | HTML       | 1         | egoing  | developer |
|   2 | CSS        | 2         | leezche | designer  |
|   3 | JavaScript | 1         | egoing  | developer |
|   4 | Database   | NULL      | NULL    | NULL      |
+-----+------------+-----------+---------+-----------+

5. WHERE (조건) 추가해 주기

작성자가 egoing인 사람만 표시해 주고 싶다면?

  • egoing의 키값은 aid= 1이다.WHERE aid=1
SELECT tid, topic.title, author_id, name, profile.title AS job_title 
FROM topic 
LEFT JOIN author 
ON topic.author_id = author.aid 
LEFT JOIN profile 
ON author.profile_id = profile.pid 
WHERE aid=1;

결과

+-----+------------+-----------+--------+-----------+
| tid | title      | author_id | name   | job_title |
+-----+------------+-----------+--------+-----------+
|   1 | HTML       | 1         | egoing | developer |
|   3 | JavaScript | 1         | egoing | developer |
+-----+------------+-----------+--------+-----------+


+몇 가지 테스트들

mysql> 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 |
+-----+------------+------------------+-----------+------+---------+-------+------------+
mysql> SELECT * FROM author LEFT JOIN topic ON author.aid = topic.author_id;
+-----+----------+--------+------------+------+------------+------------------+-----------+
| aid | name     | city   | profile_id | tid  | title      | description      | author_id |
+-----+----------+--------+------------+------+------------+------------------+-----------+
|   1 | egoing   | seoul  |          1 |    1 | HTML       | HTML is ...      | 1         |
|   1 | egoing   | seoul  |          1 |    3 | JavaScript | JavaScript is .. | 1         |
|   2 | leezche  | jeju   |          2 |    2 | CSS        | CSS is ...       | 2         |
|   3 | blackdew | namhae |          3 | NULL | NULL       | NULL             | NULL      |
+-----+----------+--------+------------+------+------------+------------------+-----------+
mysql> SELECT * FROM topic RIGHT 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 |
|    3 | JavaScript | JavaScript is .. | 1         |   1 | egoing   | seoul  |          1 |
|    2 | CSS        | CSS is ...       | 2         |   2 | leezche  | jeju   |          2 |
| NULL | NULL       | NULL             | NULL      |   3 | blackdew | namhae |          3 |
+------+------------+------------------+-----------+-----+----------+--------+------------+

0개의 댓글