SQL문법, 스키마 디자인 (Schema design), Node.js에서 데이터베이스를 사용하는 방법
Learn SQL, Designing Schema
SQL(Structured Query Language)을 학습하면, 관계형 데이터베이스를 자유자재로 다룰 수 있습니다. 대표적인 관계형 데이터베이스(RDBMS)인 MySQL로 Schema를 설계하고, SQL을 사용하여 데이터를 영속성있게(persistently) 저장하는 방법을 학습합니다.
1. In-Memory: 데이터의 수명이 프로그램의 수명에 의존하게 된다. 변수 등에 저장한 데이터가 프로그램의 실행에 의존한다. 예기치 못한 상황으로부터 데이터를 보호할 수 없고, 프로그램이 종료된 상태라면 데이터를 원하는 시간에 받아올 수 없다.
2. File I/O: 데이터가 필요할 때마다 전체 파일을 매번 읽어야 합니다. 파일이 손상되거나 여러 개의 파일을 동시에 다뤄야 하는 등 복잡하고 데이터량이 많아질수록 데이터를 불러들이는 작업이 점점 힘들어집니다.
관계형 데이터베이스에서는 하나의 CSV 파일이나 엑셀 시트를 한 개의 테이블로 저장할 수 있습니다. 한 번에 여러 개의 테이블을 가질 수 있기 때문에 SQL을 활용해 데이터를 불러오기 수월합니다. 또한 엑셀 시트와 CSV 파일 등처럼 특정 형태의 파일은 대용량의 데이터를 저장하기 위한 목적이 아닙니다.
SQL 소개
하나의 언어인 Structured Query Language (SQL)은 데이터베이스 언어로, 주로 관계형 데이터베이스에서 사용합니다. 예를 들어 MySQL, Oracle, SQLite, PostgreSQL 등 다양한 데이터베이스에서 SQL 구문을 사용할 수 있습니다.
SQL이란 데이터베이스 용 프로그래밍 언어입니다. 데이터베이스에 쿼리를 보내 원하는 데이터를 가져오거나 삽입할 수 있습니다. SQL은 (relation이라고도 불리는) 데이터가 구조화된(structured) 테이블을 사용하는 데이터베이스에서 활용할 수 있습니다.
SQL을 사용할 수 있는 데이터베이스와는 달리, 데이터의 구조가 고정되어 있지 않은 데이터베이스 NoSQL이라고 합니다. 관계형 데이터베이스와는 달리, 테이블을 사용하지 않고 데이터를 다른 형태로 저장합니다. NoSQL의 대표적인 예시는 MongoDB와 같은 문서 지향 데이터베이스입니다.
이처럼 데이터베이스 세계에서 SQL은 데이터베이스 종류를 SQL이라는 언어 단위로 분류할 정도로 중요한 자리를 차지하고 있습니다. 그리고 SQL을 사용하기 위해서는 데이터의 구조가 고정되어 있어야 합니다.
SQL은 구조화된 쿼리 언어입니다.
쿼리란 저장되어 있는 데이터를 필터하기 위한 질의문이다.
데이터베이스 관련 명령어
1. 데이터베이스 생성
CREATE DATABASE 데이터베이스이름; // 데이터베이스를 생성합니다.
2. 데이터베이스 사용
USE 데이터베이스이름; // 데이터베이스를 사용합니다.
3. 테이블 생성
CREATE TABLE user (
id int PRIMARY KEY AUTO_INCREMENT,
name varchar(255),
email varchar(255)
); // id, name, email은 필드(표의 열)
4. 테이블 정보 확인
DESCRIBE user;
SQL 명령어들
SELECT: 데이터셋에 포함될 특성을 특정합니다.
SELECT 'hello world' // 일반 문자열
SELECT 2 // 숫자
SELECT 15 + 3 // 간단한 연산
FROM: 테이블과 관련된 작업을 할 경우 반드시 입력해야 합니다. FROM 뒤에는 결과를 도출해 낼 데이터베이스 테이블을 명시합니다.
SELECT 특성1
FROM 테이블이름 // 특정 특성을 테이블에서 사용
SELECT 특성1, 특성_2
FROM 테이블이름 // 몇 가지 특성을 테이블에서 사용
SELECT
FROM 테이블_이름 // 테이블의 모든 특성을 선택
는 와일드 카드(wildcard)로 전부 선택할 때에 사용됩니다.
WHERE: 필터역할을 하는 쿼리문입니다. WHERE은 선택적으로 사용할 수 있습니다.
SELECT 특성1, 특성_2
FROM 테이블이름
WHERE 특성_1 = "특정 값" // 특정 값과 동일한 데이터 찾기
SELECT 특성1, 특성_2
FROM 테이블이름
WHERE 특성_2 <> "특정 값" // 특정 값을 제외한 값을 찾기
SELECT 특성1, 특성_2
FROM 테이블이름
WHERE 특성_2 LIKE "%특정 문자열%" // 문자열에서 특정 값과 비슷한 값들을 필터할 때에는 'LIKE'와 '\%' 혹은 '*'를 사용합니다.
SELECT 특성1, 특성_2
FROM 테이블이름
WHERE 특성_2 IN ("특정값_1", "특정값_2") // 리스트의 값들과 일치하는 데이터를 필터할 때에는 'IN'을 사용합니다.
SELECT *
FROM 테이블_이름
WHERE 특성_1 IS NULL // 값이 없는 경우 'NULL'을 찾을 때에는 'IS'와 같이 사용합니다.
SELECT *
FROM 테이블_이름
WHERE 특성_1 IS NOT NULL // 값이 없는 경우를 제외할 때에는 'NOT'을 추가해 이용합니다.
ORDER BY: 돌려받는 데이터 결과를 어떤 기준으로 정렬하여 출력할지 결정합니다. ORDER BY는 선택적으로 사용할 수 있습니다.
SELECT *
FROM 테이블_이름
ORDER BY 특성_1 // 기본정렬은 오름차순입니다.
SELECT *
FROM 테이블_이름
ORDER BY 특성_1 DESC // 내림차순으로 정렬합니다.
LIMIT: 결과로 출력할 데이터의 개수를 정할 수 있습니다. LIMIT은 선택적으로 사용할 수 있습니다. 그리고 쿼리문에서 사용할 때에는 가장 마지막에 추가합니다.
SELECT *
FROM 테이블_이름
LIMIT 200 // 데이터 결과를 200개만 출력합니다.
DISTINCT: 유니크한 값을 받고 싶을 때에는 SELECT DISTINCT를 사용할 수 있습니다.
SELECT DISTINCT 특성_1
FROM 테이블 이름 // 특성_1을 기준으로 유니크한 값들만 선택합니다.
SELECT
DISTINCT
특성1
,특성_2
,특성_3
FROM 테이블이름 // 특성_1, 특성_2, 특성_3의 유니크한 '조합'값들을 선택합니다.
INNER JOIN
INNER JOIN이나 JOIN으로 실행할 수 있습니다.
SELECT *
FROM 테이블_1
JOIN 테이블_2 ON 테이블_1.특성_A = 테이블_2.특성_B // 둘 이상의 테이블을 서로 공통된 부분을 기준으로 연결합니다.
OUTER JOIN: 다양한 선택지가 있습니다.
SELECT *
FROM 테이블_1
LEFT OUTER JOIN 테이블_2 ON 테이블_1.특성_A = 테이블_2.특성_B // 'LEFT OUTER JOIN'으로 LEFT INCLUSIVE을 실행합니다.
SELECT *
FROM 테이블_1
RIGHT OUTER JOIN 테이블_2 ON 테이블_1.특성_A = 테이블_2.특성_B // 'RIGHT OUTER JOIN'으로 RIGHT INCLUSIVE을 실행합니다.
여러 쿼리문을 한 번에 써보기
Brazil에서 온 고객을 도시별로 묶은 뒤에, 각 도시 수에 따라 내림차순으로 정렬합니다. 그리고 CustomerId에 따라 오름차순으로 정렬한 3개의 결과만 요청하는 예시입니다.
같은 결과를 출력하는 서로 다른 쿼리문이 있을 수 있습니다.
그러므로, 같은 결과를 다른 방법으로 표현할 수 있습니다.
SELECT c.CustomerId, c.FirstName, count(c.City) as 'City Count'
FROM customers AS c
JOIN employees AS e ON c.SupportRepId = e.EmployeeId
WHERE c.Country = 'Brazil'
GROUP BY c.City
ORDER BY 3 DESC, c.CustomerId ASC
LIMIT 3