“게시글” 스키마 생성
MariaDB [(none)]> CREATE DATABASE Board;
Query OK, 1 row affected (0.003 sec)
MariaDB [(none)]> USE Board;
Database changed
사용자 테이블 생성
CREATE TABLE users
(
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR (30) NOT NULL,
job VARCHAR (100),
birth DATE,
PRIMARY KEY (id)
);
id는 숫자, 값이 없으면 안되니까 NOT NULL, 데이터 추가됨에 따라 자동으로 하나씩 오르도록 AUTO_INCREMENT
name은 글자, 값이 없으면 안되어서 NOT NULL
birth는 date 타입
PK는 id
DESC 테이블; → 테이블 속성 확인
//결과
MariaDB [Board]> DESC users;
+-------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(30) | NO | | NULL | |
| job | varchar(100) | YES | | NULL | |
| birth | date | YES | | NULL | |
+-------+--------------+------+-----+---------+----------------+
4 rows in set (0.010 sec)
사용자 데이터 삽입
//1
INSERT INTO users (name, job, birth)
VALUES ("gongu", "actor", "800123");
//2
INSERT INTO users (name, job, birth)
VALUES ("gongu", "actor", "1980-01-23");
1번처럼 삽입해도 자동으로 birth 형태를 변경해줌
MariaDB [Board]> INSERT INTO users (name, job, birth)
-> VALUES ("gongu", "actor", "800123");
Query OK, 1 row affected (0.010 sec)
MariaDB [Board]> SELECt * FROM users;
+----+-------+-------+------------+
| id | name | job | birth |
+----+-------+-------+------------+
| 1 | gongu | actor | 1980-01-23 |
+----+-------+-------+------------+
1 row in set (0.004 sec)
하지만, 1900년대인지 2000년대인지 확실하게 구분하기 위해서는(더 나아가 다른 테이블에서도 연도 확실히 해야 하니까) 2번과 같이 풀형태에 맞게 넣는게 더 좋음
게시글 테이블 생성
CREATE TABLE posts
(
id INT NOT NULL AUTO_INCREMENT,
title VARCHAR (100) NOT NULL,
content VARCHAR (2000),
created_at TIMESTAMP DEFAULT NOW(),
PRIMARY KEY (id)
);
MariaDB [Board]> DESC posts;
+------------+---------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| title | varchar(100) | NO | | NULL | |
| content | varchar(2000) | YES | | NULL | |
| created_at | timestamp | YES | | current_timestamp() | |
+------------+---------------+------+-----+---------------------+----------------+
4 rows in set (0.006 sec)
게시글 데이터 삽입
INSERT INTO posts (title, content)
VALUES ("title", "content1");
MariaDB [Board]> SELECT * FROM posts;
+----+-------+----------+---------------------+
| id | title | content | created_at |
+----+-------+----------+---------------------+
| 1 | title | content1 | 2024-05-08 19:19:18 |
+----+-------+----------+---------------------+
1 row in set (0.002 sec)
게시글 테이블에 수정일자 추가
테이블 구조(테이블, 컬럼, 제약 조건 등)을 수정하는데에는 ALTER, 테이블의 데이터를 수정하는데는 UPDATE
ALTER 이후 확인하려면 DESC
UPDATE 이후 확인하려면 SELECT
ALTER TABLE posts
ADD COLUMN updated_at DATETIME
DEFAULT NOW()
ON UPDATE NOW();
MariaDB [Board]> INSERT INTO posts (title, content)
-> VALUES ("title2", "content2");MariaDB [Board]> SELECT * FROM posts;
+----+--------+----------+---------------------+---------------------+
| id | title | content | created_at | updated_at |
+----+--------+----------+---------------------+---------------------+
| 1 | title | content1 | 2024-05-08 19:19:18 | 2024-05-08 19:24:57 |
| 2 | title2 | content2 | 2024-05-08 19:27:13 | 2024-05-08 19:27:13 |
+----+--------+----------+---------------------+---------------------+
2 rows in set (0.001 sec)게시글 테이블 id 2의 content 수정
UPDATE posts
SET content = "updated!"
WHERE id = 2;
MariaDB [Board]> SELECT * FROM posts;
+----+--------+----------+---------------------+---------------------+
| id | title | content | created_at | updated_at |
+----+--------+----------+---------------------+---------------------+
| 1 | title | content1 | 2024-05-08 19:19:18 | 2024-05-08 19:24:57 |
| 2 | title2 | updated! | 2024-05-08 19:27:13 | 2024-05-08 19:32:10 |
+----+--------+----------+---------------------+---------------------+
2 rows in set (0.001 sec)
게시글 테이블에 사용자 칼럼 FK 추가
ALTER TABLE posts
ADD COLUMN user_id INT;
ALTER TABLE posts
ADD FOREIGN KEY(user_id)
REFERENCES users(id);
MariaDB [Board]> DESC posts;
+------------+---------------+------+-----+---------------------+-------------------------------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------------------+-------------------------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| title | varchar(100) | NO | | NULL | |
| content | varchar(2000) | YES | | NULL | |
| created_at | timestamp | YES | | current_timestamp() | |
| updated_at | datetime | YES | | current_timestamp() | on update current_timestamp() |
| user_id | int(11) | YES | MUL | NULL | |
+------------+---------------+------+-----+---------------------+-------------------------------+
⭐ MUL vs FK
FK인데 여러 키 값 중복해서 사용 가능하면 MUL
MariaDB [Board]> SELECT * FROM posts;
+----+--------+----------+---------------------+---------------------+---------+
| id | title | content | created_at | updated_at | user_id |
+----+--------+----------+---------------------+---------------------+---------+
| 1 | title | content1 | 2024-05-08 19:19:18 | 2024-05-08 19:24:57 | NULL |
| 2 | title2 | updated! | 2024-05-08 19:27:13 | 2024-05-08 19:32:10 | NULL |
| 3 | title3 | content3 | 2024-05-08 19:57:56 | 2024-05-08 19:57:56 | NULL |
| 6 | title3 | content3 | 2024-05-08 20:03:50 | 2024-05-08 20:03:50 | 1 |
+----+--------+----------+---------------------+---------------------+---------+
4 rows in set (0.001 sec)
(자동 입력 기능)(이 부분이 DATETIME과의 다른 점)Default → current_timestamp(), 시스템 시간대 정보에 맞게 일시를 저장함테이블 합치는 명령어
두 테이블 조인할 때, 두 테이블에 모두 지정한 열의 데이터가 존재해야 함
SELECT <열 목록>
FROM <첫 번째 테이블>
INNER JOIN <두 번째 테이블>
ON <조인 조건>
[WHERE 검색 조건]
두 테이블 조인할 때, 1개의 테이블에만 데이터가 있어도 결과가 나옴
left outer join
right outer join
full outer join
SELECT <열 목록>
FROM <첫 번째 테이블(LEFT 테이블)>
<LEFT | RIGHT | FULL> OUTER JOIN <두 번째 테이블(RIGHT 테이블)>
ON <조인 조건>
[WHERE 검색 조건]
한쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인
SELECT *
FROM <첫 번째 테이블>
CROSS JOIN <두 번째 테이블>
자기 자신과 조인
SELECT <열 목록>
FROM <테이블> 별칭A
INNER JOIN <테이블> 별칭B
[WHERE 검색 조건]

SELECT * FROM posts LEFT
JOIN users ON posts.user_id = users.id;
MariaDB [Board]> SELECT * FROM posts LEFT
-> JOIN users ON posts.user_id = users.id;
+----+--------+----------+---------------------+---------------------+---------+------+-------+-------+------------+
| id | title | content | created_at | updated_at | user_id | id | name | job | birth |
+----+--------+----------+---------------------+---------------------+---------+------+-------+-------+------------+
| 1 | title | content1 | 2024-05-08 19:19:18 | 2024-05-08 19:24:57 | NULL | NULL | NULL | NULL | NULL |
| 2 | title2 | updated! | 2024-05-08 19:27:13 | 2024-05-08 19:32:10 | NULL | NULL | NULL | NULL | NULL |
| 3 | title3 | content3 | 2024-05-08 19:57:56 | 2024-05-08 19:57:56 | NULL | NULL | NULL | NULL | NULL |
| 6 | title3 | content3 | 2024-05-08 20:03:50 | 2024-05-08 20:03:50 | 1 | 1 | gongu | actor | 1980-01-23 |
+----+--------+----------+---------------------+---------------------+---------+------+-------+-------+------------+
데이터 삽입이 실패했어도 id가 계속 상승하는 모습을 볼 수 있음
→ AUTO_INCREMENT으로 설정한 것 때문임, 이 경우 디폴트 값을 AUTO_INCREMENT_LOCK_MODE로 하기