SQL(Structured Query Language)은 데이터베이스에서 데이터를 조회하고 관리하는 언어입니다. 개발자뿐 아니라 마케터, 기획자, 데이터 분석가도 SQL을 알면 직접 데이터를 뽑아볼 수 있어 업무 효율이 크게 올라갑니다. SQL은 프로그래밍 언어 중 가장 배우기 쉬운 편에 속합니다.
SQL이 필요한 이유
- 개발자: 웹/앱에서 데이터 저장/조회 (필수)
- 마케터: 고객 데이터 직접 분석, “이번 달 신규 가입자 중 구매한 비율은?”
- 기획자: 사용자 행동 데이터 조회, 의사결정에 활용
- 데이터 분석가: 모든 분석의 기본 도구
- 채용 시장: 비개발 직군에서도 “SQL 가능” 우대 증가 추세
기본 개념
데이터베이스는 엑셀과 비슷합니다:
| 엑셀 | 데이터베이스 |
|---|---|
| 파일 (.xlsx) | 데이터베이스 (Database) |
| 시트 (Sheet) | 테이블 (Table) |
| 열 (Column) | 컬럼/필드 (Column) |
| 행 (Row) | 레코드/로우 (Row) |
예시 테이블 users:
| id | name | age | city | created_at | |
|---|---|---|---|---|---|
| 1 | 홍길동 | hong@mail.com | 28 | 서울 | 2025-01-15 |
| 2 | 김영희 | kim@mail.com | 35 | 부산 | 2025-02-20 |
| 3 | 이철수 | lee@mail.com | 22 | 서울 | 2025-03-10 |
| 4 | 박민수 | park@mail.com | 41 | 대전 | 2025-06-01 |
| 5 | 최수진 | choi@mail.com | 29 | 서울 | 2025-08-15 |
핵심 SQL 문법 (CRUD)
1. SELECT – 데이터 조회 (가장 많이 사용)
-- 모든 컬럼 조회
SELECT * FROM users;
-- 특정 컬럼만 조회
SELECT name, email, age FROM users;
-- 조건 검색 (WHERE)
SELECT * FROM users WHERE city = '서울';
-- 여러 조건 (AND, OR)
SELECT * FROM users WHERE city = '서울' AND age >= 25;
-- 정렬 (ORDER BY)
SELECT * FROM users ORDER BY age DESC; -- 나이 내림차순
SELECT * FROM users ORDER BY created_at ASC; -- 가입일 오름차순
-- 결과 개수 제한 (LIMIT)
SELECT * FROM users ORDER BY age DESC LIMIT 3; -- 상위 3명만
2. 집계 함수 – 통계 내기
-- 전체 사용자 수
SELECT COUNT(*) FROM users;
-- 결과: 5
-- 평균 나이
SELECT AVG(age) FROM users;
-- 결과: 31.0
-- 최대/최소 나이
SELECT MAX(age), MIN(age) FROM users;
-- 결과: 41, 22
-- 도시별 사용자 수 (GROUP BY)
SELECT city, COUNT(*) as user_count
FROM users
GROUP BY city
ORDER BY user_count DESC;
-- 결과:
-- 서울 | 3
-- 부산 | 1
-- 대전 | 1
3. INSERT – 데이터 추가
INSERT INTO users (name, email, age, city)
VALUES ('정유나', 'jung@mail.com', 27, '인천');
4. UPDATE – 데이터 수정
-- 특정 사용자의 도시 변경
UPDATE users SET city = '대구' WHERE id = 3;
-- ⚠️ WHERE 없이 UPDATE하면 모든 행이 변경됨! 주의!
5. DELETE – 데이터 삭제
-- 특정 사용자 삭제
DELETE FROM users WHERE id = 4;
-- ⚠️ WHERE 없이 DELETE하면 모든 데이터 삭제! 매우 주의!
실전 예제: 쇼핑몰 데이터 분석
orders 테이블이 있다고 가정합니다:
-- Q1: 이번 달 총 매출은?
SELECT SUM(amount) as total_sales
FROM orders
WHERE created_at >= '2026-03-01';
-- Q2: 상위 고객 5명 (총 구매액 기준)?
SELECT user_id, SUM(amount) as total_spent
FROM orders
GROUP BY user_id
ORDER BY total_spent DESC
LIMIT 5;
-- Q3: 월별 매출 추이
SELECT
DATE_FORMAT(created_at, '%Y-%m') as month,
SUM(amount) as monthly_sales,
COUNT(*) as order_count
FROM orders
GROUP BY month
ORDER BY month;
-- Q4: 서울 고객 중 10만원 이상 구매한 사람
SELECT u.name, u.email, SUM(o.amount) as total
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE u.city = '서울'
GROUP BY u.id
HAVING total >= 100000;
SQL 연습 사이트 (무료)
| 사이트 | 특징 | 난이도 |
|---|---|---|
| SQLBolt (sqlbolt.com) | 인터랙티브 튜토리얼, 단계별 학습 | 초급 |
| W3Schools SQL | 브라우저에서 바로 SQL 실행 | 초급 |
| LeetCode SQL | 면접 대비 SQL 문제 | 초급~고급 |
| 프로그래머스 SQL | 한국어, 코딩 테스트 대비 | 초급~중급 |
| HackerRank SQL | 체계적 SQL 문제 | 초급~고급 |
SQL 치트시트
| 키워드 | 용도 | 예시 |
|---|---|---|
| SELECT | 조회할 컬럼 | SELECT name, age |
| FROM | 테이블 지정 | FROM users |
| WHERE | 조건 필터 | WHERE age > 25 |
| ORDER BY | 정렬 | ORDER BY age DESC |
| LIMIT | 결과 개수 제한 | LIMIT 10 |
| GROUP BY | 그룹별 집계 | GROUP BY city |
| HAVING | 그룹 조건 | HAVING COUNT(*) > 5 |
| JOIN | 테이블 연결 | JOIN orders ON users.id = orders.user_id |
| COUNT/SUM/AVG | 집계 함수 | SELECT COUNT(*), SUM(amount) |
| LIKE | 패턴 검색 | WHERE name LIKE ‘김%’ |
| IN | 목록 검색 | WHERE city IN (‘서울’, ‘부산’) |
| BETWEEN | 범위 검색 | WHERE age BETWEEN 20 AND 30 |
마무리
SQL의 핵심은 SELECT, FROM, WHERE, ORDER BY, GROUP BY 다섯 키워드입니다. 이것만 알면 실무 데이터 조회의 80%를 할 수 있습니다. 오늘 할 일: SQLBolt(sqlbolt.com)에 접속해서 첫 번째 레슨을 완료하세요. 30분이면 SELECT 문을 마스터할 수 있습니다.