Structured Query Language
은 데이터베이스용 프로그래밍 언어로서, 주로 관계형 데이터베이스에서 사용한다.
SQL
은 데이터가 구조화된(structured) 테이블을 사용하는 데이터베이스에서 활용할 수 있다.
SQL
은 구조화된 쿼리 언어라고 말할 수 있다. 데이터베이스에 쿼리를 보내 원하는 데이터를 가져오거나 삽입할 수 있다.
예를 들어 MySQL, Oracle, SQLite, PostgreSQL 등 다양한 데이터베이스에서 SQL 구문을 사용할 수 있다.
SQL
을 사용할 수 있는 데이터베이스와 달리, 데이터의 구조가 고정되어 있지 않은 데이터베이스를 NoSQL
이라고 한다.
NoSQL
는 테이블을 사용하지 않고 데이터를 다른 형태로 저장한다.
대표적으로 MongoDB와 같은 문서 지향 데이터베이스가 있다.
데이터베이스는 크게 관계형 데이터베이스와 비관계형 데이터베이스로 구분한다.
관계형 데이터베이스는 SQL을 기반으로 하고, 비관계형 데이터베이스는 NoSQL로 데이터를 다룬다.
관계형 데이터베이스
에서는 테이블의 구조과 데이터 타입 등을 사전에 정의하고, 테이블에 정의된 내용에 알맞은 형태의 데이터만 삽입할 수 있다.
관계형 데이터베이스
는 행(row)과 열(column)로 구성된 테이블에 데이터를 저장한다.
각 컬럼은 하나의 속성에 대한 정보를 저장하고, 행에는 컬럼의 데이터 형식에 맞는 데이터가 저장된다.
관계형 데이터베이스
에서는 테이블 간의 관계를 직관적으로 파악할 수 있다.
NoSQL
은 앞에 붙은 NO에서 알 수 있듯이, 주로 데이터가 고정되어 있지 않은 데이터베이스를 가리킨다.
NoSQL
이 SQL
과 반대된다고 해서 스키마가 반드시 없는 것은 아니다.
관계형 데이터베이스에서는 데이터를 입력할 때 스키마에 맞게 입력해야 하는 반면, NoSQL
에서는 데이터를 읽어올 때 스키마에 따라 읽어온다. (schema on read)
NoSQL
기반의 비관계형 데이터베이스가 확장성이나 속도면에서 더 뛰어나다.
하지만 구조화된 SQL
기반의 관계형 데이터베이스가 더 좋은 성능을 보여주는 부분도 있다.
여러 사용 사례를 알고 적절한 데이터베이스를 선택하는 것이 중요하다.
ACID
는 Atomicity(원자성), Consistency(일관성), Isolation(격리성), Durability(지속성)을 의미한다.
데이터베이스에서 실행되는 하나의 트랜잭션(Transaction)에 의한 상태 변화를 수행하는 과정에서, 안정성을 보장하기 위해 필요한 성질이다.
SQL
을 사용하면 데이터베이스와 상호 작용하는 방식을 정확하게 규정할 수 있기 때문에 데이터베이스에서 데이터를 처리할 때 발생할 수 있는 예외적인 상황을 줄이고, 데이터베이스의 무결성을 보호할 수 있다.
전자 상거래를 비롯한 모든 금융 서비스를 위한 소프트웨어 개발에서는 반드시 데이터베이스의 ACID
성질을 준수해야 한다.
프로젝트의 규모가 많은 서버를 필요로 하지 않고 일관된 데이터를 사용하는 경우, 관계형 데이터베이스를 많이 사용한다.
대부분의 NoSQL 데이터베이스는 저장할 수 있는 데이터의 유형에 제한이 없다.
언제든지 필요에 따라 데이터의 새 유형을 추가할 수 있다.
정형화되지 않은 많은 양의 데이터가 필요한 경우라면 NoSQL
을 적용하는 것이 더 효율적이다.
NoSQL
데이터베이스의 경우 스키마를 미리 준비할 필요가 없기 때문에 빠르게 개발하는 과정에서 매우 유리하다.
데이터 구조를 자주 업데이트 해야하는 경우, 스키마를 매번 수정해야 하는 관계형 데이터베이스보다 NoSQL
기반의 비관계형 데이터베이스를 사용한는게 더 적합하다.
SQL을 사용할 때, 필요한 기본 문법이다.
많은 쿼리문은 여기에서 확인하자.
CREATE DATABASE 데이터베이스_이름;
데이터베이스를 이용해 테이블을 만들거나, 수정, 삭제 등의 작업을 하려면 먼저, 데이터베이스를 사용하겠다는 명령을 전달해야 한다.
USE 데이터베이스_이름;
CREATE TABLE table_name (
column1 datatype,
column2 datatype,
column3 datatype,
....
);
CREATE TABLE user (
id int PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255),
email VARCHAR(255),
created_at TIMESTAMP
);
DESCRIBE(DESC) 테이블_이름;
DROP TABLE 테이블_이름;
// ADD Column
ALTER TABLE table_name
ADD column_name datatype;
// DROP COLUMN
ALTER TABLE table_name
DROP COLUMN column_name;
// ALTER/MODIFY COLUMN
ALTER TABLE table_name
MODIFY COLUMN column_name datatype;