MySQL


🪤 DBMS (Database Management System)

  • 데이터베이스를 관리하고 운영하는 소프트웨어
  • MySQL, SQLite, ORACLE, mongoDB, redis 등이 이에 해당
  • 이를 사용하면 코드가 변경되어도 해당 데이터가 남아있게 할 수 있다.
  • SQL (Structured Query Language)

  • 구조가 있는 질문용 언어
  • SELECT, INSERT, UPDATE, DELETE 같은 구문을 통해 데이터를 다룬다.
  • 다수의 DBMS가 SQL 방식을 따른다.
  • 관계형 (SQL, RDBMS)

  • RDBMS는 테이블로 구성이 된다.
  • 테이블이 먼저 구성되고 테이블의 구조에 맞추어 데이터가 들어간다.
  • 구조화가 명확하게 되어 있어 예외가 없다.
  • 신뢰성이 매우 높다.
  • 데이터의 입, 출력 속도가 빠르다.
  • DB의 구조 변경이 매우 어렵다.
  • 굉장히 다양한 정보가 들어오는 빅데이터 등에는 사용이 어렵다.
  • 비관계형 (NoSQL, Non RDBMS)

  • SQL을 사용하지 않는 모든 DB
  • 문서형, 그래프형, 키밸류형, 와이디 컬럼형 등이 있다.
  • 특정 목적을 위해 사용하는 경우가 많다.
  • 대용량 데이터 처리에 효율적이다.
  • DB의 구조 변경이 쉽고, 확장성이 뛰어나다.
  • 복잡한 데이터 구조의 표현이 가능하다.
  • 데이터 자체가 크면 데이터를 일부 읽어서 처리해야 하므로 속도가 저하된다.
  • 🛹 SELECT

  • DB에서 데이터를 뽑아 올 때 사용하는 구문
  • 기본 문법

  • SELECT 컬럼명 FROM table
  • 필요한 값을 임의로 추가

  • SELECT 컬럼명, 원하는 데이터 FROM table
  • WHERE

  • 원하는 조건을 충족하는 Row만 가져오기
  • SELECT 컬럼명 FROM table WHERE 조건
  • ORDER BY

  • 선택한 값들을 정렬해서 가져오기
  • SELECT 컬럼 FROM table ORDER BY 정렬할 컬럼명
  • LIMIT

  • Row의 수를 지정해서 가져오기
  • SELECT 컬럼명 FROM table LIMIT 숫자;
  • AS

  • Column 명을 변경해서 가져오기
  • 원래의 table에는 영향을 미치지 않음
  • SELECT 컬럼명 AS 바꿀 컬럼명 , 컬럼명2 AS 바꿀 컬럼명2 FROM table ;
  • JOIN

  • 여러 테이블의 값을 하나로 합쳐서 가져오기
  • SELECT 컬럼명 FROM table1 JOIN table2 ON 조건;
  • 🏉 정규화

  • DB설계에 있어서 중복을 최소화하기 위해 데이터를 구조화하는 과정
  • 크고 조직화되지 않은 테이블을 작고 잘 조직된 테이블로 변경하는 것이다.
  • 정규화가 잘 되어있어야 데이터 추가 및 삭제 시에 이상 현상을 예방할 수 있다.
  • 제 1 정규형

  • 제 1 정규화가 되어 있는 데이터
  • 하나의 컬럼은 반드시 하나의 속성만을 가져야 하는 법칙
  • 제 2 정규형

  • 모든 컬럼에 대한 부분 종속이 없어야 한다.
  • 제 3 정규형

  • 이행 종속성(A = B, B = C 여서 A = C인 경우)이 없어야 한다.
  • 일반 컬럼에만 종속된 컬럼은 다른 테이블로 빼기
  • 출신대학은 강사의 출신대학이기 때문에 따로 다루어준다.
  • 외래 키 (Foreign Key)

  • 기본키(Primary Key): 각각의 Row가 고유하게 가지는 값
  • 정규화를 하게 되면 테이블은 최소한의 단위로 쪼개지게 된다.
  • 하지만 데이터를 불러 들일 때는 한꺼번에 많은 값을 가지는 테이블을 JOIN해서 가지고 와야 하는 경우가 많다.
  • 앞서 배운 JOIN을 사용하여 테이블을 합치는데 기준이 되는 값을 통해서 테이블을 합쳐준다. 이때 기준이 되는 값이 외래 키이다.
  • 🪀 DB 만들기

    DB 생성

  • CREATE SCHEMA `mydb` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
  • TABLE 생성

  • 대문자 사용
  • 단어와 단어 사이 _로 구분
  • 컬럼명을 보고 데이터를 알 수 있도록 이름 짓기
  • Primary Key 역할을 하는 단어가 최우선으로 오도록 한다.
  • Primary Key 컬럼은 뒤에 _PK를 추가
  • Foreign Key 컬럼은 뒤에 _FK를 추가
  • 제약 넣기
  • CREATE TABLE user (
    `ID_PK` INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
    `NAME` VARCHAR(100) NOT NULL,
    `EMAIL` VARCHAR(100) UNIQUE NOT NULL,
    `PASSWORD` VARCHAR(100) NOT NULL,
    `ADDRESS` VARCHAR(100) NOT NULL,
    `AGE` TINYINT UNSIGNED,
    `MEMBERSHIP` TINYINT DEFAULT 0,
    `REGISTER_TIME` DATETIME DEFAULT CURRENT_TIMESTAMP,
    `UPDATE_TIME` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    );
  • 여기서 VARCHAR 안 숫자는 영어를 기준으로 한다. 한글은 50글자까지 가능하다.
  • 영어: 2byte, 한글: 4byte이기 때문
  • DATA 삽입

    INSERT INTO user (NAME, EMAIL, PASSWORD, ADDRESS, AGE)
    VALUES ('장경은', 'j56237@naver.com', '1234', '서울 영등포구', '27');
  • 아이디는 AUTO_INREMENT 옵션에 따라 1씩 증가하면서 삽입되지만 시도했다가 실패한 경우에도 1이 올라간다.
  • DATA 수정 및 삭제

  • ID_PK가 3인 값 삭제
  • DELETE FROM user WHERE ID_PK = 3;
  • ID_PK가 1인 값의 AGE 컬럼의 값을 1 증가
  • UPDATE user SET AGE = AGE + 1 WHERE ID_PK = 1;
  • 테이블 컬럼명 변경
  • ALTER TABLE test_table CHANGE COLUMN NAME EMAIL VARCHAR(100);

    → test_table의 NAME 컬럼을 EMAIL(VARCHAR100)로 변경

  • 컬럼 추가
  • ALTER TABLE test_table ADD COLUMN ADDRESS VARCHAR(100) AFTER EMAIL;

    → ADDRESS 컬럼 추가

  • 컬럼 삭제
  • ALTER TABLE test_table DROP ADDRESS;

    → ADDRESS 컬럼 삭제