“게시글” 스키마 생성
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로 하기