First Step of Database, Tables and CRUD with MySQL

Aug 14, 2024

이 글은 MySQLNode 서버와 연결시키기 전 기본 세팅부터 Database, Table 생성, 그리고 기본적인 CRUD 동작에 대한 정리글입니다. Mac 환경을 기준으로 정리합니다.

1. Setting

1. Homebrew 설치

$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"


💡 설치 후 zsh에서 brew를 찾지 못하는 이슈 발생

$ zsh: command not found:brew

✅ 해결

mac의 [USER_ID] 명을 변경하여 해결

$ echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/<USER_ID>/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"

2. brew를 활용한 MySQL 설치

$ brew install mysql
$ brew services start mysql
$ mysql_secure_installation // 비밀번호 설정

3. MySQL 접속

$ mysql -h localhost -u root -p

4. DataBase 생성

node라는 이름의 DataBase 생성

$ CREATE DATABASE node CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

CREATE DATABASE [데이터베이스명] 뒤에 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci를 작성함으로써, 데이터 정보에 한글이모지를 사용할 수 있도록 한다.


5. Table 생성

users Table 생성

$ CREATE TABLE node.users(
    -> id INT NOT NULL AUTO_INCREMENT,
    -> name VARCHAR(20) NOT NULL,
    -> age INT UNSIGNED NOT NULL,
    -> married TINYINT NOT NULL,
    -> comment TEXT NULL,
    -> createdAt DATETIME NOT NULL DEFAULT now(),
    -> PRIMARY KEY(id),
    -> UNIQUE INDEX name_UNIQUE(name ASC)) // 내림차순은 DESC
    -> COMMENT='사용자 정보' // 테이블에 대한 보충 설명
    -> ENGINE=InnoDB; // MyISAM or InnoDB

comments Table 생성

$ CREATE TABLE node.comments(
    -> id INT NOT NULL AUTO_INCREMENT,
    -> commenter INT NOT NULL,
    -> comment VARCHAR(100) NOT NULL,
    -> createdAt DATETIME NOT NULL DEFAULT now(),
    -> PRIMARY KEY(id),
    -> INDEX commenter_idx (commenter ASC),
    -> CONSTRAINT commenter
    -> FOREIGN KEY (commenter)
    -> REFERENCES nodejs.users (id)
    -> ON DELETE CASCADE
    -> ON UPDATE CASCADE)
    -> COMMENT = '댓글'
    -> ENGINE=InnoDB;

Data Type

  • INT - 정수
  • VARCHAR(자릿수) or CHAR(자릿수)
    • CHAR - 고정 길이
      • CHAR(10) → 반드시 길이 10인 문자열
      • 주어진 길이보다 짧은 문자열을 넣는 경우, 빈 자리에 스페이스가 채워진다.
    • VARCHAR - 가변 길이
      • VARCHAR(10) → 길이가 0 ~ 10 인 문자열
  • TEXT - 긴 글
  • TINYINT - -128 부터 127까지의 정수 사용
    • 1 또는 0만 저장한다면 Boolean과 같은 역할 가능
  • DATETIME - 날짜 / 시간
  • DATE - 날짜
  • TIME - 시간

Option

  • (option) NOT NULL

  • (option) NULL

  • (option) UNSIGNED → 숫자 자료형에 적용되는 옵션

    • 기본적으로 숫자 자료형은 음수 범위를 지원한다 (-2147483648 ~ 214748364)
    • UNSIGNED가 적용되어 있다면 음수는 무시되고 0 ~ 4294967295까지 저장가능
    • 단, FLOAT, DOUBLE에는 UNSIGNED 적용 불가능
  • (option) AUTO_INCREMENT

  • (option) DEFAULT

  • (option) ZEROFILL - 숫자의 자릿 수가 고정되어 있을 때 사용할 수 있음

    • INT(4) 인 경우, 숫자 1을 넣었다면 0001 으로 바뀜

6. DataBase & Table Utils

DataBase 보여주기

$ SHOW DATABASES;

DataBase 선택

$ USE node;

DataBase 삭제

$ DROP DATABASE node;

특정 Table 구조 확인

$ DESC users;

Table 목록 확인

$ SHOW TABLES;

잘못 만든 Table 제거

$ DROP TABLE users;

DataBase 종료

$ exit
// Bye ...


$ mysql.server.stop
// Shutting down MySQL .SUCCESS!




2. CRUD

1. Create

USE node // DataBase 선택

$ INSERT INTO users (name, age, married, comment)
  -> VALUES('zero', 24, 0, '자기소개1');

$ INSERT INTO users (name, age, married, comment)
  -> VALUES('nero', 32, 1, '자기소개1');

$ INSERT INTO comments (commenter, comment)
  -> VALUES (1, '안녕하세요. zero의 댓글입니다');

→ 0 또는 1로 boolean 표시 가능


2. Read

전체 데이터 조회

$ SELECT * FROM users

$ SELECT * FROM comments

특정 Column 조회

$ SELECT name, married FROM node.users;

$ SELECT name, age FROM node.users WHERE married = 1 AND age > 30;
$ SELECT name, age FROM node.users WHERE married = 0 OR age > 30;

$ SELECT id, name FROM node.users ORDER BY age DESC; // 내림차순 조회
$ SELECT id, name FROM node.users ORDER BY age DESC LIMIT 1; // 하나만 조회

// 페이지네이션 기능 구현 시 유용
$ SELECT id, name FROM node.users ORDER BY age DESC LIMIT 1 OFFSET 1; // 건너뛸 숫자

3. Update

$ UPDATE node.users SET comment='바꿀내용' WHERE id = 2;

4. Delete

DELETE FROM node.users WHERE id = 2;