9/12_21일차

자햐·2024년 9월 12일
0

교육

목록 보기
20/51

지금 해보려고 하는 것 : 이전 9/11수업에서 만들었던 테이블을 DB테이블로 만들어보기

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)을 붙여서 보여주기

  • select할 테이블을, 왼쪽에다가 붙이고 join한다.
    1) 모든 열을 보고 싶을 때
    SELECT * FROM posts LEFT
    JOIN users ON posts.user_id = users.id;

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 찾아보기

사용자 테이블 insert하면서 제약조건 알아보기

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해줄 것.

timestamp, 날짜-시간 타입, default

5. 게시글 데이터 삽입
INSERT INTO posts(title, content)
VALUES("title1", "content1");

위에서 데이터 삽입을 할 때 created_at은 values에 값을 따로 넣지 않았는데도


created_at가 자동 생성되어 있다.
왜?

MySQL (mariadb) 날짜/시간 타입

  1. DATE
  • 날짜만
  • YYYY-MM-DD 형태
  1. DATETIME : 자동입력X
  • 날짜 + 시간
  • YYYY-MM-DD HH:MM:SS (24시간제)
  1. TIME
  • 시간
  • HH:MM:SS
  1. TIMESTAMP : 저장하는 것을 넘어서 자동 입력을 도와줌(UTC도 저장해줌)
  • 날짜 + 시간
  • YYYY-MM-DD HH:MM:SS (24시간제)
  • 시스템 시간대 정보에 맞게 일시를 저장한다.

CF. UTC : 한국 시간 - 9(시간) : 국제표준시

NOT NULL VS Default

NOT NULL
: 여러분들이 직접 NULL이라고 작성해서 넣는 것도 안 됩니다

Default
: 값이 안 들어올 때, 기본 값으로 셋팅

  • 공란으로 insert => Default 설정 해둔 기본 값이 insert
  • 여러분들이 직접 null이라고 작성해서 넣으면, null setting 됨

alter updated_at, user_id, FK 실습

  • 남은 작업 : 수정일자 넣어주고 FK 설정해주기

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로 넣으면 오류가 뜨지 않는다.

JOIN

RDMS의 단점이 극복되다!

select할 때에만 테이블을 붙여서 보여주면?
테이블이 나눠져서 보기 힘들었던 부분이 해결된다!

9. 조인
기준 : 게시글(분리) 테이블(posts)에다가 사용자(users)을 붙여서 보여주기

  • select할 테이블을, 왼쪽에다가 붙이고 join한다.
    1) 모든 열을 보고 싶을 때
    SELECT * FROM posts LEFT
    JOIN users ON posts.user_id = users.id;

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는 여전히 바뀐건 없다.

특정 열을 빼고 보고 싶을 때 :

profile
산업과 예술의 만남에 있는 예비 개발자..

0개의 댓글