백앤드 심화 2-1 ~ 2-5(mysql 재설치, CLI로 DB 테이블 생성)

Develop Kim·2024년 9월 12일

programmers

목록 보기
14/40

1 데이터베이스의 필요성

1-6 mysql workbench 소개 및 설치

1️⃣ mariaDB 설치하기

  • Docker를 통해 mariaDB를 설치했던 이전 강의를 참고하여 다시 설치해보자
  • docker에 mysql이 실행이 안된다면, docker에 우분투 버전의 mysql을 다시 설치하자(난 비번 까먹어서 다시 삭제하고 설치함)

2️⃣ 이번엔 GUI로 설치해보자

  • 구글에 mariadb Workbench를 검색 후 설치페이지에서 다운로드를 진행한다.



2 데이터베이스 CLI

2-1 DB 테이블 생성 실습

1️⃣ 분리한 엑셀을 DB테이블로 생성해보자

2️⃣ SQL 데이터 구현 순서 정리

  1. "board" 스키마 생성

  2. 사용자 테이블 생성

  3. 게시글 테이블 생성

  4. 사용자 데이터 삽입

  5. 게시글 데이터 삽입

3️⃣ 테이블을 생성해보자

  1. "board" 스키마 생성
CREATE DATABASE Board;
USE Board;
  1. 사용자 테이블 생성
CREATE TABLE users // 객체 지향에서 테이블 네임은 복수형이 좋음
(
	id INT NOT NULL AUTO_INCREMENT, // 비어있는 값이 안되므로 NOT NULL을 붙여줌, AUTO_INCREMENT로 자동으로 증가되도록 설정
    name  VARCHAR(30) NOT NULL,
    job VARCHAR(100),
    birth DATE, // 생일이기 때문에 DATA로 설정
    PRIMARY KEY (id) // 테이블을 만들 때 사용하는 id는 프라이머리 키로 사용한다고 선언
);
SHOW TABLES;
DESC users; // 테이블을 상세 조회해보면 정상적으로 표출됨

  1. 게시글 테이블 생성
CREATE TABLE posts
(
	id INT NOT NULL AUTO_INCREMENT,
    title VARCHAR (30) NOT NULL,
    content VARCHAR(2000),
    created_at TIMESTAMP DEFAULT NOW(), // 생성 날자 자동기록 되도록 TIMESTAMP를 지금 사용으로 설정
    PRIMARY KEY (id) // 테이블을 만들 때 사용하는 id는 프라이머리 키로 사용한다고 선언

);




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

1️⃣ users 테이블에 데이터를 삽입(insert)

  1. 사용자 데이터 삽입
INSERT INTO users(name, job, birth) // id는 넣지 않아도 자동으로 들어가게 됨
VALUES("gongu", "actor", "800123") // 생년월일은 자동으로 그럴듯하게 맞춰짐, 그래도 2002-01-01로 정확하게 넣어주는 것이 좋음
SELECT * FROM users; 로 테이블의 전체 값을 조회하니 잘 출력됨

  • NOT NULL로 설정한 데이터는 값을 넣지 않은 경우 에러가 발생함

2️⃣ NOT NULL 잘 작동함

  • NOT NULL로 설정한 데이터는 값을 넣지 않은 경우 에러가 발생함



2-3 timestamp, 날짜-시간 타입, default

1️⃣ posts 테이블에 데이터를 삽입(insert)

  1. 게시글 데이터 삽입
INSERT INTO posts(title, content) // created_at은 자동으로 삽입되므로 안 써도 됨
VALUES("title1", "content1");

2️⃣ MySQL(mariadb) 날짜 / 시간 타입의 종류

  1. DATE
    날짜만 포함하는 경우에 사용 / YYYY-MM-DD

  2. DATETIME
    날짜와 시간을 포함 / YYYY-MM-DD HH:MM:SS(24시간제)

  3. TIME
    시간만 포함 / HH:MM:SS

  4. TIMESTAMP 👉 자동입력(current_timestamp)
    날짜와 시간을 포함 / YYYY-MM-DD HH:MM:SS(24시간제) /
    시스템 시간대 정보(UTC)에 맞게 일시를 저장함

  • DATETIME과 TIMESTAMP의 차이는 자동입력을 도와준다는 것

3️⃣ Not NULL 과 Default의 차이

  • NOT NULL
    • 우리가 직접 null이라고 작성해서 넣는 것도 안됨
  • Default
    • 공란으로 insert => Default 설정해둔 기본 값이 insert
    • 우리가 직접 null이라고 작성해서 넣으면 null setting이 됨




2-4 alter updated_at, user_id, FK 실습

1️⃣ 게시글 테이블에 수정일자를 넣어보자

  1. 게시글 테이블에 수정일자 추가
ALTER TABLE posts
ADD COLUMN updated_at DATETIME
DEFAULT NOW()
ON UPDATE NOW(); // 업데이트 될 때 시간이 찍혀야 하므로 이렇게 작어줌
  • 테이블에 수정일자가 추가된 걸 확인할 수 있음

2️⃣ 수정일자(업데이트)가 잘 작동하는지 확인

  1. 게시글 테이블 id 2 수정
UPDATE posts
SET content = "updated" // 글 본문 내용을 수정해줌
WHERE id 2;
  • 잘 작동한다!

3️⃣ 게시글에 user_id를 추가하자

  1. 게시글 테이블에 작성자 칼럼 FK 추가
ALTER TABLE posts
ADD COLUMN user_id INT;

  • FK 가져오기
ALTER TABLE posts
ADD FOREIGN KEY(user_id) // FK 추가
REFERENCES users(id); // 참조해서 가져오는 곳

  • 엥 NULL로 뜨네? 테이블 속성을 확인해보니 키 값이 들어갔고 MUL(멀티플)이라고 뜬다

  • 잘 작동하는지 확인해보기 위해 유저5를 집어넣으니 참조할 것이 없다고 뜬다

INSERT INTO posts(title, content, user_id)
VALUES("title3", "content3", 5);

  • 유저1로 넣으니 유저 테이블에서 1을 제대로 가져온다!
INSERT INTO posts(title, content, user_id)
VALUES("title3", "content3", 1);




2-5 JOIN

1️⃣ JOIN이란?

  • SELECT 할 때만 게시글과 유저를 합쳐서 보여줄 수 있는 방법이 있음, JOIN은 가상의 테이블을 만들어서 보여줌
  • 즉, 데이터 테이블을 중복적으로 만들지 않고 볼 때만 임시로 붙여줌
SELECT*FROM posts
LEFT JOIN users ON posts.user_id = users.id; // posts 왼쪽에 붙여줌, 게시글 테이블의 유저id와 유저 테이블의 유저id가 같다면 이라는 조건을 달자

  • 내가 원하는 컬럼만 볼 수도 있음
SELECT posts.id, title, content, created_at, updated_at, name, job, birth FROM posts
LEFT JOIN users ON posts.user_id = users.id; 

👉 INSERT 실패 했었던 id 3이 있었는데 3을 생략하고 increment 값이 올라감
이것은 auto_increment_lock_mode 설정이 되어 있기 때문임, 실패해도 올라가게 설정이 되어있는 것




profile
김개발의 개발여정

0개의 댓글