지금 해보려고 하는 것 : 이전 9/11수업에서 만들었던 테이블을 DB테이블로 만들어보기
SQL은 외우는게 아닙니다!
SQL문을 작성해보아요
1. "board" 스키마 생성
CREATE DATABASE Board;
USE Board;
2. 사용자 테이블 생성 -> 게시물 테이블을 생성하기 전에 미리 하는 이유 : 게시글 테이블에 들어갈 FK를 먼저 정해주기 위해
CREATE TABLE users(
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(30) NOT NULL,
job VARCHAR(100),
birth DATE, -> "YYYY-MM-DD"
PRIMARY KEY(id)
);
3. 사용자 데이터 삽입
INSERT INTO users(name, job, birth)
VALUES("gongu", "actor", "800123");
-> 조회 : SELECT * FROM users; (users테이블의 모든 내용을 가져와서 조회하라)
4. 게시글 테이블 생성
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)
);
근데 영상과 다르게 created_at timestamp의 NULL값이 NO가 아니라 YES로 되어있다..
-> 다음 영상에서 확인
5. 게시글 데이터 삽입
INSERT INTO posts(title, content)
VALUES("title1", "content1");
6. 게시글 테이블에 수정일자 컬럼 추가
ALTER TABLE posts -> post테이블로 현재 테이블 변경
ADD COLUMN updated_at DATETIME
DEFAULT NOW()
ON UPDATE NOW()
7. 게시글 테이블 id 2 수정
UPDATE posts
SET content = "updated!"
WHERE id = 2;
8. 게시글 테이블에 작성자 컬럼 FK 추가
1) TABLE 컬럼 추가
ALTER TABLE posts
ADD COLUMN user_id INT;
2) FK 설정
ALTER TABLE posts
ADD FOREIGN KEY(user_id)
REFERENCES users(id);
9. 조인
기준 : 게시글(분리) 테이블(posts)에다가 사용자(users)을 붙여서 보여주기
2) 특정 열만 보고 싶을 때
SELECT posts.id, title, content, created_at, updated_at, name, job, birth FROM posts LEFT
JOIN users ON posts.user_id = users.id;
cf. auto_increment_lock_mode 찾아보기
sql문 예시를 보고 싶다면 mysql reference를 보면 쉽게 볼 수 있다
위에서 넣은 제약조건
1. NOT NULL -> null들어가거나 입력하지 않으면 경고문이 뜸
2. AUTO_INCREMENT -> id를 따로 입력해주지 않아도 알아서 id가 1씩 증가하게 해줌
3. DATE -> 030424라고 입력해도 "YYYY-MM-DD" 형식으로 날짜가 들어가게 해줌
주의사항 : 100110이라고 치면 1910년이 아니라 2010년으로 자동입력 되므로 전자의 경우를 입력하고 싶다면 "YYYY-MM-DD"형태로 insert해줄 것.
5. 게시글 데이터 삽입
INSERT INTO posts(title, content)
VALUES("title1", "content1");
위에서 데이터 삽입을 할 때 created_at은 values에 값을 따로 넣지 않았는데도
created_at가 자동 생성되어 있다.
왜?
CF. UTC : 한국 시간 - 9(시간) : 국제표준시
NOT NULL
: 여러분들이 직접 NULL이라고 작성해서 넣는 것도 안 됩니다
Default
: 값이 안 들어올 때, 기본 값으로 셋팅
6. 게시글 테이블에 수정일자 컬럼 추가
ALTER TABLE posts -> post테이블로 현재 테이블 변경
ADD COLUMN updated_at DATETIME
DEFAULT NOW()
ON UPDATE NOW()
시간대에 집중하자
7. 게시글 테이블 id 2 수정
UPDATE posts
SET content = "updated!"
WHERE id = 2;
8. 게시글 테이블에 작성자 컬럼 FK 추가
ALTER TABLE posts
ADD COLUMN user_id INT;
ALTER TABLE posts
ADD FOREIGN KEY(user_id)
REFERENCES users(id);
MUL과 FK의 차이 : MUL은 MULTIPLE의 뜻으로, 여러 가지 값을 가질 수 있다는 것(중복 가능이어서 MUL이라고 표시됨)
users에서 참조할 수 없는 FK값을 posts에 user_id로 넣으려고 할 경우 참조 불가하다고 오류가 뜬다. users에서 참조 가능한 id값인 1을 posts의 user_id로 넣으면 오류가 뜨지 않는다.
RDMS의 단점이 극복되다!
select할 때에만 테이블을 붙여서 보여주면?
테이블이 나눠져서 보기 힘들었던 부분이 해결된다!
9. 조인
기준 : 게시글(분리) 테이블(posts)에다가 사용자(users)을 붙여서 보여주기
2) 특정 열만 보고 싶을 때
SELECT posts.id, title, content, created_at, updated_at, name, job, birth FROM posts LEFT
JOIN users ON posts.user_id = users.id;
posts는 여전히 바뀐건 없다.
특정 열을 빼고 보고 싶을 때 :