본문 바로가기
Backend boot camp/Session2

Relational DataBase

by orioncsy 2022. 10. 3.

SQL

개념

DB의 필요성

  • 파일에 데이터를 저장하거나 인메모리 형태로 임시 저장하는 방법의 한계를 극복
  • File I/O
    • 엑셀 시트나 CSV 같은 파일 형태
    • 데이터를 가져올 때마다 전체 파일 읽어 비효율적
    • 여러 파일을 다루거나 파일 손상된 경우 데이터 부르는 작업이 복잡
  • In-Memory
    • JavaScript에서 프로그램 실행할 때만 존재
  • 관계형 DB는 한 개의 CSV나 엑셀 시트를 테이플 형태로 저장하여 여러 데이터를 SQL을 활용해 불러올 수 있다.

SQL

  • Structured Query Language (SQL)
  • 주로 관계형 데이터 베이스에 사용하는 DB Language

Query

  • 질의라는 뜻으로 데이터를 필터링하는 작업
  • SQL을 사용할 수 있는 relation table과 달리 데이터 구조가 고정되지 않는 NoSQL 존재
  • NoSQL의 대표적인 예는 MongoDB(문서 지향 DB)

SQL Basics

  • DB 생성 및 제거
    • CREATE DATABASE 데이터베이스 이름;
    • DROP DATABASE 데이터베이스 이름;
  • DB 사용
    • USE 데이터베이스 이름;
  • TABLE 생성 및 제거
  • CREATE TABLE person { name varchar(255), id int PRIMARY KEY AUTO_INREMENT, phone } DROP TABLE person TRUNCATE TABLE person //테이블 내 모든 데이터 제거
  • TABLE 조회
    • DISCRIBE person;
    • SHOW TABLES; 모든 테이블 조회
  • TABLE column 추가 및 제거
  • ALTER TABLE 테이블_이름 ADD column_이름 타입 ALTER TABLE 테이블_이름 DROP COLUMN column_이름
  • SELECT
    • 데이터셋에 포함될 특성
    • SELECT 실행 순서
    FROM
    WHERE
    GROUP BY
    HAVING
    ORDER BY
    
  • FROM
    • 테이블 명시
    SELECT 특성1, 특성2
    FROM 테이블_이름
    
    SELECT * // 전부선택
    FROM 테이블_이름
    
  • WHERE
    • 필터 역할
    SELECT *
    FROM 테이블_이름
    WHERE 특성1<>"값"
    
    WHERE 특성1 LIKE "값%" //값이 앞에 있는 경우
    WHERE 특성1 LIKE "?값%" //두번째에 값이 있는 경우
    WHERE 특성1 LIKE "[ac]%" //첫번째에 a or c인 경우
    WHERE 특성1 LIKE "[!ac]%" //첫번째에 a, c가 아닌 경우
    WHERE 특성1 LIKE "[a-c]%" //첫번째에 a 에서 c 사이인 경우
    WHERE 특성1 IN ("값","값2") //특성1에 값이 있는 경우
    WHERE 특성1 IS NULL// 특성1이 NULL일 경우
    WHERE 특성1 IS NOT NULL //특성1이 값이 있는 경우
    WHERE 특성1 BETWEEN 2 AND 4 //특성1의 범위
    
  • ORDER BY
    • 정렬 순서
    SELECT 특성1, 특성2
    FROM 테이블_이름
    WHERE 특성1<>"값"
    ORDER BY 1 DESC //내림차순으로 특성1 기준 정렬
    //DEFUALT는 오름차순
    
  • LIMIT
    • 출력할 결과 수를 정함
    SELECT *
    FROM 테이블_이름
    WHERE 특성1<>"값"
    ORDER BY 특성1 DESC
    LIMIT 10 // 특성1 기준 가장 큰 값부터 10개 출력
    
  • DISTINCT
    • 중복 없이 값을 받을 때는 SELECT DISTINCT
    SELECT DISTINCT 특성1
    FROM 테이블_이름
    
  • INNER JOIN
    • 둘 이상의 테이블에서 서로 공통된 부분 기준 연결
    SELECT *
    FROM 테이블1
    (INNER) JOIN 테이블2 ON 테이블1.특성1 - 테이블2,특성2
    
  • OUTER JOIN
    • LEFT OUTER JOIN 왼쪽은 조건에 부합하지 않아도 모두 결합
    • RIGHT OUTER JOIN 오른쪽은 조건에 부합하지 않아도 모두 결합
    SELECT *
    FROM 테이블1
    LEFT (OUTER) JOIN 테이블2 ON 테이블1.특성1 - 테이블2,특성2
    
    SELECT *
    FROM 테이블1
    RIGHT (OUTER) JOIN 테이블2 ON 테이블1.특성1 - 테이블2,특성2
    
  • GROUP BY
  • SELECT * FROM 테이블_이름 WHERE 특성 1<>"값" ORDER BY 특성1 DESC HAVING 그룹 조건
  • INSERT INTO -VALUES, UPDATE - SET WHERE, DELETE FROM - WHERE
  • INSERT INTO 테이블_이름(column1, colunm2) VALUES (value1, value2) UPDATE 테이블_이름 SET column1 = value1 WHERE 조건 DELETE FROM 테이블_이름 WHERE 조건
  • COUNT, MIN, MAX, AVG, SUM
  • SELECT COUNT(*) FROM 테이블_이름 WHERE 특성 1 <>"값" SELECT MIN(*) SELECT MAX(*) SELECT AVG(*) SELECT SUM(*)

ACID

Transaction

  • 여러 개의 작업을 하나로 묶은 유닛
  • 성공/실패를 결과로 가진다

Atomicity(원자성)

  • 하나의 트랜잭션에 속한 작은 모두 성공하거나 모두 실패로 처리한다
  • 트랜잭션 안의 어떤 하나의 작업이 실패하면 모두 실패로 처리
  • 은행 송금에서 출금은 됐지만 입금이 안되면 실패로 처리

Consistency(일관성)

  • DB의 상태가 일관되어야 한다
  • 고객의 이름과 번호를 가지고 있는 DB 규칙이 있다면 하나라도 누락되면 규칙을 위반

Isolation(고립성)

  • 모든 트랜잭션은 독립적이어야 한다
  • 계좌를 송금할 때 서로 다른 계좌에 대한 송금은 서로 영향을 주어서는 안 된다

Durability(지속성)

  • 하나의 트랜젝션이 성공하면 로그가 남아야 한다
  • 시스템이 오류가 발생해도 기록은 영구적

SQL vs NoSQL

관계형 DB - SQL

  • 테이블 구조, 데이터 타입 정의 및 저장
  • 데이터 열에는 속성, 데이터 행은 데이터
  • SQL을 사용하여 쿼리 진행 가능
  • 스키마가 뚜렷
  • MySQL, MariaDB, Oracle, SQLite, PostgresSQL

비관계형 DB - NoSQL

  • 데이터를 읽어올 때 스키마에 따라 데이터 읽어옴
  • 몽고DB, Casndra

NoSQL

  • Key-Value : key-vale 형태로 데이터를 배열로 저장(Redis, Dynamo)
  • Document DB : 문서 형태로 데이터 저장, JSON과 유사한 방식(MongoDB)
  • Wide-Column DB : 각 열에 key-value 형태의 데이터 저장, 규모가 큰 DB에 사용(Cassandra, HBase)
  • Graph DB : 그래프와 비슷한 형식으로 데이터 간 관계 구성, 노드에 속성을 두고 데이터 저장, 관계는 edge로 표현(Neo4J, InfiniteGraph)

SQL 기반 DB VS NoSQL 기반 DB

  • Storage
    • SQL을 이용해 테이블로 저장, 지정된 schema에 따라 저장
    • NoSQL은 key-value, document, wide-column, graph 방식
  • Schema
    • SQL은 고정된 형식의 schema가 필요, 열은 속성, 행은 데이터
    • NoSQL은 동적 스키마 형태 관리, 행 추가할 때 새로운 열을 추가 가능, 개별 속성에 대해 모든 열에 대한 데이터 입력 불필요
  • Querying
    • SQL에서 DB 정보를 요청할 때 질의를 테이블 형식에 맞춰 요청
    • NoSQL에서는 데이터 그룹 자체를 조회
  • Scalability
    • SQL에서는 수직 확장(높은 메모리, CPU 사용), 하드웨어 비용 큼
    • NoSQL은 수평 확장, 클라우드 기반이나 저렴한 하드에 서버 추가 구축 가능

SQL & NoSQL 선택

  • NoSQL은 확장성, 속도에 유리, SQL에서 좋은 성능인 경우도 존재
  • SQL case
    • ACID 성질 준수
      • transaction을 처리할 때 안전성을 위한 규칙을 규정 가능, 무결성 보호
      • 전자 상거래 등 금융 서비스에 적합
    • 데이터가 구조적이고 일관되는 경우
  • NoSQL case
    • 데이터 구조가 없는 대용량 데이터를 저장하는 경우
    • 클라우드를 활용하는 경우
    • 데이터 구조가 자주 업데이트되는 경우

Schema & Query Design

관계형 데이터베이스(Relational DataBase) 용어

  • data - 각 항목에 저장되는 값
  • table, relation - 데이터가 행으로 축적되는 테이블
  • column, field - 데이터 속성
  • record, tuple - 행에 저장된 데이터
  • key - 레코드를 구분하는 값
    • primary key - 기본키는 테이블의 고유한 값으로 구분
    • foreign key - 외래 키는 다른 테이블로부터 값을 참조하는 키

관계 종류

1:1 관계

  • 하나의 레코드가 다른 테이블의 한 개와 연결되는 경우
  • 하나의 테이블에 직접 저장하면 되기 때문에 자주 사용하지 않는다

1:N 관계

  • 하나의 레코드가 다른 테이블의 여러 레코드와 연결되는 경우
  • 이런 경우에는 N 쪽에 존재하는 테이블에 값을 저장

N:N 관계

  • join table 생성
    • 1:M를 형성하는 관계를 양쪽에 두어 하나의 테이블 생성

Self referencing 관계

  • 테이블 내에서의 관계 정립

More About

DB Normalization

Data redundancy

  • 중복 데이터는 일관된 자료 처리가 어렵고 공간 낭비와 비효율성을 감소하기 위해 제거한다

Data Integrity

  • 데이터 무결성은 데이터 정확도와 일관성을 유지

Anomaly

  • update anomaly
    • 동일한 데이터를 업데이트할 때
  • insertion anomaly
    • 특정 column에 대한 값이 없는 데이터를 삽입할 때
  • delete anomaly
    • 데이터의 특정 부분을 삭제할 때 다른 데이터도 같이 삭제되는 경우

SQL 종류

  • Data Definition Language(DDL)
    • CREATE, DROP 같은 테이블 같은 오브젝트를 정의할 때 사용
  • Data Manipulation Language(DML)
    • INSERT, DELETE, UPDATE처럼 데이터 저장할 때 사용
  • Data Control Language(DCL)
    • GRANT, REVOKE 등 데이터 접근 권한에 사용
  • Data Query Language(DQL)
    • SELECT 등 스키마 내 쿼리 할 때 사용
  • Transaction Control Language(TCL)
    • COMMIT, ROLLBACK처럼 DML을 거친 데이터 수정

SQL Advanced

CASE

  • IF문처럼 사용 가능
SELECT CASE
			WHEN personId <=10 THEN 'G1'
			WHEN personId <=20 THEN 'G2'
			ELSE 'G3'
		END
	FROM person

SUBQUERY

  • 쿼리문 안에 다른 쿼리를 작성 가능
  • IN, NOT IN
  • SELECT * FROM person WHERE pid IN (SELECT pid FROM person WHERE pid <5) //NOT IN을 사용할 경우 5 이상의 pid를 가진 데이터 출력
  • EXISTS, NOT EXISTS
  • SELECT pid FROM person p WHERE EXISTS( SELECT 1 // TRUE를 의미 FROM teacher t WHERE p.pid=t.tid ) ORDER BY pid
  • FROM
  • SELECT * FROM ( SELECT pid FROM person WHERE pid>20 )

'Backend boot camp > Session2' 카테고리의 다른 글

Spring Framework Cores(DI/AOP)  (1) 2022.10.18
Spring Framework Basics  (1) 2022.10.18
REST API  (0) 2022.10.03
Network  (1) 2022.09.30
[알고리즘] 알고리즘  (0) 2022.09.25