SQL 기초 문법과 마케터가 쓰는 쿼리 예시
홍승협(준이아빠) / 데이터 분석, AI 실무 교육
SQL은 표 형태로 쌓인 데이터에 어떤 줄을 어떻게 묶어서 보여 달라고 요청하는 말입니다. 프로그래밍 언어라기보다 빈칸을 채워 건네는 요청 문장에 가까워서, 문장 틀 여섯 조각만 익히면 마케터가 자주 묻는 것은 대부분 직접 뽑을 수 있습니다.
🤔 숫자 하나를 받으려고 사흘을 기다릴 때
채널별 매출이 궁금해 요청을 보내고 사흘 뒤에 받은 표를 열어 보면, 기간이 한 주 어긋나 있는 일이 있습니다. 다시 요청하면 또 며칠이 걸립니다.
자료가 없어서 생기는 문제가 아니라 자료를 꺼내 달라고 말하는 방법을 모르고 있어서 생기는 문제입니다. 그 말하는 방법에 붙은 이름이 SQL입니다. 이 글은 SQLD 같은 자격증을 준비하는 내용이 아니라, 마케터가 실무에서 쓰는 최소한만 다룹니다.
🔑 SQL의 정의
SQL은 표 형태로 쌓인 데이터에 어떤 줄을 어떻게 묶어서 보여 달라고 요청하는 말입니다.
원래 이름은 Structured Query Language, 즉 구조를 갖춘 질의 언어입니다. 언어라는 말 때문에 코딩을 떠올리기 쉽지만, SQL은 프로그래밍 언어라기보다 요청 문장에 가깝습니다. 절차를 짜는 대신 원하는 결과를 한 문장으로 적어 건네면, 값을 어떻게 찾아올지는 데이터베이스가 정합니다.
그래서 외울 것이 생각보다 적습니다. 문장 틀은 거의 고정되어 있고 상황마다 바뀌는 것은 표 이름과 조건뿐입니다.
🗂️ 주민센터 창구에 내미는 발급 신청서
주민센터에서 등본을 뗄 때 "서류 좀 주세요"라고 말하는 대신 신청서의 빈칸을 채워 내밀듯, 데이터베이스에 요청하는 일도 빈칸을 채운 종이 한 장을 건네는 것에 가깝습니다. 신청서에는 어떤 서류인지, 누구 것인지, 몇 통이 필요한지를 적는 칸이 정해져 있습니다.
SQL 문장도 같은 모양이어서, 무엇을 뽑을지, 어느 표에서 뽑을지, 어떤 조건에 맞는 줄만 볼지를 정해진 순서대로 적습니다. 창구 직원이 서류를 어느 캐비닛에서 꺼내 오는지 신청인이 알 필요가 없듯, 데이터베이스가 값을 찾는 방법도 요청하는 쪽에서 정하지 않습니다.
신청서의 빈칸을 하나라도 잘못 채우면 엉뚱한 서류가 나오듯, 조건을 잘못 적은 쿼리도 오류 없이 엉뚱한 값을 돌려줍니다.
🧩 문장을 이루는 여섯 조각
SQL 문장은 조각 여섯 개로 되어 있고 순서도 고정되어 있습니다. 각 조각이 한국어 문장의 어떤 부분을 맡는지 나란히 놓아 봅니다.
| 조각 | 묻는 것 | 한국어 문장에서 맡는 부분 | 예시 문장에서 대응하는 말 |
|---|---|---|---|
SELECT | 무엇을 | 보여 달라고 말하는 목적어 | 채널과 주문 수와 매출을 |
FROM | 어디서 | 그 값이 들어 있는 곳 | 주문 표에서 |
WHERE | 어떤 조건으로 거른 줄만 | 대상을 좁히는 관형절 | 8월에 들어온 |
GROUP BY | 무엇끼리 묶어서 | 묶음의 기준 | 채널별로 묶어 |
ORDER BY | 어떻게 정렬해 | 순서를 정하는 말 | 매출이 큰 순서로 |
LIMIT | 몇 줄만 | 개수를 제한하는 말 | 다섯 줄만 |
8월에 들어온 주문을 채널별로 묶어 매출이 큰 순서로 다섯 줄만 보여 줘라는 요청을 그대로 여섯 조각에 나눠 넣으면 아래 문장이 됩니다.
SELECT
channel, -- 무엇을: 채널 이름
COUNT(*) AS order_count, -- 무엇을: 주문 건수
SUM(revenue) AS total_revenue -- 무엇을: 매출 합계
FROM orders -- 어디서: 주문 표
WHERE order_date >= '2026-08-01'
AND order_date < '2026-09-01' -- 어떤 조건: 8월에 들어온 줄만
GROUP BY channel -- 무엇끼리: 채널별로
ORDER BY total_revenue DESC -- 어떻게: 매출이 큰 순서로
LIMIT 5; -- 몇 줄만: 다섯 줄COUNT(*)는 줄 수를 세고 SUM()은 값을 더합니다. AS는 결과 표에 붙일 열 이름이고 DESC는 큰 값부터 내려간다는 뜻으로, 이 네 가지는 집계 문장에서 거의 매번 함께 나옵니다.
💻 마케터가 자주 쓰는 쿼리 다섯 가지
표 이름과 열 이름은 회사마다 다릅니다. orders나 channel 자리에 들어가는 이름만 바꾸면 그대로 씁니다.
채널마다 주문이 몇 건이고 매출이 얼마인지
SELECT channel, COUNT(*) AS order_count, SUM(revenue) AS total_revenue
FROM orders
WHERE order_date >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY) -- 최근 30일
GROUP BY channel
ORDER BY total_revenue DESC;날짜마다 가입 전환이 몇 건 일어났는지
SELECT event_date, COUNT(*) AS conversions
FROM events
WHERE event_name = 'sign_up' -- 볼 이벤트 하나만 고른다
AND event_date BETWEEN '2026-08-01' AND '2026-08-31'
GROUP BY event_date
ORDER BY event_date;특정 조건에 맞는 고객이 몇 명인지
SELECT COUNT(DISTINCT customer_id) AS customers
FROM orders
WHERE order_date >= '2026-08-01'
AND order_date < '2026-09-01'
AND channel = 'naver'; -- DISTINCT가 같은 사람을 한 번만 센다두 기간의 매출이 얼마나 달라졌는지
SELECT
SUM(CASE WHEN order_date < '2026-08-01' THEN revenue ELSE 0 END) AS jul_revenue,
SUM(CASE WHEN order_date >= '2026-08-01' THEN revenue ELSE 0 END) AS aug_revenue
FROM orders
WHERE order_date >= '2026-07-01'
AND order_date < '2026-09-01'; -- CASE WHEN은 조건에 맞을 때만 더한다사이트 안에서 가장 많이 검색된 말이 무엇인지
SELECT search_term, COUNT(*) AS search_count
FROM site_search_logs
WHERE searched_at >= '2026-08-01'
AND searched_at < '2026-09-01'
GROUP BY search_term
ORDER BY search_count DESC
LIMIT 20;다섯 문장의 뼈대는 모두 같습니다. 바뀐 것은 표 이름과 조건, 묶는 기준뿐입니다.
🔗 두 표를 이어 붙이는 JOIN
주문 표에는 고객 번호만 있고 그 고객이 어느 채널로 가입했는지는 고객 표에 따로 있는 경우가 흔합니다. 이럴 때 두 표를 공통 열로 맞춰 한 표처럼 읽게 만드는 것이 JOIN입니다. 서류 두 장을 같은 접수번호로 맞춰 겹쳐 놓듯, 양쪽에 다 있는 열을 짝짓는 조건만 적어 주면 됩니다.
SELECT o.order_id, o.revenue, c.signup_channel
FROM orders AS o
JOIN customers AS c ON o.customer_id = c.customer_id;JOIN은 종류가 여럿이고 짝이 맞지 않는 줄을 어떻게 처리할지에 따라 결과가 달라집니다. 처음에는 JOIN이 필요한 상황이 어떤 때인지 알아 두는 정도면 충분합니다. 보고 싶은 값이 한 표 안에 다 있으면 쓰지 않고, 두 표에 나뉘어 있을 때만 꺼냅니다.
🎯 마케터가 SQL을 익히면 달라지는 것
- 요청하고 기다리지 않아도 됩니다: 사흘 걸리던 확인이 몇 분으로 줄면 회의 중에 바로 답을 냅니다
- 질문을 조금 바꿔 다시 볼 수 있습니다: 기간을 넓히거나 채널 하나를 빼는 정도는 조건 한 줄만 고치면 됩니다
- 숫자가 어떻게 만들어졌는지 알게 됩니다: 대시보드의 매출이 어느 표에서 어떤 조건으로 집계된 값인지 보이면 확인할 곳이 좁혀집니다
다만 SQL이 분석을 대신하지는 않습니다. 쿼리는 물어본 것만 돌려주므로, 무엇을 물어볼지 정하는 일과 나온 숫자를 어떻게 판단할지는 여전히 사람이 합니다. KPI를 잘못 잡아 두면 쿼리를 빨리 돌려도 틀린 숫자를 더 빨리 보게 될 뿐입니다.
🧪 어디서 연습하는지
- 빅쿼리 콘솔: GA4를 BigQuery로 내보내 두었다면 웹 콘솔에서 바로 씁니다. 회사 데이터를 다루므로 연습이 곧 업무가 됩니다
- 스프레드시트 부가 기능: 구글 시트에도 표를 거르고 묶는 함수가 있어서, 표 이름 대신 범위를 적는 차이만 익히면 됩니다
- 사내 분석 도구: 팀에서 쓰는 도구에 쿼리 편집 화면이 있으면 그곳이 가장 빠릅니다. 다만 권한이 읽기 전용인지 먼저 확인하는 편이 안전합니다
무료로 쓰는 범위는 서비스마다 다르고 시점에 따라 바뀌므로 쓰는 시점의 공식 요금 문서를 확인하는 편이 맞습니다. 연습용으로는 ETL로 정리해 둔 작은 표 하나면 충분합니다.
⚠️ 자주 하는 실수
SELECT *로 표 전체를 읽는 것: 별표는 모든 열을 뜻해서 열이 수백 개인 표에서는 필요 없는 값까지 읽습니다. 읽은 양만큼 비용이 붙는 곳도 있어 쓸 열만 적는 편이 안전하고 결과도 빨리 나옵니다- 기간 조건을 빼먹는 것:
WHERE에 날짜 조건이 없으면 표에 쌓인 처음부터 지금까지가 전부 집계됩니다. 숫자가 유난히 크면 기간 조건이 들어갔는지부터 확인합니다 - 중복 집계를 눈치채지 못하는 것: 두 표를 이어 붙였을 때 한쪽에 같은 고객이 여러 줄로 들어 있으면 주문 하나가 여러 번 세어집니다. 고객 수를 셀 때
COUNT(DISTINCT customer_id)를 쓰는 이유가 이것입니다
중복 집계가 가장 늦게 드러납니다. 문장은 정상으로 실행되고 숫자만 커져 있어서, 합계가 평소보다 크면 줄 수부터 세어 봅니다. 채널별 숫자를 모델마다 다르게 집계하는 방법은 GA4 빅쿼리 어트리뷰션 분석에 쿼리와 함께 정리해 두었습니다.
❓ 자주 묻는 질문
SQLD 같은 자격증을 따야 하나요?
실무에서 쿼리를 쓰는 데 자격증이 필요하지는 않습니다. 자격증은 데이터베이스 설계와 이론까지 다루지만 마케팅 업무에서 쓰는 것은 그 가운데 조회 문장 일부입니다. 이력서에 자격이 필요한 상황이 아니라면 실제로 쓸 다섯 문장을 먼저 익히는 쪽이 낫습니다.
엑셀이나 스프레드시트를 잘하면 SQL은 필요 없나요?
피벗 테이블로 하던 일과 SQL로 하는 일은 상당 부분 겹칩니다. 달라지는 곳은 데이터 양과 반복입니다. 수십만 행을 넘어가면 시트가 느려지고, 매주 같은 정리를 되풀이한다면 쿼리 한 줄을 저장해 두는 쪽이 빠릅니다.
쿼리를 잘못 써서 데이터가 지워지지는 않나요?
SELECT로 시작하는 문장은 읽기만 해서 원본이 바뀌지 않습니다. 값을 바꾸거나 지우는 명령은 따로 있고, 마케팅 담당 계정에는 읽기 권한만 주는 경우가 많습니다. 계정을 받을 때 권한을 확인해 두면 마음 놓고 연습해도 됩니다.
어느 정도까지 배우면 실무에 쓸 수 있나요?
이 글에서 다룬 여섯 조각과 JOIN 하나면 마케팅 업무에서 나오는 질문의 상당 부분에 답할 수 있습니다. 더 복잡한 문법은 필요해진 시점에 그 문제를 풀면서 익히는 편이 낫고, 미리 공부해 두면 쓸 일이 없어 잊어버리기 쉽습니다.
📋 3줄 요약
-
SQL은 표 형태로 쌓인 데이터에 어떤 줄을 어떻게 묶어서 보여 달라고 요청하는 말입니다.
-
무엇을 어디서 어떤 조건으로 어떻게 묶어 몇 줄만 볼지 적는 여섯 조각이면 마케터가 자주 묻는 것은 대부분 문장으로 만들 수 있습니다.
-
SQL은 물어본 것만 돌려주므로 무엇을 물어볼지 정하는 일과 나온 숫자를 판단하는 일은 여전히 사람이 합니다.
이 글이 도움이 되셨다면 공유해 주세요
메신저로 바로 보내거나 링크를 복사할 수 있습니다.
채널별 매출을 큰 순서로 다섯 줄만 보려고 할 때, 다섯 줄로 끊는 일을 맡는 조각은 무엇일까요?
이어서 배우면 좋은 개념
빅쿼리(BigQuery) 뜻과 GA4 연동
빅쿼리(BigQuery)는 큰 데이터를 담아 두고 질문을 던져 답을 받는 구글의 데이터 창고 서비스입니다. GA4 화면이 미리 정해 둔 조합만 보여 주는 것과 달리 원본 이벤트가 그대로 쌓여 있어서, 화면에 없는 조합도 직접 만들 수 있습니다.
ETL 뜻과 데이터 웨어하우스, 레이크 차이
ETL은 흩어진 곳에서 데이터를 꺼내고(Extract) 쓸 수 있는 모양으로 바꾸고(Transform) 모아 두는 곳에 넣는(Load) 세 단계를 가리키는 말입니다. 광고 계정에서 성과를 내려받아 열을 맞추고 시트에 붙여 넣는 일이 바로 이 세 단계입니다.
KPI (핵심성과지표) 뜻과 설정 방법
KPI(Key Performance Indicator)는 목표에 얼마나 가까워졌는지를 하나의 숫자로 재는 핵심성과지표입니다. 팀이 보는 수많은 숫자 가운데 판단을 바꾸는 것만 골라 목표값과 기간을 붙인 것입니다.
AB 테스트 뜻과 방법, p값과 표본 크기
AB 테스트는 한 가지만 다르게 만든 두 안을 같은 조건에서 동시에 보여 주고 어느 쪽 성과가 나은지 데이터로 가리는 방법입니다. 바꾼 것이 하나여야 하고 두 안이 같은 기간에 돌아가야 판정이 성립합니다.
관련 인사이트
- 마케터를 위한 통계 기초: 평균, 중앙값, 표준편차를 광고 데이터로광고 소재 두 개의 14일치 전환율로 통계 개념을 차례로 확인합니다. 평균이 같은 두 소재가 중앙값과 표준편차에서 달라지는 과정을 계산으로 보여 주고, 흩어짐이 클 때 무엇을 해야 하는지와 차이를 언제 믿어도 되는지까지 정리했습니다.
- 랜딩페이지 전환율 높이는 법: 어디서 새는지 찾는 4구간 진단랜딩페이지 전환율이 낮을 때 전체를 한꺼번에 고치면 무엇이 통했는지 알 수 없습니다. 방문에서 완료까지를 네 구간으로 끊어 어디서 새는지 찾고, 구간마다 원인과 고칠 것을 정리했습니다. 개선 순서를 정하는 계산과 실험 설계 기준도 담았습니다.
- 마케팅 전략 프레임워크 총정리: SWOT, STP, 4P를 사례 하나로 잇기마케팅 전략 프레임워크는 각각 따로 쓰는 도구가 아니라 앞의 결과가 뒤의 입력이 되는 사슬입니다. 가상의 소상공인 예약 서비스 하나를 SWOT에서 STP, 4P, 포지셔닝 문장까지 연속으로 통과시키며 각 단계에서 무엇이 정해지고 무엇이 다음으로 넘어가는지 정리했습니다.
- 마케팅 지표 계산 공식 총정리: 캠페인 하나로 12개 지표 구하기마케팅 지표는 따로 외우는 것이 아니라 하나의 캠페인 데이터에서 순서대로 나옵니다. 가상 캠페인 한 건의 숫자로 CPM, CTR, CPC, CVR, CPA, 객단가, ROAS, 손익분기 ROAS, CAC, LTV, 회수 기간, ROI를 차례로 계산하고 서로 어떻게 이어지는지 정리했습니다.
- 마케팅 KPI 설정 총정리: 채널별 예시 30개와 목표값 정하는 법마케팅 KPI는 목표에 얼마나 가까워졌는지를 하나의 숫자로 재는 지표입니다. 퍼널 단계와 채널별로 무엇을 KPI로 잡는지 예시 30개로 정리하고, 목표값을 정하는 세 가지 방법과 허영 지표를 거르는 기준, 숫자가 어긋났을 때 점검하는 순서를 담았습니다.
- 비개발자를 위한 네이버 데이터랩 API 가이드: 검색어 트렌드와 쇼핑인사이트네이버 데이터랩 API는 네이버에서 어떤 검색어가 언제 얼마나 검색됐는지를 비율로 돌려주는 오픈 API입니다. 광고 계정이 없어도 쓸 수 있고 발급도 5분이면 끝나는데, 실제 검색 횟수 대신 상대 비율만 준다는 점을 모르면 숫자를 잘못 읽게 됩니다. 통합 검색어 트렌드와 쇼핑인사이트 두 API의 요청 방법, 비율을 실제 검색량으로 바꾸는 방법, 자주 걸리는 오류를 정리했습니다.
