mysql> SELECT * from topic;
+----+------------+-------------------+---------------------+----------+---------------------------+
| id | title | description | created | author | profile |
+----+------------+-------------------+---------------------+----------+---------------------------+
| 1 | MySQL | MySQL is ... | 2021-07-03 23:11:45 | sanghyuk | developer |
| 2 | ORACLE | ORACLE is ... | 2021-07-04 00:24:59 | sanghyuk | developer |
| 3 | SQL server | SQL server is ... | 2021-07-04 00:25:29 | john doe | database administrator |
| 4 | PostgreSQL | postgreSQL is ... | 2021-07-04 00:26:27 | Joe | data scientist, developer |
| 5 | MongoDB | MongoDB is ... | 2021-07-04 09:57:25 | sanghyuk | developer |
+----+------------+-------------------+---------------------+----------+---------------------------+
위 테이블을 보면 저자들에 대한 정보가 중복되는것을 확인할 수 있는데요,
테이블에 데이터가 중복해서 들어가 있는경우
- 중요한 신호
- 개선할 것이 있다라는 증거 입니다.
행이 1억개라고 생각하고 천만개 데이터가 중복된다면 여러가지 문제가 생깁니다. 그리고 그데이터가 엄청난 크기의 데이터라면 더 큰 문제가 되겠죠.
또한 위 테이블 같은 경우에는 이름과 프로필이 같을경우에 그 사람이 같은사람인지 다른사람인지 판별할 방법이 없기도 하죠
이를 해결하기위해 저자에 관련된 부분과 토픽을 테이블에서 아래와 같이 분리시켜 줍니다.
topic 테이블
mysql> SELECT * FROM topic;
+----+------------+-------------------+---------------------+-----------+
| id | title | description | created | author\_id |
+----+------------+-------------------+---------------------+-----------+
| 1 | MySQL | MySQL is... | 2018-01-01 12:10:11 | 1 |
| 2 | Oracle | Oracle is ... | 2018-01-03 13:01:10 | 1 |
| 3 | SQL Server | SQL Server is ... | 2018-01-20 11:01:10 | 2 |
| 4 | PostgreSQL | PostgreSQL is ... | 2018-01-23 01:03:03 | 3 |
| 5 | MongoDB | MongoDB is ... | 2018-01-30 12:31:03 | 1 |
+----+------------+-------------------+---------------------+-----------+
author 테이블
mysql> SELECT * FROM author;
+----+--------+---------------------------+
| id | name | profile |
+----+--------+---------------------------+
| 1 | egoing | developer |
| 2 | duru | database administrator |
| 3 | taeho | data scientist, developer |
+----+--------+---------------------------+
중복을 없애주고, 동일명, 동일 프로필의 경우도 알아낼 수 있어 좋긴한데, 첫번재 테이블 처럼 모든 정보를 볼 수가 없습니다.
하지만 이는 데이터를 조회할때 관계형 데이터베이스의 꽃인 JOIN 쿼리를 활용하여 이전에 보이던 것처럼 바꿀 수 있습니다.
문법
SELECT * FROM <table1> LEFT JOIN <table2> ON <table1데이터> = <table2데이터>;
여기서 ON 절에는 어떻게 두 테이블을 조인할 것인가에 대한 조건을 담아주는 절인데, topic 의 author_id와 author 테이블의 id를 맵핑하면 되겠죠.
실습
mysql> SELECT * FROM topic LEFT JOIN author ON topic.author_id = author.id;
+----+------------+-------------------+---------------------+-----------+------+--------+---------------------------+
| id | title | description | created | author\_id | id | name | profile |
+----+------------+-------------------+---------------------+-----------+------+--------+---------------------------+
| 1 | MySQL | MySQL is... | 2018-01-01 12:10:11 | 1 | 1 | egoing | developer |
| 2 | Oracle | Oracle is ... | 2018-01-03 13:01:10 | 1 | 1 | egoing | developer |
| 3 | SQL Server | SQL Server is ... | 2018-01-20 11:01:10 | 2 | 2 | duru | database administrator |
| 4 | PostgreSQL | PostgreSQL is ... | 2018-01-23 01:03:03 | 3 | 3 | taeho | data scientist, developer |
| 5 | MongoDB | MongoDB is ... | 2018-01-30 12:31:03 | 1 | 1 | egoing | developer |
+----+------------+-------------------+---------------------+-----------+------+--------+---------------------------+
제일 처음 다 합쳐져 있던 테이블과 얼추 비슷한데, author_id와 id부분이 거슬리네요. 원하는 컬럼만 보고싶을때는 SELECT절에 원하는 컬럼을 적어주면되겠죠?
mysql> SELECT t.id, t.title, t.description, t.created, a.name, a.profile
FROM topic t LEFT JOIN author a
ON t.author_id = a.id;
+----+------------+-------------------+---------------------+--------+---------------------------+
| id | title | description | created | name | profile |
+----+------------+-------------------+---------------------+--------+---------------------------+
| 1 | MySQL | MySQL is... | 2018-01-01 12:10:11 | egoing | developer |
| 2 | Oracle | Oracle is ... | 2018-01-03 13:01:10 | egoing | developer |
| 3 | SQL Server | SQL Server is ... | 2018-01-20 11:01:10 | duru | database administrator |
| 4 | PostgreSQL | PostgreSQL is ... | 2018-01-23 01:03:03 | taeho | data scientist, developer |
| 5 | MongoDB | MongoDB is ... | 2018-01-30 12:31:03 | egoing | developer |
+----+------------+-------------------+---------------------+--------+---------------------------+
유의할 점은 선택한 컬럼이 어떤테이블에서 올건지에 대한점을 정해줘야 한다는 점입니다. 이때 조금더 간결하기 위해서 FROM절에서 ALIAS설정을 해주면 조금더 편하죠 topic AS t 라고 해줘도되고 한칸띄우고 t를 적어줘도 무방합니다.