opentutorials.org/course/3161/19544
14. 관계형 데이터베이스의 필요성
- 데이터가 중복되는 경우가 발생하면.. > 용량 커지면 기술적, 경제적 손해, 수정도 어려워지고 찾기도 어려워짐.
- 장) 중복되는 부분을 나눠서 따로 저장해 경제적임.
단) 직관적으로 볼 수 있는 표를 나눴기 때문에 보기 불편.
15. 테이블 분리하기
1) 전에 만든 topic 테이블 이름 바꾸기
mysql> RENAME TABLE topic TO topic_backup;
Query OK, 0 rows affected (0.03 sec)
mysql> SELECT * FROM topic_backup;
+----+------------+-------------------+---------------------+--------+---------------------------+
| id | title | description | created | author | profile |
+----+------------+-------------------+---------------------+--------+---------------------------+
| 2 | MySQL | MySQL is ... | 2021-01-19 14:11:22 | egoing | developer |
| 3 | Oracle | Oracle is ... | 2021-01-19 14:12:57 | egoing | developer |
| 4 | SQL Server | SQL Server is ... | 2021-01-19 14:14:32 | duru | data administrator |
| 5 | PostgreSQL | PostgreSQL is ... | 2021-01-19 14:15:19 | taeho | data scientist, developer |
| 6 | MongoDB | MongoDB is ... | 2021-01-19 14:15:57 | egoing | developer |
+----+------------+-------------------+---------------------+--------+---------------------------+
5 rows in set (0.00 sec)
2) author(이름), profile은 없고 author_id가 있는 topic 테이블 만들기
mysql> CREATE TABLE `topic` (
-> `id` int(11) NOT NULL AUTO_INCREMENT,
-> `title` varchar(30) NOT NULL,
-> `description` text,
-> `created` datetime NOT NULL,
-> `author_id` int(11) DEFAULT NULL,
-> PRIMARY KEY (`id`)
-> );
Query OK, 0 rows affected, 2 warnings (0.03 sec)
mysql> INSERT INTO `topic` VALUES (1,'MySQL','MySQL is...','2018-01-01 12:10:11',1);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO `topic` VALUES (2,'Oracle','Oracle is ...','2018-01-03 13:01:10',1);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO `topic` VALUES (3,'SQL Server','SQL Server is ...','2018-01-20 11:01:10',2);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO `topic` VALUES (4,'PostgreSQL','PostgreSQL is ...','2018-01-23 01:03:03',3);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO `topic` VALUES (5,'MongoDB','MongoDB is ...','2018-01-30 12:31:03',1);
Query OK, 1 row affected (0.00 sec)
mysql> DESC topic;
+-------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| title | varchar(30) | NO | | NULL | |
| description | text | YES | | NULL | |
| created | datetime | NO | | NULL | |
| author_id | int | YES | | NULL | |
+-------------+-------------+------+-----+---------+----------------+
5 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)
3) name(작가), profile을 담은 author 테이블 만들기
mysql> CREATE TABLE `author` (
-> `id` int(11) NOT NULL AUTO_INCREMENT,
-> `name` varchar(20) NOT NULL,
-> `profile` varchar(200) DEFAULT NULL,
-> PRIMARY KEY (`id`)
-> );
Query OK, 0 rows affected, 1 warning (0.03 sec)
mysql> INSERT INTO `author` VALUES (1,'egoing','developer');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO `author` VALUES (2,'duru','database administrator');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO `author` VALUES (3,'taeho','data scientist, developer');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM topic;
ERROR 1146 (42S02): Table 'first.topic' doesn't exist
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)
16. 관계형 데이터베이스의 꽃 JOIN
1) LEFT JOIN을 써서 토픽 테이블에있는 작가 아이디랑, 작가 테이블에 있는 아이디가 동일하게 엮어서 보여줘
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)
2) 1)에서 토픽 id랑 타이틀이랑 작가명만 알고싶을때 (필요한 정보만 보기)
mysql> SELECT topic.id,title,name FROM topic LEFT JOIN author ON topic.author_id=author.id;
+----+------------+--------+
| id | title | name |
+----+------------+--------+
| 1 | MySQL | egoing |
| 2 | Oracle | egoing |
| 3 | SQL Server | duru |
| 4 | PostgreSQL | taeho |
| 5 | MongoDB | egoing |
+----+------------+--------+
5 rows in set (0.00 sec)
# (AS topic_id) id값이 헷갈리니까 이름을 토픽아이디라고 붙여줘..!
mysql> SELECT topic.id AS topic_id,title,name FROM topic LEFT JOIN author ON topic.author_id=author.id;
+----------+------------+--------+
| topic_id | title | name |
+----------+------------+--------+
| 1 | MySQL | egoing |
| 2 | Oracle | egoing |
| 3 | SQL Server | duru |
| 4 | PostgreSQL | taeho |
| 5 | MongoDB | egoing |
+----------+------------+--------+
5 rows in set (0.00 sec)
17. 인터넷과 데이터베이스
- 인터넷 : 두 대의 컴퓨터가 필요함. 컴퓨터 간 사회가 만들어진 것. 한대의 컴퓨터는 다른 컴퓨터에게 정보를 요청하고 다른 컴퓨터는 정보를 줌. (요청하는 쪽과 응답하는 쪽이 나뉨.)
- 서버 컴퓨터 < - > 클라이언트 컴퓨터
* 공부의 목표는 이해하는 것이 아니라 익숙해지는 것이다.
18. MySQL 클라이언트
> 클라이언트 이름 : MySQL monitor (명령어 기반, 어디서든 실행 가능, 명령어를 모르면 실행 불가)
* 이 외 다양한 클라이언트 : codingsight.com/10-best-mysql-gui-tools/
19. MySQL Workbench
20. 수업을 마치며 : 추가로 공부할만한 Keyword
- SQL
- index
- modeling (정규화)
- backup (mysqldump, binary log ...)
- cloud (AWS RDS, Google Cloud SQL for MySQL, AZURE Database for MySQL ...)
- programming (Python mysql api, PHP mysql api, Java mysql api ...)
'코딩 어쩌구 > Data' 카테고리의 다른 글
[생활코딩] Oracle (2) (0) | 2021.01.21 |
---|---|
[생활코딩] Oracle (1) (0) | 2021.01.21 |
[생활코딩] MySQL (2) (0) | 2021.01.19 |
[생활코딩] MySQL (1) (0) | 2021.01.18 |
[시험 준비] SQLD 일정 및 내용 (0) | 2021.01.15 |