표(table)는 데이터베이스를 구성하는 가장 작은 요소 입니다. 표에는 우리가 담고 싶은 각각의 데이터가 들어있죠. 그리고 이러한 표들을 연관된 표들끼리 그룹핑해서 연관되지 않은 표들과 분리해서 만든게 데이터베이스 입니다. 흔히 우리가 데이터베이스를 말할 때 단순 표들의 묶음만을 의미하는게 아니라 데이터베이스 전체를 의미해, 용어 간 혼동이 있을 수 있어 스키마(Schema)라는 용어로 바꿔말하곤 합니다.
그리고 이러한 데이터베이스(스키마)들이 모여 데이터베이스 서버가 이루어집니다. 이번에 다루고자 하는 MySQL
도 데이터베이스 서버를 설치한 것 입니다.
<생활코딩 캡쳐>
기존의 운영체제에도 데이터베이스들을 둘 수 있지만, 서버를 사용하는 이유는 여러가지가 있는데요. 데이터베이스에는 자체적인 보안 체계가 있어서 그냥 운영 체제에 두는 것 보다 보안에 좀 더 이점이 있고, 또 사용자 당 권한을 따로 부여할 수 있어서 운영을 더 용이하게 해줍니다.
전 brew
를 통해 MySQL
을 설치하여서 아래와 같은 명령어로 서버를 조작합니다. 그리고 .bash_profile
에 아래 문구를 추가해 더 간편하게 조작할 수 있도록 했습니다.
alias mysql-start='brew services start mysql'
alias mysql-stop='brew services stop mysql'
alias mysql-restart='brew services restart mysql'
$ brew services start mysql
or
$ mysql-start
$ brew services stop mysql
or
$ mysql-stop
$ brew services restart mysql
or
$ mysql-restart
서버를 킨 후에 계정 로그인을 해야 MySQL
을 조작할 수 있습니다.
$ mysql -uroot -p
-> -uroot : 유저 아이디가 `root`이고, -p : 패스워드를 입력하겠다라는 의미
이제 데이터베이스를 만들어보겠습니다. 위에서 말했듯이 데이터베이스는 연관된 표들의 모음이라고 할 수 있는데요, 일단 그 모음의 틀인 데이터베이스를 만들고 난 다음, 그 안에 실제로 데이터가 담겨있는 표를 작성하게 됩니다.
아래와 같이 명령어를 작성하면, 전체 데이터베스에 새로 만든 데이터베이스가 추가됩니다. 명령어는 대문자가 아닌 소문자로 써도 작동합니다.
# DB 만들기
mysql> CREATE DATABASE <DB 이름>; # 명령어 구성
mysql> CREATE DATABASE tutorials; # 실제 명령어 작성
Query OK, 1 row affected (0.03 sec)
mysql> SHOW DATABASES; # 현재 존재하는 DATABASES들을 보여주는 명령어
+-------------------------+
| Database |
+-------------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| tutorials | # 지금 만든 DATABASE가 반환됨
+-------------------------+
7 rows in set (0.01 sec)
# DB 삭제하기
mysql> DROP DATABASE <지우고 싶은 데이터베이스 명>;
mysql> DROP DATABASE tutorials;
Query OK, 0 rows affected (0.04 sec)
mysql> SHOW DATABASES;
+-------------------------+
| Database |
+-------------------------+
| information_schema |
| mysql |
| performance_schema | # 위에 존재했던 tutorials 데이터 베이스가 삭제됨
| sys |
+-------------------------+
6 rows in set (0.00 sec)
테이블은 엑셀에서 보던 표와 마찬가지로 row(행)과 column(열)로 이루어져있습니다. column 은 데이터의 구조를 나타내고, row는 데이터 그 자체를 내포하고 있습니다.
<생활코딩 캡쳐>
이제 각각의 테이블을 만들어보겠습니다. 테이블 명을 정하고, 테이블에 들어갈 각 필드를 정의하면 되는데요. 필드 타입이 여러개 있어서 각 필드에 대한 설명이 있는 링크를 아래 첨부 했습니다.
SQL Data Types for MySQL, SQL Server, and MS Access
아래 코드에 들어간 필드 하나를 설명해보자면, 첫 번째 필드인 id는 INT타입을 사용하며, 11글자로 제한되고, NULL이 허용되지 않으며(NOT NULL), 해당 값이 자동으로 증가(AUTO_INCREMENT)하도록 설정됩니다. id의 경우 고유값이 들어가야되므로, 1,2,3... 처럼 자동으로 수가 증가하는 옵션이 추가되었습니다. 그리고 마지막 줄에 해당 데이터를 대표하는 KEY로써 id를 두겠다는 PRIMARY KEY(id)를 작성합니다. id가 아닌 다른 값으로도 PRIMARY KEY를 대체할 수 있습니다.
mysql> CREATE TABLE <table 이름>(field1, field2); # 명령어 구성
mysql> CREATE TABLE book(id INT(11) NOT NULL AUTO_INCREMENT ( 여기에 PRIMARY KEY 넣어도 됨),
title VARCHAR(100) NOT NULL,
description TEXT NULL,
created DATETIME NOT NULL,
author VARCHAR(30) NULL,
profile VARCHAR(100) NULL,
PRIMARY KEY(id)
);
Query OK, 0 rows affected, 1 warning (0.02 sec) # 테이블이 생성됨
mysql> desc book; # 테이블의 구조를 보여줌
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| title | varchar(100) | NO | | NULL | |
| description | text | YES | | NULL | |
| created | datetime | NO | | NULL | |
| author | varchar(30) | YES | | NULL | |
| profile | varchar(100) | YES | | NULL | |
+-------------+--------------+------+-----+---------+----------------+
6 rows in set (0.01 sec)
mysql> select * from book; # 테이블을 보여줌
Empty set (0.00 sec) # 현재 작성된 데이터는 없음
이제 본격적으로 데이터의 CRUD에 대해 알아보겠습니다.
데이터 삽입은 열별로 하게되며, 아래 명령어로 진행합니다. id
의 경우 자동으로 1씩 추가되기 때문에 넣지 않아도 되나, 넣어도 상관은 없습니다. created
의 경우 직접 시간을 넣어도 되지만, NOW()를 쓰면 생성된 시점이 자동으로 입력됩니다.
INSERT INTO <테이블명>(row 이름,이름,이름) VALUES(‘값’,’값’,값)
mysql> INSERT INTO book(title, description, created, author, profile) VALUES('javascript','js is...', NOW(), 'jm','developer');
Query OK, 1 row affected (0.01 sec)
mysql> select * from book; # book 테이블에 있는 전체 열 가져오기
+----+------------+-------------+---------------------+--------+-----------+
| id | title | description | created | author | profile |
+----+------------+-------------+---------------------+--------+-----------+
| 1 | javascript | js is... | 2020-02-10 15:42:55 | jm | developer |
+----+------------+-------------+---------------------+--------+-----------+
1 row in set (0.00 sec)
mysql> INSERT INTO book(title, description, created, author, profile) VALUES('ruby','ruby is...', NOW(), 'jm','developer');
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO book(title, description, created, author, profile) VALUES('C','C is...', NOW(), 'ap','developer');
Query OK, 1 row affected (0.01 sec)
mysql> select * from book;
+----+------------+-------------+---------------------+--------+-----------+
| id | title | description | created | author | profile |
+----+------------+-------------+---------------------+--------+-----------+
| 1 | javascript | js is... | 2020-02-10 15:42:55 | jm | developer |
| 2 | ruby | ruby is... | 2020-02-10 15:54:42 | jm | developer |
| 3 | C | C is... | 2020-02-10 15:55:19 | ap | developer |
+----+------------+-------------+---------------------+--------+-----------+
3 rows in set (0.00 sec)
MySQL
의 데이터 출력은 SELECT
문으로 합니다. 아래와 같은 조건을 일반적으로 사용하며, 전체 syntax는 아래 링크에서 확인해보시면 됩니다.
아래는 테이블에서 id, author 필드를 출력할거고, author가 jm이면서 id가 내림차순으로 출력하는 방법입니다.
mysql> SELECT (원하는 필드명) FROM <테이블명> WHERE <조건> ORDER BY <정렬조건> LIMIT <제한할 출력 숫자>
mysql> select id, author from book where author='jm' order by id DESC;
+----+--------+
| id | author |
+----+--------+
| 2 | jm |
| 1 | jm |
+----+--------+
2 rows in set (0.00 sec)
book
테이블에서 id
가 3 인 데이터의 profile
을 "doctor"로 수정하라는 명령어
UPDATE <테이블명> SET <col_name=value> WHERE <적용할 row 지정>
mysql> UPDATE book SET profile="doctor" WHERE id=3;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from book;
+----+------------+-------------+---------------------+--------+-----------+
| id | title | description | created | author | profile |
+----+------------+-------------+---------------------+--------+-----------+
| 1 | javascript | js is... | 2020-02-10 15:42:55 | jm | developer |
| 2 | ruby | ruby is... | 2020-02-10 15:54:42 | jm | developer |
| 3 | C | C is... | 2020-02-10 15:55:19 | ap | doctor |
+----+------------+-------------+---------------------+--------+-----------+
3 rows in set (0.00 sec)
book
테이블에서 id
가 3 인 데이터를 삭제하라는 명령어
mysql> DELETE FROM <테이블명> WHERE <삭제할 row 지정>;
mysql> DELETE FROM book WHERE id=3;
Query OK, 1 row affected (0.01 sec)
mysql> select * from book;
+----+------------+-------------+---------------------+--------+-----------+
| id | title | description | created | author | profile |
+----+------------+-------------+---------------------+--------+-----------+
| 1 | javascript | js is... | 2020-02-10 15:42:55 | jm | developer |
| 2 | ruby | ruby is... | 2020-02-10 15:54:42 | jm | developer |
+----+------------+-------------+---------------------+--------+-----------+
2 rows in set (0.00 sec)