3 minute read

SQL (Structured Query Language)

Query란?

  • 직역하면 ‘질의문’
  • 검색창에 적는 검색어 → Query의 일종
  • 저장되어 있는 정보를 필터하기 위한 질문

그럼 SQL이란?

  • 데이터베이스용 프로그래밍 언어
  • 데이터베이스에 query를 보내 원하는 데이터를 뽑아올 수 있다
  • 주로 관계형 데이터베이스에서 사용한다 (MySQL, Oracle, SQLite, PostgreSQL 등)

데이터베이스의 필요성

프로그램이 실행될 때만 존재하기 때문에 안정성이 떨어지고, 프로그램이 종료되면 데이터를 받아올 수 없고, 데이터의 수명이 프로그램의 수명에 의존하게 되는 단점을 가진 In-Memory,

엑셀 시트나 CSV같은 파일의 형태로 저장해 데이터가 필요할 때마다 전체 파일을 매번 읽어와 데이터의 크기가 커질 수록 비효율적이고, 파일이 손상되거나 여러개의 파일을 동시에 다뤄야 하는 복잡하고 변수가 발생했을 때 작업이 힘든 단점을 가진 File I/O의 방식 대신,

하나의 CSV파일이나 엑셀 시트를 한 개의 테이블로 저장할 수 있는 관계형 데이터베이스를 사용한다.

한번에 여러 개의 테이블을 가질 수 있기 때문에 SQL을 활용해 데이터르 불러오기 수월하다.

SQL 기본 문법

  • Select
  • Where
  • And, Or, Not
  • Order By
  • Insert Into
  • Null Values
  • Update
  • Delete
  • Count
  • Like
  • Wildcards
  • Aliases
  • Joins
  • Inner Join
  • Left Join
  • Right Join
  • Group By

데이터베이스 관련 명령어

데이터베이스 생성

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

데이터베이스 사용

데이터베이스를 이용해 테이블을 만들거나 수정, 삭제하는 등의 작업을 하려면

먼저 데이터베이스를 사용하겠다는 명령을 전달해야 한다.

USE 데이터베이스_이름;

테이블 생성

CREATE TABLE user; (
  id int PRIMARY KEY AUTO_INCREMENT,
  name varchar(255),
  email varchar(255)
);

테이블 정보 확인

DESCRIBE user;

/*
mysql> describe user;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int          | NO   | PRI | NULL    | auto_increment |
| name  | varchar(255) | YES  |     | NULL    |                |
| email | varchar(255) | YES  |     | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)
*/

ACID

데이터베이스 트랜젝션(여러 개의 작업을 하나로 묶은 실행 유닛)이 발생할 떄, 안정성을 보장하는 성질

  • Atomicity (원자성) → 트랜젝션은 무조건 성공하거나 무조건 실패해야 한다. (입출금을 예로, A에게 돈을 입금하면 내 계좌에서 돈이 빠져나가고, A계좌에 돈이 들어와야 하는데 내 계좌에서 돈만 빠져나가고 A계좌에 돈이 들어오지 않는 상황이 발생하면 안된다. 때문에 무조건 전부 성공, 또는 전부 실패해야 한다)

  • Consistency (일관성) → 트랜젝션 전후에 데이터베이스의 일관된 상태가 유지되어야 한다. (모든 고객은 반드시 이름을 가지고 있어야 한다’ 는 데이터베이스 제약이 있다고 가정할때, 이름이 없는 새로운 고객을 추가하는 쿼리, 기존 고객의 이름을 삭제하는 쿼리는 일관성을 위반한다)

  • Isolation (고립성) → 각각의 트랜젝션은 독립적. 서로의 연산을 확인받거나 영향을 줄 수 없다.
  • Durability (지속성) → 하나의 성공된 트랜젝션에 대한 로그가 기록되고 영구적으로 남는다.

SQL과 NoSQL

관계형 데이터베이스에서는 SQL을 기반으로 하고,

비관계형 데이터베이스에서는 NoSQL로 데이터를 다룬다.

관계형 데이터베이스는 각 열에 정보의 속성을 저장하고,

행은 각 열의 속성에 맞는 데이터가 저장된다.

이러한 형식을 지녔기 때문에 정확하게 입력했다면 데이터를 다루기 수월하다.

관계형 데이터베이스에서는 테이블간의 관계를 직관적으로 파악할 수 있다.

(스키마가 뚜렷하게 보인다)

  • 대표적인 관계형 데이터베이스 MySQL, Oracle, SQLite, PostgresSQL, MariaDB

NoSQL은 주로 데이터가 고정되지 않은 데이터베이스를 가리킨다.

관계형 데이터베이스에서는 데이터를 입력할 때 스키마에 맞게 입력해야하는 반면에

NoSQL에서는 데이터를 읽어올 때 스키마에 따라 데이터를 불러온다.

  • 대표적인 NoSQL MongoDB, Casandra

SQL 기반 데이터베이스와 NoSQL 기반 데이터베이스의 차이점

데이터 저장 (Storage)

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

스키마 (Schema)

  • SQL을 사용하려면 정해진 스키마가 필요. 처리하려는 데이터 속성별로 열(Col)에 대한 정보를 미리 정해둬야한다. 스키마는 변경할 수 있지만, 변경할 경우 DB를 전체 수정하거나, 오프라인으로 전환해야한다.
  • NoSQL은 관계형 DB보다 동적으로 스키마를 관리할 수 있다. 행을 추가할 때 새로운 열을 추가할 수 있고, 개별 속성에 대해 모든 열에 대한 데이터를 반드시 입력하지 않아도 된다.

쿼리 (Querying)

  • 관계형 데이터베이스는 테이블의 형식과 테이블간의 관계에 맞춰 Query를 요청해야한다. 때문에 SQL과 같은 구조화된 쿼리 언어를 사용한다.
  • 비관계형 데이터베이스의 쿼리는 데이터 그룹 자체를 조회하는것에 초점을 두고 있다. 때문에 구조화되지 않은 쿼리 언어로도 데이터 요청이 가능하다. UnQL (UnStructured Query Language)라고도 한다.

확장성 (Scalability)

  • 일반적으로 SQL 기반의 관계형 데이터베이스는 수직적으로 확장한다. 높은 메모리와 CPU를 사용하는 확장이기 때문에 하드웨어의 성능이 중요하고, 비용이 많이 든다.
  • NoSQL로 구성된 비관계형 데이터베이스는 수평적으로 확장한다. 수직적 확장보다 상대적으로 저렴하다.

NoSQL 기반의 비관계형 데이터베이스가 확장성, 속도면에서 SQL보다 뛰어나다.

하지만, 고차원으로 구조화된 SQL 데이터베이스가 더 좋은 성능을 보이는 서비스도 있다.

때문에, 여러 사례를 살펴보고, 현재 데이터의 사정에 따라 적절한 데이터베이스를 사용하는것이 중요하다.

SQL기반 관계형 데이터베이스를 사용하는 케이스

  • ACID 성질을 준수해야하는 경우 → 전자 상거래 등 모든 금융 서비스
  • 소프트웨어에 사용되는 데이터가 구조적이고 일관적인 경우

NoSQL기반 비관계형 데이터베이스를 사용하는 케이스

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

Updated: