관계형 데이터베이스 실습

Hevton·2020년 9월 6일
0
post-custom-banner

이번 글에서는 관계형 데이터베이스 방식으로 데이터를 생성한 뒤에, 관계형 데이터베이스의 꽃인 JOIN 명령어를 실습해보겠습니다.
우선 테이블들 간에 관련이 있게 만든 관계형 데이터베이스를 보여드리겠습니다.

mysql> DESC BOOK;
+-------------+-------------+------+-----+---------+----------------+
| Field       | Type        | Null | Key | Default | Extra          |
+-------------+-------------+------+-----+---------+----------------+
| id          | int         | NO   | PRI | NULL    | auto_increment |
| title       | varchar(30) | NO   |     | NULL    |                |
| description | text        | YES  |     | NULL    |                |
| maker_id    | int         | YES  |     | NULL    |                |
+-------------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

mysql> DESC maker;
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int          | NO   | PRI | NULL    | auto_increment |
| name    | varchar(20)  | NO   |     | NULL    |                |
| profile | varchar(200) | YES  |     | NULL    |                |
+---------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

다시한번 언급하자면 DESC 명령어는 테이블의 데이터 타입 구성을 보여주는 명령어입니다.
BOOK 이라는 테이블 안에서 maker_id 라는 값을 이용해 make 테이블의 id와 연관지어 놓은 상태입니다. 하나의 테이블로 구성해도 됐을 데이터를 지금 두테이블로 분리해놓은 상태죠. 이렇게 분리해 놓는게 나중에 테이블들이 늘어날 때의 유지보수의 효과는 비대해집니다.

각 테이블 안에 들어있는 값을 보여드리겠습니다.

mysql> SELECT * FROM BOOK;
+----+-------------+---------------+----------+
| id | title       | description   | maker_id |
+----+-------------+---------------+----------+
|  1 | About Music | Music is Life |        1 |
|  2 | About Life  | Life is alone |        1 |
|  3 | Math Book   | Math.PI...    |        2 |
|  4 | Novel Book  | I am handsome |        3 |
|  5 | About Time  | TimeTravel    |        1 |
+----+-------------+---------------+----------+
5 rows in set (0.07 sec)

mysql> SELECT * FROM maker;
+----+--------+-----------+
| id | name   | profile   |
+----+--------+-----------+
|  1 | Hevton | developer |
|  2 | James  | teacher   |
|  3 | Pyro   | designer  |
+----+--------+-----------+
3 rows in set (0.00 sec)

이렇게 하면 관계형 데이터베이스 실습을 위한 구성이 완료된 상태입니다. 이렇게 데이터를 두 테이블로 나누어 놓으면, 데이터를 읽을 때 직관적이지가 않은 단점이 있는데요, 이를 극복할 수 있는 관계형 데이터베이스의 꽃인 JOIN 이라는 명령어를 사용해서 두 테이블을 마치 하나의 테이블인 것 처럼 합쳐서 읽어들이도록 하겠습니다.

∙ JOIN

분리된 테이블들을 읽어들일 때 마치 하나의 테이블인 것 처럼 불러들일 수 있게 하는 명령어입니다.

mysql> SELECT * FROM BOOK LEFT JOIN maker ON BOOK.maker_id=maker.id;
+----+-------------+---------------+----------+------+--------+-----------+
| id | title       | description   | maker_id | id   | name   | profile   |
+----+-------------+---------------+----------+------+--------+-----------+
|  1 | About Music | Music is Life |        1 |    1 | Hevton | developer |
|  2 | About Life  | Life is alone |        1 |    1 | Hevton | developer |
|  3 | Math Book   | Math.PI...    |        2 |    2 | James  | teacher   |
|  4 | Novel Book  | I am handsome |        3 |    3 | Pyro   | designer  |
|  5 | About Time  | TimeTravel    |        1 |    1 | Hevton | developer |
+----+-------------+---------------+----------+------+--------+-----------+
5 rows in set (0.01 sec)

BOOK 테이블의 maker_id 와 maker 테이블의 id의 매칭을 기준으로 두 테이블을 합쳐서 보이게 한 상태인데요, 여기서 LEFT JOIN 은 BOOK 테이블을의 데이터 나열을 기준으로 보여달라는 말입니다. 만약 RIGHT JOIN을 하게 된다면

mysql> SELECT * FROM BOOK RIGHT JOIN maker ON BOOK.maker_id=maker.id;
+------+-------------+---------------+----------+----+--------+-----------+
| id   | title       | description   | maker_id | id | name   | profile   |
+------+-------------+---------------+----------+----+--------+-----------+
|    1 | About Music | Music is Life |        1 |  1 | Hevton | developer |
|    2 | About Life  | Life is alone |        1 |  1 | Hevton | developer |
|    5 | About Time  | TimeTravel    |        1 |  1 | Hevton | developer |
|    3 | Math Book   | Math.PI...    |        2 |  2 | James  | teacher   |
|    4 | Novel Book  | I am handsome |        3 |  3 | Pyro   | designer  |
+------+-------------+---------------+----------+----+--------+-----------+
5 rows in set (0.01 sec)

이렇게 maker_id와 id의 순서가 바뀐 것을 알 수 있습니다. LEFT JOIN을 했을 경우는 BOOK 테이블에 저장된 데이터 상태를 기준으로 maker 테이블을 불러들였다면 RIGHT JOIN을 하게 되면 maker 테이블에 저장된 데이터 상태를 기준으로 BOOK 테이블을 맞춰서 읽어들인 것이죠. 이처럼 LEFT, RIGHT는 어느 테이블 순서를 기준으로 보여줄 것인가를 지정해줍니다.
여기서 maker_id 와 id를 안보이게 출력하고싶으면 아래와 같이 하시면 됩니다.

mysql> SELECT BOOK.id, BOOK.title, BOOK.description, maker.name, maker.profile FROM BOOK LEFT JOIN maker ON BOOK.maker_id=maker.id;
+----+-------------+---------------+--------+-----------+
| id | title       | description   | name   | profile   |
+----+-------------+---------------+--------+-----------+
|  1 | About Music | Music is Life | Hevton | developer |
|  2 | About Life  | Life is alone | Hevton | developer |
|  3 | Math Book   | Math.PI...    | James  | teacher   |
|  4 | Novel Book  | I am handsome | Pyro   | designer  |
|  5 | About Time  | TimeTravel    | Hevton | developer |
+----+-------------+---------------+--------+-----------+
5 rows in set (0.00 sec)

또한 여기서 AS를 이용해서 출력에 약간 변화를 줄 수도 있습니다. 예를 들면 id컬럼을 BOOK_id 로 보이게끔 말이죠.

mysql> SELECT BOOK.id AS BOOK_id, BOOK.title, BOOK.description, maker.name, maker.profile FROM BOOK LEFT JOIN maker ON BOOK.maker_id=maker.id;
+---------+-------------+---------------+--------+-----------+
| BOOK_id | title       | description   | name   | profile   |
+---------+-------------+---------------+--------+-----------+
|       1 | About Music | Music is Life | Hevton | developer |
|       2 | About Life  | Life is alone | Hevton | developer |
|       3 | Math Book   | Math.PI...    | James  | teacher   |
|       4 | Novel Book  | I am handsome | Pyro   | designer  |
|       5 | About Time  | TimeTravel    | Hevton | developer |
+---------+-------------+---------------+--------+-----------+
5 rows in set (0.00 sec)

진짜 컬럼명이 바뀐 게 아니라, AS(~로써) BOOK_id 로 출력한 것입니다!

관계형 데이터베이스는 테이블 안에서 중복되는 데이터들을 새로운 테이블로 만들어, 테이블을 참조하게끔 하는 방식으로 구성하는 것을 말했는데요. 이런식으로 테이블에서 중복되는 데이터들을 묶어서 하나의 테이블로 구성하고, 나중엔 테이블 간의 중복되는 데이터들을 새로운 테이블로 따로 참조함으로써 데이터베이스의 규모가 점점 커져도 테이블간의 유지보수와 관리에 수월하게 됩니다.

profile
놀만큼 놀았다.
post-custom-banner

0개의 댓글