[DB] SQL

·2022년 10월 5일
0

데이터베이스

  • 데이터를 저장하는 방법
  1. In-Memory
    • 데이터를 임시로 저장하는 방법
    • 단점 : 프로그램이 실행될 때에만 존재하는 데이터이기 때문에 프로그램을 종료하면 데이터는 사라져 사용이 불가능함
  2. File I/O
    • 파일(엑셀시트, CSV와 같은)에 데이터를 저장하는 방법
    • 단점 : 데이터가 필요할 때마다 전체 파일을 읽어와야 하기 때문에 서버에 부하가 발생
      파일이 손상되거나 여러 개의 파일들을 동시에 다뤄야 하는 등의 복잡함, 데이터량의 증가량이 클 수록 데이터를 불러와 작업하는 일이 힘들어짐.

💡 이러한 단점들을 보완하기 위해 사용되는 것이 데이터 베이스

  • 데이터 베이스란?
    • 데이터에 특화된 서버
    • File I/O로 구현하기 힘든 관리 기능(필터링)을 가지고 있다.
    • 관계형 데이터베이스의 경우, 하나의 엑셀 시트를 하나의 테이블로 저장할 수 있어 여러 개의 테이블을 가질 수 있고 SQL을 활용해 데이터를 불러오기 수월하다.

SQL

SQL의 정의

SQL(Structured Query Language) : 구조화된 쿼리 언어

  • 관계형 데이터베이스를 다루는 프로그래밍 언어
  • SQL은 데이터베이스에 Query(쿼리)를 보내 원하는 데이터를 가져오거나 삽입할 수 있다.
  • SQL을 사용하기 위해서는 데이터의 구조가 고정되어 있어야 한다.

❓Query(쿼리) : 질의문

  • 검색을 할 때, 입력하는 검색어
  • 데이터베이스에 저장된 데이터들을 필터링 하기 위한 질의문

SQL의 기본 쿼리문

데이터베이스 관련 명령어

  • 데이터베이스 생성

    • CREATE DATABASE 데이터베이스_이름;
  • 데이터베이스 사용

    • USE 데이터베이스_이름;
  • 테이블 생성

    • CREATE TABLE user { 필드(표의 열)의 이름 필드타입 그 외의 속성 }
    • user라는 테이블을 만들어 보자
    • CREATE TABLE user {
      	필드(표의 열)의 이름 필드타입 그 외의 속성
          id int PRIMARY KEY AUTO_INCREMENT,
          name varchar(255)   // 문자열(최대 255개의 문자)
      }
  • 테이블 정보 확인

    • DESCRIBE 테이블_이름;

SQL 명령어

  • SELECT : 데이터셋에 포함될 특성을 특징한다.
    • SELECT 특성
  • FROM : 테이블과 관련한 작업을 한 경우 반드시 입력.
    • SELECT로 정의된 특성으로 결과를 도출할 데이터베이스의 테이블을 명시한다.
    • FROM 테이블_이름;
  • WHERE : 필터링 쿼리문. 선택적으로 사용한다.
    • 특정 값과 동일한 데이터 찾기
      WHERE 특성_1 = "특정 값"
    • 특정 값을 제외한 값 찾기
      WHERE 특성_1 <> "특정 값"
    • 특정 값보다 크거나 작은 데이터 필터링할 때는 < > <= >=을 사용
      WHERE 특성_1 > "특정 값" -> 특정 값보다 큰 것 찾기
  • ORDER BY : 데이터 결과를 정렬한다. (기본은 오름차순)
    • ORDER BY 특성_1 (오름차순)
    • ORDER BY 특성_1 DESC (내림차순)
  • LIMIT : 결과로 출력할 데이터의 개수를 제한. 선택적으로 사용하고 쿼리문 가장 마지막에 추가한다.
    • LIMIT 200(데이터 결과를 200개만 출력)
  • DISTINCT : 유니크한 값(유일값, 고정값)받을 때 사용
    • SELECT DISTINCT 특성_1
  • INNER JOIN : 둘 이상의 테이블을 서로 공통된 부분을 기준으로 연결한다.
    • JOIN으로도 실행할 수 있다.
    • JOIN 테이블_2 ON 테이블_1. 특성A = 테이블_2.특성B
  • OUTER JOIN : 조건에 맞지 않아도 해당하는 행을 출력하고 싶을 때 사용
    • LEFT OUTER JOIN : 왼쪽에 있는 테이블의 모든 결과를 가져와 오른쪽 테이블의 데이터를 매칭하고, 매칭되는 데이터가 없는 경우 NULL로 표시
    • RIGHT OUTER JOIN : 오른쪽에 있는 테이블의 모든 결과를 가져와 왼쪽 테이블의 데이터를 매칭하고, 매칭되는 데이터가 없는 경우 NULL로 표시

💡 데이터를 삭제하는 쿼리문들 : TRUNCATE, DELETE, DROP
TRUNCATE : 잘 사용하지 않는 쿼리문. 테이블을 초기 상태(데이터 삭제, 구조는 유지)로 돌리는 것
DELETE : 데이터를 삭제하는 쿼리문 중 유일하게 로그가 남아 삭제 후 복구가 가능
DROP : 로그가 저장되지 않고 데이터 복구가 불가능하다.

SQL 명령어(내장함수)

  • GROUP BY : 데이터를 그룹으로 묶어서 조회한다.

    • SELECT * FROM costomers;
      GROUP BY State;
    • costomers 테이블의 모든 레코드를 State라는 이름으로 그룹화
  • HAVING :GROUP BY로 조회된 결과를 필터링하는 함수

    ❓ 필터링 쿼리인 WHEREHAVING의 차이는?
    WHERE : 저장된 레코드를 필터링
    HAVING : 그룹화한 결과에 대한 필터링

  • COUNT() : 레코드의 갯수를 헤아릴 때 사용하는 함수

    • SELECT *, COUNT(*) FROM costomers;
  • SUM() : 레코드의 합을 알아낼 때 사용하는 함수

  • AVG() : 레코드의 평균값을 계산하는 함수

  • MAX(), MIN() : 레코드의 최대값과 최소값을 알아낼 때 사용하는 함수

SELECT 실행 순서
1. FROM
2. WHERE
3. GROUP BY
4. HAVING
5. SELECT
6. ORDER BY
💡그러나 작성은 SELECT를 제일 먼저 한다.

트랜젝션

트랜젝션이란, 여러 개의 작업을 하나로 묶은 실행 유닛

  • 하나의 특정 작업(트랜젝션)으로 묶여 있는 여러 작업들을 모두 완료해야 정상 종료됨
  • 하나의 트랜젝션에 작업 중에서 하나의 작업만 실패하더라도 그 트랜젝션의 작업은 실패한 것임
  • 미완료된 작업없이 모두 작업을 성공해야만 트랙젝션의 작업이 성공됐다고 할 수 있다.

💡 트랜젝션은 ACID의 특성을 가진다.

ACID

ACID는 데이터베이스 내에서 일어나는 하나의 트렌잭션의 안정성을 보장하기 위한 성질

Atomicity(원자성)

  • 하나의 트랜젝션에 속해 있는 모든 작업이 전부 성공하거나 전부 실패해서 결과를 예측할 수 있도록 한다.

Consistency(일관성)

  • 데이터베이스의 상태가 일관되어야 한다.
  • 하나의 트랜젝션이 실행되기 전과 후, 데이터베이스의 상태는 이전과 동일해야함.

Isolation(격리성, 고립성)

  • 모든 트랜젝션은 다른 트랜젝션으로부터 독립되어야 한다.
  • 서로 간섭 노노

Durability(지속성)

  • 하나의 트랜젝션이 성공적으로 수행되었다면, 해당 트랜젝션에 대한 로그가 영구적으로 존재해야 한다.
  • 이후 서버의 오류가 발생해도 이미 성공적으로 종료된 트랜젝션에 대한 기록이 남아있어야 한다.

SQL vs NoSQL

NoSQL의 정의

NoSQL(No Structured Query Language) : 비구조화 쿼리 언어

  • 비관계형 데이터베이스를 다루는 프로그래밍 언어
  • 비관계형 데이터베이스 저장타입
    • Key-Value 타입
    • 문서형(Document) 데이터베이스
    • Wide-Column 데이터베이스
    • 그래프(Graph) 데이터베이스

SQL vs NoSQL

데이터 저장

  • SQL : 미리 작성된 스키마를 기반으로 정해진 형식에 맞게 데이터를 테이블에 저장
  • NoSQL : key-value, document, wide-column, graph 등의 방식으로 데이터를 저장

스키마(Schema)

  • SQL : 고정된 형식의 스키마 필요
    • 스키마를 변경하는 것이 불가능한 것은 아니지만, 변경을 위해서는 데이터베이스 전체를 수정하거나 서버를 오프라인으로 전환해야 한다.
  • NoSQL : 관계형 데이터베이스보다 동적으로 스키마의 형태를 관리할 수 있다.
    • 행을 추가할 때 즉시 새로운 열을 추가할 수 있고, 개별 속성에 대해서 모든 열에 대한 데이터를 반드시 입력하지 않아도 된다.

쿼리(Querying)

  • SQL : 테이블의 형식과 테이블 간의 관계에 맞춰 데이터를 요청 -> 구조화된 쿼리 언어 사용
  • NoSQL : 데이터 그룹 자체를 조회한다. 구조화 되지 않은 쿼리 언어(UnQL)로 데이터 요청

확장성(Scalability)

  • SQL : 수직적으로 확장. 높은 메모리, CPU를 사용하는 확장 -> 하드웨어 성능이 좋아야 함
  • NoSQL : 수평적으로 확장. 서버 증설, 클라우드 서비스 이용 확장.

수직적 확장 vs 수평적 확장
💡 수직적 확장 : 자신의 몸집을 키우는 것 (1GB -> 2GB) 교체
💡 수평적 확장 : 병렬적으로 양을 추가하는것 (1GB + 1GB) 추가

💡 수직적 확장의 장단점
장점
1. 기존 DB의 변경없이 사용할 수 있다.
2. 초기 확장 비용이 비교적 저렴하다.
단점
1. 확장을 진행할수록 비용적 문제가 발생한다.(높은 사양의 CPU)
2. 확장에 한계가 있다.
3. 단일 환경이기 때문에 DB에 문제가 발생했을 때, 대응이 어렵다.
💡 수평적 확장의 장단점
장점
1. 고사양의 CPU등이 필요하지 않아 비교적 많은 비용이 들지 않는다.
2. 이론적으로는 무한대로 확장이 가능하다.
단점
1. 슬롯이 추가되는 형식이기 때문에 유지관리에 어려움이 있다.
2. 확장을 위한 공간, 비용 등의 제약이 발생한다.

SQL기반의 DB를 사용하는 케이스

  1. 데이터베이스의 ACID 성질을 준수해야 하는 경우
  2. 소프트웨어에 사용되는 데이터가 구조적이고 일관적인 경우

NoSQL기반의 DB를 사용하는 케이스

  1. 데이터의 구조가 거의 또는 전혀 없는 대용량의 데이터를 저장하는 경우
  2. 클라우드 컴퓨팅 및 저장공간을 최대한 활용하는 경우
  3. 빠르게 서비스를 구축하는 과정에서 데이터 구조를 자주 업데이트 하는 경우
profile
🧑‍💻백엔드 개발자, 조금씩 꾸준하게

0개의 댓글