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)를 익힙니다.
이 강의에서 배우는 것
- 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를 관리하는 소프트웨어.
애플리케이션 → DBMS → 데이터베이스(파일/디스크)3. RDBMS vs NoSQL
RDBMS — 테이블·SQL·JOIN
[users 테이블]
id | name | email
1 | 김철수 | kim@example.com
2 | 이영희 | lee@example.com
[orders 테이블]
id | user_id | product | price
1 | 1 | 노트북 | 1500000
2 | 1 | 마우스 | 30000MySQL, PostgreSQL, SQLite, Oracle 등.
NoSQL — 문서·키값·그래프
// MongoDB 문서
{
"_id": "64abc123",
"name": "김철수",
"orders": [
{ "product": "노트북", "price": 1500000 },
{ "product": "마우스", "price": 30000 }
]
}MongoDB(문서), Redis(키-값), Neo4j(그래프) 등.
| 항목 | RDBMS | NoSQL |
|---|---|---|
| 데이터 구조 | 고정 스키마 | 유연한 스키마 |
| 관계 | JOIN | 문서 내 중첩 |
| 확장 | 수직 | 수평 |
| 트랜잭션 | 강력 | 제한적 |
| 사용 사례 | 금융, 쇼핑몰 | SNS, 실시간 앱 |
4. SQL이란
Structured Query Language — RDBMS를 조작하는 표준 언어. 거의 모든 RDBMS에서 동일하게 동작합니다.
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
파일 하나가 곧 데이터베이스. 서버 설치 불필요, 가볍고 빠름.
my-project/
├── app.js
├── database.db ← 이 파일이 전체 DB
└── package.json- 모바일 앱 로컬 DB (iOS/Android 내장)
- 브라우저 로컬 저장소
- 소규모 웹 서비스, 학습용
6. DB Browser for SQLite
GUI로 SQLite 파일을 확인하고 쿼리를 실행하는 도구.
# 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
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 NULL | NULL 금지 |
| UNIQUE | 중복 금지 |
| DEFAULT 값 | 기본값 |
3. INSERT
-- 모든 컬럼에 값
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
기본
SELECT * FROM books;
SELECT title, author, price FROM books;WHERE
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
SELECT * FROM books ORDER BY price ASC;
SELECT * FROM books ORDER BY price DESC;
SELECT * FROM books ORDER BY author ASC, price DESC;LIMIT (페이지네이션)
SELECT * FROM books LIMIT 5;
SELECT * FROM books LIMIT 5 OFFSET 5; -- 6번째부터 5개5. UPDATE
UPDATE books SET price = 32000 WHERE id = 1;
UPDATE books SET price = 32000, title = '클린 코드 2판' WHERE id = 1;WHERE 절 없이 UPDATE하면 모든 행이 수정됩니다.
6. DELETE
DELETE FROM books WHERE id = 3;
DELETE FROM books WHERE price < 10000;WHERE 절 없이 DELETE하면 모든 데이터가 삭제됩니다.
7. 실습 흐름
sqlite3 library.db
.read 예제/queries.sql
.tables
.schema books
.quitSQL 심화
여러 테이블을 연결하는 JOIN(INNER/LEFT), GROUP BY와 집계 함수, HAVING, 서브쿼리, 그리고 성능을 위한 인덱스(EXPLAIN QUERY PLAN)를 익힙니다.
1. JOIN
INNER JOIN — 매칭된 행만
SELECT users.name, orders.total_price, orders.status
FROM orders
INNER JOIN users ON orders.user_id = users.id;LEFT JOIN — 왼쪽 모든 행
-- 주문 없는 회원도 포함
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개 테이블
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
-- 카테고리별 상품 수
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은 그룹화 후 필터.
-- 주문 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. 서브쿼리
-- 평균보다 비싼 상품
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. 인덱스
책의 색인과 같음. 자주 검색하는 컬럼에 인덱스를 추가하면 성능이 향상됩니다.
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
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에 자주 사용되는 컬럼
- 단, 쓰기 성능이 약간 저하 — 모든 컬럼에 걸지 않음
댓글 0
아직 댓글이 없습니다. 첫 댓글을 남겨 주세요.
댓글은 회원만 쓸 수 있습니다.
광고·욕설·비방·개인정보·불법 내용이 담긴 댓글은 숨기거나 지웁니다. 댓글은 닉네임과 함께 공개됩니다. 개인정보처리방침