관계형 데이터베이스의 필요성
기존의 테이블에는 데이터의 중복이 존재한다. (author의 egoing, profile의 developer)
데이터가 중복되면 여러 가지 문제가 발생한다. 예를 들어 데이터의 수정이 필요한데 그 데이터가 천만 개라면?
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/034.gif)
이를 해결하기 위해 관계형 데이터베이스가 필요하다.
중복된 데이터들이 사라졌다! author 테이블의 식별값인 id값은 해당되는 데이터에 넣어준다.
새로운 topic 테이블에서 egoing을 john으로 수정해야 하면
author 테이블에서 id = 1에 해당하는 데이터의 이름만을 수정해주면 된다. → 유지보수 용이
테이블 분리하기
author 테이블과 topic 테이블 각각 만들기
mysql> select * from author;
+----+--------+---------------------------+
| id | name | profile |
+----+--------+---------------------------+
| 1 | egoing | developer |
| 2 | duru | database administrator |
| 3 | taeho | data scientist, developer |
+----+--------+---------------------------+
3 rows in set (0.00 sec)
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 |
+----+------------+-------------------+---------------------+-----------+
5 rows in set (0.00 sec)
JOIN
하나의 테이블에 원하는 데이터가 모두 있다면 참 좋겠지만, 두 개의 테이블을 엮어야 원하는 결과가 나오는 경우가 많다. 조인을 쓰면 두 개의 테이블을 엮어서 원하는 데이터를 추출할 수 있다.
SELECT *
FROM <첫 번째 테이블>
LEFT JOIN <두 번째 테이블>
ON <조인 조건> // a.key = b.key
[WHERE 검색 조건]
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 |
+----+------------+-------------------+---------------------+-----------+------+--------+---------------------------+
5 rows in set (0.00 sec)
author_id와 id가 보기 싫으면 보고 싶은 컬럼만 선별해 LEFT JOIN을 하면 된다.
SELECT column1, column2, ⋯
FROM <첫 번째 테이블>
LEFT JOIN <두 번째 테이블>
ON <조인 조건> // a.key = b.key
[WHERE 검색 조건]
이때 topic 테이블과 author 테이블 둘 다 id 컬럼이 존재하므로 그냥 id라고 쓰면 에러가 난다.
mysql> SELECT id, title, description, created, name, profile FROM topic LEFT JOIN author ON topic.author_id = author.id;
ERROR 1052 (23000): Column 'id' in field list is ambiguous
topic 테이블의 id를 의미하고 싶을 때에는 topic.id라고 명시해야 한다.
mysql> SELECT topic.id, title, description, created, name, profile FROM topic LEFT JOIN author ON topic.author_id = author.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 |
+----+------------+-------------------+---------------------+--------+---------------------------+
5 rows in set (0.00 sec)
이렇게 했는데도 뭔가 아쉽다. 저 id가 topic의 id인지 author의 id인지 명시해주고 싶다면 AS를 활용하여 명시하고 싶은 컬럼명을 적어준다.
mysql> SELECT topic.id AS topic_id, title, description, created, name, profile FROM topic LEFT JOIN author ON topic.author_id = author.id;
+----------+------------+-------------------+---------------------+--------+---------------------------+
| topic_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 |
+----------+------------+-------------------+---------------------+--------+---------------------------+
5 rows in set (0.00 sec)
인터넷과 데이터베이스
인터넷이 동작하기 위해서는 컴퓨터가 최소 두 대 필요하다.
- 클라이언트(client): 사용자의 입력을 처리하여 서버에 요청
- 서버(server): 클라이언트의 요청을 받아 처리하고, 이를 다시 클라이언트에게 응답으로 보냄
MySQL에서도 마찬가지이다. database client는 서버에 접속할 수 있고, database server에서 실제로 데이터가 저장된다.
그동안 실습을 하면서 우리는 database server를 직접 다루는 것처럼 보였지만 사실은 database client를 통해 서버를 사용하고 있는 것이었다.
지금까지 사용했던 데이터베이스 클라이언트는 MySQL Monitor였고, 또 다른 클라이언트로는 MySQL Workbench가 존재한다. MySQL Workbench는 비주얼 데이터베이스 설계 도구로, 이것을 사용하면 데이터베이스에 있는 정보를 코드가 아닌, 엑셀처럼 마우스로 컨트롤할 수 있다.
→ 이 세상에는 어마어마한 MySQL client가 있다고 해도 과언이 아니다.