← 홈페이지 5강 목록으로
🗄️
EPISODE 01
RDBMS vs NoSQL · SQL · SQLite · CREATE · INSERT · SELECT · UPDATE · DELETE · JOIN · GROUP BY · 서브쿼리 · 인덱스

DB 개념 · SQL 기초 · SQL 심화

JSON 파일의 한계와 데이터베이스가 필요한 이유, RDBMS와 NoSQL의 차이, SQL의 역할, 그리고 학습용으로 적합한 SQLite를 소개합니다. SQLite의 데이터 타입, CREATE TABLE로 테이블 만들기, INSERT/SELECT/UPDATE/DELETE의 기본 문법, WHERE/ORDER BY/LIMIT를 익힙니다. 여러 테이블을 연결하는 JOIN(INNER/LEFT), GROUP BY와 집계 함수, HAVING, 서브쿼리, 그리고 성능을 위한 인덱스(EXPLAIN QUERY PLAN)를 익힙니다.

DBRDBMSNoSQLSQLiteSQLCREATESELECTWHEREJOINGROUP BYINDEX
소요 시간
⏱ 30~45분 + 45~60분 + 60분
난이도
📊 중급
선수 조건
🎯 node-06
결과물
DB의 필요성과 RDBMS·NoSQL 선택 기준에 대한 이해 / 도서 관리 DB로 CRUD 쿼리 작성 / 주문-상품-유저 3테이블을 자유롭게 조인·집계

이 강의에서 배우는 것

  • 1JSON 파일 방식의 한계 5가지를 설명한다
  • 2RDBMS와 NoSQL의 차이를 비교한다
  • 3SQL의 4가지 핵심(조회/삽입/수정/삭제)을 안다
  • 4SQLite의 특징과 사용 시점을 안다
  • 5CREATE TABLE과 주요 제약조건(PK, NOT NULL, UNIQUE, DEFAULT)을 안다
  • 6INSERT의 3가지 형태를 사용한다
  • 7SELECT + WHERE + ORDER BY + LIMIT로 데이터를 조회한다
  • 8UPDATE / DELETE에서 WHERE를 빠뜨리지 않는다
  • 9INNER JOIN과 LEFT JOIN의 차이를 안다
  • 10GROUP BY + 집계 함수로 통계를 낸다
  • 11WHERE와 HAVING의 적용 시점을 구분한다
  • 12서브쿼리를 작성한다
  • 13인덱스를 만들고 EXPLAIN QUERY PLAN으로 검증한다

DB 개념

JSON 파일의 한계와 데이터베이스가 필요한 이유, RDBMS와 NoSQL의 차이, SQL의 역할, 그리고 학습용으로 적합한 SQLite를 소개합니다.

1. JSON 파일의 한계

문제설명
동시 접근 충돌두 사용자가 동시에 쓰면 데이터가 덮어씌워짐
검색 성능10만 건 중 하나를 찾으려면 전체를 읽어야 함
관계 표현유저-주문-상품 관계를 표현하기 어려움
데이터 무결성타입 검증, 중복 방지 없음
트랜잭션여러 작업을 묶어서 처리할 수 없음

2. 데이터베이스란

데이터베이스(DB): 구조화된 방식으로 데이터를 저장·관리하는 시스템. DBMS는 그 DB를 관리하는 소프트웨어.

text
애플리케이션 → DBMS → 데이터베이스(파일/디스크)

3. RDBMS vs NoSQL

RDBMS — 테이블·SQL·JOIN

text
[users 테이블]
id | name   | email
1  | 김철수 | kim@example.com
2  | 이영희 | lee@example.com

[orders 테이블]
id | user_id | product | price
1  | 1       | 노트북  | 1500000
2  | 1       | 마우스  | 30000

MySQL, PostgreSQL, SQLite, Oracle 등.

NoSQL — 문서·키값·그래프

json
// MongoDB 문서
{
  "_id": "64abc123",
  "name": "김철수",
  "orders": [
    { "product": "노트북", "price": 1500000 },
    { "product": "마우스", "price": 30000 }
  ]
}

MongoDB(문서), Redis(키-값), Neo4j(그래프) 등.

항목RDBMSNoSQL
데이터 구조고정 스키마유연한 스키마
관계JOIN문서 내 중첩
확장수직수평
트랜잭션강력제한적
사용 사례금융, 쇼핑몰SNS, 실시간 앱

4. SQL이란

Structured Query Language — RDBMS를 조작하는 표준 언어. 거의 모든 RDBMS에서 동일하게 동작합니다.

sql
SELECT name, email FROM users WHERE id = 1;
INSERT INTO users (name, email) VALUES ('김철수', 'kim@example.com');
UPDATE users SET email = 'new@example.com' WHERE id = 1;
DELETE FROM users WHERE id = 1;

5. SQLite

파일 하나가 곧 데이터베이스. 서버 설치 불필요, 가볍고 빠름.

text
my-project/
├── app.js
├── database.db   ← 이 파일이 전체 DB
└── package.json
  • 모바일 앱 로컬 DB (iOS/Android 내장)
  • 브라우저 로컬 저장소
  • 소규모 웹 서비스, 학습용

6. DB Browser for SQLite

GUI로 SQLite 파일을 확인하고 쿼리를 실행하는 도구.

bash
# macOS
brew install --cask db-browser-for-sqlite

# Ubuntu
sudo apt-get install sqlitebrowser

# Windows: https://sqlitebrowser.org/dl/

SQL 기초

SQLite의 데이터 타입, CREATE TABLE로 테이블 만들기, INSERT/SELECT/UPDATE/DELETE의 기본 문법, WHERE/ORDER BY/LIMIT를 익힙니다.

1. SQLite 데이터 타입

타입설명예시
TEXT문자열'김철수'
INTEGER정수42, -10
REAL실수3.14, 9.99
BLOB이진 데이터이미지, 파일
NULL값 없음NULL

2. CREATE TABLE

sql
CREATE TABLE books (
    id        INTEGER PRIMARY KEY AUTOINCREMENT,
    title     TEXT    NOT NULL,
    author    TEXT    NOT NULL,
    price     INTEGER DEFAULT 0,
    isbn      TEXT    UNIQUE,
    published TEXT
);
제약조건설명
PRIMARY KEY기본키 (행 고유 식별)
AUTOINCREMENT자동 1씩 증가
NOT NULLNULL 금지
UNIQUE중복 금지
DEFAULT 값기본값

3. INSERT

sql
-- 모든 컬럼에 값
INSERT INTO books VALUES (1, '클린 코드', '로버트 마틴', 30000, '978-…', '2008-08-01');

-- 컬럼 명시 (권장)
INSERT INTO books (title, author, price) VALUES ('리팩터링', '마틴 파울러', 35000);

-- 여러 행 동시
INSERT INTO books (title, author, price) VALUES
    ('자바스크립트 완벽 가이드', '데이비드 플래너건', 45000),
    ('파이썬 입문', '귀도 반 로썸', 28000);

4. SELECT

기본

sql
SELECT * FROM books;
SELECT title, author, price FROM books;

WHERE

sql
SELECT * FROM books WHERE price >= 30000;
SELECT * FROM books WHERE author = '마틴 파울러';
SELECT * FROM books WHERE price >= 20000 AND price <= 40000;
SELECT * FROM books WHERE title LIKE '%자바%';
SELECT * FROM books WHERE isbn IS NULL;

ORDER BY

sql
SELECT * FROM books ORDER BY price ASC;
SELECT * FROM books ORDER BY price DESC;
SELECT * FROM books ORDER BY author ASC, price DESC;

LIMIT (페이지네이션)

sql
SELECT * FROM books LIMIT 5;
SELECT * FROM books LIMIT 5 OFFSET 5;  -- 6번째부터 5개

5. UPDATE

sql
UPDATE books SET price = 32000 WHERE id = 1;
UPDATE books SET price = 32000, title = '클린 코드 2판' WHERE id = 1;
⚠️

WHERE 절 없이 UPDATE하면 모든 행이 수정됩니다.

6. DELETE

sql
DELETE FROM books WHERE id = 3;
DELETE FROM books WHERE price < 10000;
⚠️

WHERE 절 없이 DELETE하면 모든 데이터가 삭제됩니다.

7. 실습 흐름

bash
sqlite3 library.db
.read 예제/queries.sql
.tables
.schema books
.quit

SQL 심화

여러 테이블을 연결하는 JOIN(INNER/LEFT), GROUP BY와 집계 함수, HAVING, 서브쿼리, 그리고 성능을 위한 인덱스(EXPLAIN QUERY PLAN)를 익힙니다.

1. JOIN

INNER JOIN — 매칭된 행만

sql
SELECT users.name, orders.total_price, orders.status
FROM orders
INNER JOIN users ON orders.user_id = users.id;

LEFT JOIN — 왼쪽 모든 행

sql
-- 주문 없는 회원도 포함
SELECT users.name, orders.total_price
FROM users
LEFT JOIN orders ON users.id = orders.user_id;

SQLite는 RIGHT/FULL OUTER JOIN을 직접 지원하지 않음. LEFT 방향을 바꾸거나 UNION 사용.

3개 테이블

sql
SELECT
    u.name AS 회원명, p.name AS 상품명,
    oi.quantity AS 수량, oi.unit_price AS 단가
FROM order_items oi
INNER JOIN orders   o ON oi.order_id   = o.id
INNER JOIN users    u ON o.user_id     = u.id
INNER JOIN products p ON oi.product_id = p.id;

2. GROUP BY

sql
-- 카테고리별 상품 수
SELECT category, COUNT(*) AS 상품수
FROM products
GROUP BY category;

-- 카테고리별 평균 가격
SELECT category, AVG(price) AS 평균가격
FROM products
GROUP BY category;
함수설명
COUNT(*)행 수
COUNT(컬럼)NULL 제외 행 수
SUM(컬럼)합계
AVG(컬럼)평균
MAX/MIN최대/최소

3. HAVING

WHERE는 그룹화 전 행 필터, HAVING은 그룹화 후 필터.

sql
-- 주문 2건 이상 회원만
SELECT user_id, COUNT(*) AS 주문수
FROM orders
GROUP BY user_id
HAVING COUNT(*) >= 2;

-- 두 절 함께
SELECT category, AVG(price) AS 평균가격
FROM products
WHERE stock > 0
GROUP BY category
HAVING AVG(price) > 50000;

4. 서브쿼리

sql
-- 평균보다 비싼 상품
SELECT name, price
FROM products
WHERE price > (SELECT AVG(price) FROM products);

-- 특정 회원이 주문한 상품 이름
SELECT name FROM products WHERE id IN (
    SELECT product_id FROM order_items WHERE order_id IN (
        SELECT id FROM orders WHERE user_id = 1
    )
);

5. 인덱스

책의 색인과 같음. 자주 검색하는 컬럼에 인덱스를 추가하면 성능이 향상됩니다.

sql
CREATE INDEX idx_orders_user_id ON orders(user_id);
CREATE INDEX idx_products_category ON products(category);
CREATE INDEX idx_order_items_op ON order_items(order_id, product_id);

DROP INDEX idx_orders_user_id;

EXPLAIN QUERY PLAN

sql
EXPLAIN QUERY PLAN
SELECT * FROM orders WHERE user_id = 1;
-- SEARCH TABLE orders USING INDEX idx_orders_user_id ← 인덱스 사용
-- SCAN TABLE orders                                 ← 인덱스 없음 (느림)
  • WHERE 조건에 자주 사용되는 컬럼
  • JOIN 연결 컬럼 (외래키)
  • ORDER BY에 자주 사용되는 컬럼
  • 단, 쓰기 성능이 약간 저하 — 모든 컬럼에 걸지 않음
예제 코드 / 강의 자료

전체 강의 자료와 예제 코드는 GitHub에서 자유롭게 받아볼 수 있습니다.

GitHub에서 보기 ↗

댓글 0

아직 댓글이 없습니다. 첫 댓글을 남겨 주세요.

댓글은 회원만 쓸 수 있습니다.

광고·욕설·비방·개인정보·불법 내용이 담긴 댓글은 숨기거나 지웁니다. 댓글은 닉네임과 함께 공개됩니다. 개인정보처리방침