Node.js 교과서 - mySQL

윤재·2021년 10월 10일
0

MySQL 설치하기

데이터베이스란

  • 데이터베이스: 관련성을 가지며 중복이 없는 데이터들의 집합
  • DBMS: 데이터베이스를 관리하는 시스템
  • RDBMS: 관계형 데이터베이스를 관리하는 시스템
  • 서버의 하드디스크나 SSD등의 저장매체에 데이터를 저장
  • 서버 종료 여부와 상관없이 데이터를 계속 사용할 수 있음
  • 여러 사람이 동시에 접근할 수 있고, 권한을 따로 줄 수 있음

brew 통하여 mysql 설치
$ brew install mysql
$ brew services start mysql
$ mysql -uroot -p
비밀번호 입력하기

테이블 만들기

로우는 도큐먼트! 컬럼은 속성값!

mysql> CREATE SCHEMA `nodejs` DEFAULT CHARACTER SET utf8; // nodejs라는 db 생성
mysql> use nodejs; // nodejs db 선택

mysql> CREATE TABLE nodejs.comments ( // nodejs db의 comments 테이블
    -> id INT NOT NULL AUTO_INCREMENT, // id 컬럼 생성
    -> commenter INT NOT NULL, // commenter 컬럼 생성
    -> comment VARCHAR(100) NOT NULL, // comment 컬럼 생성
    -> created_at DATETIME NOT NULL DEFAULT now(), // created_at 컬럼 생성
    -> PRIMARY KEY(id), // 고유값을 id컬럼으로 함
    -> INDEX commenter_idx (commenter ASC), // INDEX를 걸면 검색하기 용이해짐
    -> CONSTRAINT commenter  // commenter컬럼에 제약을 둔다.  ')' 까지
    -> FOREIGN KEY (commenter) // 외래키(다른 테이블을 참조함)
    -> REFERENCES nodejs.users (id) // nodejs db의 users테이블의 id를 참조함
    -> ON DELETE CASCADE //  commenter가 삭제됐을때 댓글까지 삭제
    -> ON UPDATE CASCADE) // commenter가 수정됐을때 댓글까지 업데이트
    -> COMMENT = '댓글' // 테이블에 대한 설명
    -> DEFAULT CHARSET=utf8mb4 // utf8: 인코딩, mb4: 이모티콘까지 가능
    -> ENGINE=InnoDB; 
  • INT : 정수 타입 (INT(10) 은 10자리의 정수)
    FLOAT, DOUBLE : 실수
    TINYINT : -128~127, 여기서는 1또는 0만 저장해 boolean 값 표현
  • VARCHAR(100) : 가변길이 문자열 타입, 100글자 이하
    CHAR(100) : 고정길이 문자열 타입으로 빈칸만큼 공백으로 채워짐
    TEXT: 긴 문자열은 text로 별도저장
  • DATETIME : 날짜와 시간 타입
  • NOT NULL : 필수
    NULL : 빈 값 허용
  • AUTO_INCREMENT : 자동 증가(1, 2, 3, 4, 5 ...)
  • DEFAULT : 기본값
  • now() : 현재 시간
  • UNSIGNED : 0과 양수만 허용, TINYINT + UNSIGNED 면 0~255
  • ZEROFILL : 숫자의 자리수가 고정된 경우 빈자리에 0을 넣음
  • ASC : 오름차순으로 인덱싱

컬럼명 + 자료형 + 기타옵션으로 구성됨

관계잡을 때 꿀팁은 중복이 없어야 함 !!(데이터베이스 정규화)


CRUD

Create

  • INSERT INTO DB.테이블 (컬럼명들) VALUES (값들)
mysql> INSERT INTO nodejs.comments (commenter, comment) VALUES (1, '안녕하세요. zero의 댓글입니다.');

컬럼 중 id는 AUTO_INCREMENT로 자동생성, created_at은 default now()로 자동생성이라 없다.

commenter의 value 1은 nodejs.users의 값을 참조한다.

Read

  • SELECT 컬럼 FROM 테이블명
mysql> SELECT * FROM nodejs.users;
// users 테이블의 모든 컬럼을 가져옴.
mysql> SELECT name, married FROM nodejs.users;
// users 테이블의 name, married 컬럼을 가져옴.
  • WHERE 로 조건을 주어 선택 가능
mysql> SELECT name, age FROM nodejs.users WHERE married = 1 AND age > 30;
// name, age를 가져오는데 결혼했고 (AND) 30살이 넘은 것만 찾음

mysql> SELECT id, name FROM nodejs.users WHERE married = 0 OR age > 30;
// id, name을 가져오는데 결혼을 안했거나 (OR) 30살이 넘은 것만 찾음
  • ORDR BY로 특정 컬럼값 순서대로 정렬 가능
mysql> SELECT id, name FROM nodejs.users ORDER BY age DESC;
// id, name을 가져오는데 age순으로 내림차순 정렬
// ASC는 오름차순(적은게 앞, 위로), DESC는 내림차순 인덱싱(큰게 앞, 위로)
  • LIMIT으로 조회할 개수 제한
mysql> SELECT id, name FROM nodejs.uers ORDER BY age DESC LIMIT 1;
// id, name을 가져오는데 age순으로 내림차순 정렬, 1개만 가져옴
  • OFFSET으로 앞의 로우들 스킵 가능(OFFSET 2면 세번째부터 찾음)
mysql> SELECT id, name FROM nodejs.uers ORDER BY age DESC LIMIT 1 OFFSET 1;
// id, name을 가져오는데 age순으로 내림차순 정렬, 1개만 가져오는데 1개 띵구고 ㅋ

Update

  • UPDATE 테이블명 SET 컬럼=새값 WHERE 조건
    업데이트 시 WHERE을 빼먹으면 모든 데이터들이 바뀌니 꼭 인지할 것!!!
mysql> UPDATE nodejs.users SET comment = '바꿀 내용' WHERE id = 2;
id가 2인 로우의 comment'바꿀 내용'으로 변경

Delete

  • DELETE FROM 테이블명 WHERE 조건
mysql> DELETE FROM nodejs.users WHERE id = 2;
// id가 2인 로우를 삭제
profile
안 되면 될 때까지

0개의 댓글