31DAYS) 데이터베이스(1) - SQL

nacSeo (낙서)·2022년 12월 1일
0

◉ 학습목표

1. SQL의 개념을 이해하고, 명령어들을 통해 활용할 수 있다.
  1. SQL 개념

⦿ 학습내용

☞ SQL

✔︎ SQL (Structured Query Language) : 구조화된 Query 언어
✔︎ 데이터베이스용 프로그래밍 언어
✔︎ 데이터베이스에 query를 보내 원하는 데이터만을 뽑아올 수 있음

☞ Query (쿼리)

✔︎ 질의문이라는 뜻으로, 저장되어 있는 정보를 필터하기 위한 질문

☞ 데이터베이스 필요성

✔︎ In-Memory : 끄면 데이터 사라짐
✔︎ File I/O : 원하는 데이터만 가져올 수 없고, 항상 모든 데이터를 가져온 뒤 서버에서 필터링 필요
✔︎ Database : 필터링 외에도 File I/O로 구현이 힘든 관리를 위한 여러 기능들을 가지고 있는 데이터에 특화된 서버

☞ 트랜잭션 (Transaction)

✔︎ 데이터베이스의 상태를 변환시키는 논리적 기능을 수행하기 위해 행해지는 하나 이상의 쿼리를 모아놓은 하나의 작업 단위

☞ ACID

✔︎ 데이터베이스 트랜잭션이 발생할 때, 안정성을 보장할 수 있는 성질
✔︎ Atomicity (원자성) : 하나의 트랜잭션 내에서는 모든 연산이 성공하거나 모두 실패해야 함
✔︎ Consistency (일관성) : 하나의 트랜잭션 전과 후에 데이터베이스의 일관된 상태가 유지되어야 함
✔︎ Isolation (격리성, 고립성) : 각각의 트랜잭션은 독립적임. 서로의 연산을 확인받거나 영향 줄 수 ❌
✔︎ Durability (내구성, 지속성) : 하나의 성공된 트랜잭션에 대한 로그가 기록되고 영구적으로 남음

☞ SQL (구조화 쿼리 언어) 🆚 NoSQL (비구조화 쿼리 언어)

✔︎ SQL (구조화 쿼리 언어)

  • 관계형 데이터베이스의 기반
  • 테이블의 구조와 데이터 타입 사전 정의, 테이블에 정의된 내용만 알맞은 형태의 데이터로 삽입 가능
  • 테이블은 행(row)과 열(colume)으로 구성
  • 열(column)에는 하나의 속성에 대한 정보 저장
  • 행(row)에는 각 열의 데이터 형식에 맞는 데이터가 저장
  • 대표적 관계형 데이터베이스 : MySQL, Oracle, PostgresSQL, MariaDB 등

✔︎ NoSQL (비구조화 쿼리 언어)

  • 비관계형 데이터베이스의 기반
  • Key-Value 타입 : Key-Value 쌍으로 데이터를 배열 형태로 저장
  • Key는 속성 이름, Value는 속성에 연결된 데이터 값
  • 문서형(Document) 데이터베이스 : 데이터를 테이블이 아닌 문서처럼 저장
  • 각각의 문서에는 하나의 속성을 가진 데이터를 가지고 있고, 컬렉션이라는 그룹으로 묶어서 관리
  • Wide-Column 데이터베이스 : 열(column)에 대한 데이터를 집중적으로 관리
  • 각 열에는 key-value형식으로 데이터 저장, 컬럼 패밀리(column family)라고 하는 열의 집합체 단위로 데이터 처리
  • 하나의 행에 많은 열을 포함할 수 있어서 유연성 ↑
  • Graph 데이터베이스 : 자료구조의 그래프와 비슷한 형식으로 데이터 간의 관계를 구성
  • 노드(nodes)에 속성별(entities)로 데이터 저장, 각 노드의 관계는 선(edge)으로 표현

✔︎ 차이점

  • 데이터 저장 (Storage)
    • SQL : 관계형 데이터베이스는 SQL 이용해서 데이터를 테이블에 저장
    • NoSQL : key-value, document, wide-column, graph 방식으로 저장
  • 스키마 (Schema)
    • SQL : 고정된 형식의 스키마 필요 → 데이터 속성별로 열에 대한 정보를 미리 저장
    • NoSQL : 동적으로 스키마 형태 관리 → 행 즉시 추가 가능, 모든 열에 대한 데이터 입력 안해도 됨
  • 쿼리 (Querying)
    • SQL : 테이블 간의 관계에 맞춰 데이터 요청
    • NoSQL : 데이터 그룹 자체를 조회
  • 확장성 (Scalability)
    • SQL : 수직적 확장 → 높은 메모리와 CPU 사용, 비용 ↑, 시간 ↑
    • NoSQL : 수평적 확장 → 값싼 서버 증설과 클라우드 서비스 사용, 비용 ↓, 편리성 ↑

✔︎ SQL 기반 관계형 데이터베이스 사용 케이스

  • 데이터베이스의 ACID 성질을 준수해야 하는 경우 (ex. 금융 서비스)
  • 소프트웨어에 사용되는 데이터가 구조적이고 일관된 경우

✔︎ NoSQL 기반 비관계형 데이터베이스 사용 케이스

  • 데이터 구조가 거의 또는 전혀 없는 대용량 데이터를 저장하는 경우
  • 클라우드 컴퓨팅 및 저장공간을 최대한 활용하는 경우
  • 빠르게 서비스를 구축하는 과정에서 데이터 구조를 자주 업데이트하는 경우
  1. SQL 명령어

⦿ 학습내용

☞ 데이터베이스 관련 명령어

✔︎ 데이터베이스 생성

CREATE DATABASE 데이터베이스_이름;

✔︎ 데이터베이스 사용

USE 데이터베이스_이름;

✔︎ 테이블 생성

CREATE TABLE 테이블_이름(
	필드
);

✔︎ 테이블 정보 확인

DESCRIBE 테이블_이름;

☞ SQL 명령어

✔︎ SELECT : 데이터셋에 포함될 특성 특정
✔︎ FROM : 테이블 관련 작업할 때 반드시 입력, 결과를 도출해낼 테이블 명시

SELECT *
FROM 테이블_이름

* (와일드카드) : 전부 선택할 때 사용

✔︎ WHERE : 필터 역할, 선택적으로 사용

// 특정 값과 동일한 데이터 찾기
SELECT 특성_1, 특성_2
FROM 테이블_이름
WHERE 특성_1 = "특정 값"

// 특정 값 제외한 데이터 찾기
SELECT 특성_1, 특성_2
FROM 테이블_이름
WHERE 특성_2 <> "특정 값"

// 특정 값과 비교
SELECT 특성_1, 특성_2
FROM 테이블_이름
WHERE 특성_1 <= "특정 값"

// 특정 문자열 포함
SELECT 특성_1, 특성_2
FROM 테이블_이름
WHERE 특성_2 LIKE "%특정 문자열%"

// 특정 값 일치
SELECT 특성_1, 특성_2
FROM 테이블_이름
WHERE 특성_2 IN ("특정값_1", "특정값_2")

// NULL
SELECT *
FROM 테이블_이름
WHERE 특성_1 IS NULL

// NOT NULL
SELECT *
FROM 테이블_이름
WHERE 특성_1 IS NOT NULL

✔︎ ORDER BY : 정렬, 선택적 사용

// 오름차순 (기본 - ASC 생략 가능)
SELECT *
FROM 테이블_이름
ORDER BY 특성_1

// 내림차순
SELECT *
FROM 테이블_이름
ORDER BY 특성_1 DESC

✔︎ LIMIT : 출력할 데이터 개수 제한, 쿼리문 가장 마지막에 사용

SELECT *
FROM 테이블_이름
LIMIT 결과_개수

✔︎ DISTINCT : 유니크한 값을 받을 때

SELECT DISTINCT 특성_1
FROM 테이블_이름

✔︎ INNER JOIN : 둘 이상의 테이블의 공통된 부분 연결

SELECT *
FROM 테이블_1
(INNER) JOIN 테이블_2 ON 테이블_1.특성_A = 테이블_2.특성_B

✔︎ OUTER JOIN : 테이블 기준 왼쪽 또는 오른쪽 조인

// LEFT JOIN
SELECT *
FROM 테이블_1
LEFT OUTER JOIN 테이블_2 ON 테이블_1.특성_A = 테이블_2.특성_B

// RIGHT JOIN
SELECT *
FROM 테이블_1
RIGHT OUTER JOIN 테이블_2 ON 테이블_1.특성_A = 테이블_2.특성_B

◉ 느낀 점

☞ 정보처리기사 자격증을 취득할 때 공부했던 것들이 떠올랐다. 그 때도 프로그래밍 언어보다 흥미를 느꼈는데, 아마 비교적 명령어들도 적고 사람이 하는 언어와 비슷해서 이해가 쉽게 가기 때문인 것 같다. 정보처리기사 때도 그랬지만, 이론적으로 공부하는 건 의미가 없다. 여러 과제들을 통해 mysql을 사용해서 자유자재로 사용해보는 경험이 중요할 것이다.

◉ 내일의 키워드

・ 데이터베이스 설계
・ 과제 - Learn SQL, Designing Schema
profile
백엔드 개발자 김창하입니다 🙇‍♂️

0개의 댓글