커뮤니티 입장하기

SQL 기초 문법과 마케터가 쓰는 쿼리 예시

SQL(Structured Query Language)은 데이터베이스의 자료를 조회하고 다루는 언어입니다. 이 글에서는 원본 값을 바꾸지 않고 조건에 맞는 행을 고르고 집계하는 SELECT 문부터 익힙니다.

같은 말:마케터 SQLSQL 기초SQL 쿼리 예시SELECT 문

아직 읽은 기록이 많지 않은 개념이에요
Share
목차
  1. 🤔 숫자 하나를 받으려고 사흘을 기다릴 때
  2. 🔑 SQL의 정의
  3. 🗂️ 주민센터 창구에 내미는 발급 신청서
  4. 🧩 문장을 이루는 여섯 조각
  5. 💻 마케터가 자주 쓰는 쿼리 다섯 가지
  6. 🔗 두 표를 이어 붙이는 JOIN
  7. 🎯 마케터가 SQL을 익히면 달라지는 것
  8. 🧪 어디서 연습하는지
  9. ⚠️ 자주 하는 실수
  10. ❓ 자주 묻는 질문
  11. 🧑‍💻 계정 없이 세 주문으로 첫 조회하기
  12. 📋 3줄 요약
  13. 📚 참고 자료

🤔 숫자 하나를 받으려고 사흘을 기다릴 때

채널별 매출이 궁금해 요청을 보내고 사흘 뒤에 받은 표를 열어 보면, 기간이 한 주 어긋나 있는 일이 있습니다. 다시 요청하면 또 며칠이 걸립니다.

질문과 집계 기준을 직접 적고 결과를 확인할 수 있으면 반복 요청을 줄이는 데 도움이 됩니다. SQL은 그때 쓸 수 있는 언어입니다. 아래 계정 없이 세 주문으로 첫 조회하기에서는 회사 데이터 없이 시작합니다.

🔑 SQL의 정의

SQL은 데이터베이스의 자료를 조회하고 다루는 언어입니다. 데이터베이스는 자료를 저장하고 필요한 조건으로 찾도록 관리하는 시스템입니다. 표의 가로 한 줄은 행, 세로 항목은 열이라고 합니다.

원래 이름은 Structured Query Language, 즉 구조를 갖춘 질의 언어입니다. SQL에서는 필요한 결과를 선언하는 방식으로 조회 문장을 씁니다. 이 조회 요청을 쿼리(query)라고 합니다. 절차를 짜는 대신 원하는 결과를 한 문장으로 적어 건네면, 값을 어떻게 찾아올지는 데이터베이스가 정합니다.

처음에는 한 표의 조회와 합계부터 해 봅니다. 실제 업무에 적용하려면 표와 열의 뜻, 자료형 및 집계 기준도 함께 알아야 합니다.

🗂️ 주민센터 창구에 내미는 발급 신청서

주민센터에서 등본을 뗄 때 "서류 좀 주세요"라고 말하는 대신 신청서의 빈칸을 채워 내밀듯, 데이터베이스에 요청하는 일도 빈칸을 채운 종이 한 장을 건네는 것에 가깝습니다. 신청서에는 어떤 서류인지, 누구 것인지, 몇 통이 필요한지를 적는 칸이 정해져 있습니다.

SQL 문장도 같은 모양이어서, 무엇을 뽑을지, 어느 표에서 뽑을지, 어떤 조건에 맞는 줄만 볼지를 정해진 순서대로 적습니다. 창구 직원이 서류를 어느 캐비닛에서 꺼내 오는지 신청인이 알 필요가 없듯, 데이터베이스가 값을 찾는 방법도 요청하는 쪽에서 정하지 않습니다.

신청서의 빈칸을 하나라도 잘못 채우면 엉뚱한 서류가 나오듯, 조건을 잘못 적은 쿼리도 오류 없이 엉뚱한 값을 돌려줍니다.

🧩 문장을 이루는 여섯 조각

아래는 조회 문장에서 자주 쓰는 여섯 절입니다. 모든 문장에 여섯 개를 다 넣지는 않으며 SQL에는 다른 문법도 있습니다. 각 조각이 한국어 문장의 어떤 부분을 맡는지 나란히 놓아 봅니다.

조각묻는 것한국어 문장에서 맡는 부분예시 문장에서 대응하는 말
SELECT무엇을보여 달라고 말하는 목적어채널과 주문 수와 매출을
FROM어디서그 값이 들어 있는 곳주문 표에서
WHERE어떤 조건으로 거른 줄만대상을 좁히는 관형절8월에 들어온
GROUP BY무엇끼리 묶어서묶음의 기준채널별로 묶어
ORDER BY어떻게 정렬해순서를 정하는 말매출이 큰 순서로
LIMIT몇 줄만개수를 제한하는 말다섯 줄만

8월에 들어온 주문을 채널별로 묶어 매출이 큰 순서로 다섯 줄만 보여 줘라는 요청은 아래 문장처럼 쓸 수 있습니다. 이 부분은 구조 설명용이며 orders 표가 준비되어 있어야 실행됩니다. 바로 실행할 예제는 아래 계정 없이 세 주문으로 첫 조회하기에 있습니다.

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()은 숫자를 더합니다. 집계할 행이 없으면 COUNT는 0, SUM은 값이 없음을 나타내는 NULL이 나올 수 있습니다. AS는 결과 표에 붙일 열 이름이고 DESC는 큰 값부터 내려간다는 뜻으로, 이 네 가지는 집계 문장에서 거의 매번 함께 나옵니다.

본문 SQL의 각 절이 맡는 일을 정리한 개념도입니다. 실제 쿼리 작성 순서와 실행 계획을 그대로 그린 것은 아닙니다.

💻 마케터가 자주 쓰는 쿼리 다섯 가지

아래 예제는 주문당 한 행인 orders, 이벤트당 한 행인 events, 검색당 한 행인 site_search_logs라는 가상 표를 전제로 합니다. 날짜 열은 날짜 또는 예제 형식으로 비교 가능한 값이고 revenue는 합산할 매출입니다. 실제 적용에는 이름뿐 아니라 자료형, 중복과 취소 처리도 맞춰야 합니다. GA4의 원본 내보내기 표에 그대로 실행하는 쿼리가 아닙니다.

채널마다 주문이 몇 건이고 매출이 얼마인지

SELECT channel, COUNT(*) AS order_count, SUM(revenue) AS total_revenue FROM orders WHERE order_date >= '2026-08-02' AND order_date < '2026-09-01' -- 8월 2일부터 31일까지 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 >= '2026-08-01' AND event_date < '2026-09-01' 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은 양쪽에 짝이 있는 행만 남기는 INNER JOIN입니다. customers에 같은 customer_id가 두 행이면 해당 주문도 두 행으로 늘 수 있습니다. JOIN 종류와 연결할 열의 중복 여부를 확인해야 합니다. o와 c는 표를 짧게 부르는 별칭이고 o.revenue는 orders 표의 revenue 열을 뜻합니다. 처음에는 JOIN이 필요한 상황이 어떤 때인지 알아 두는 정도면 충분합니다. 보고 싶은 값이 한 표 안에 다 있으면 쓰지 않고, 두 표에 나뉘어 있을 때만 꺼냅니다.

🎯 마케터가 SQL을 익히면 달라지는 것

  • 직접 확인할 범위가 늘어납니다: 조회 권한과 집계 기준이 갖춰진 자료는 조건을 바꾸어 다시 확인할 수 있습니다
  • 질문을 조금 바꿔 다시 볼 수 있습니다: 기간을 넓히거나 채널 하나를 빼는 정도는 조건 한 줄만 고치면 됩니다
  • 숫자가 어떻게 만들어졌는지 알게 됩니다: 대시보드의 매출이 어느 표에서 어떤 조건으로 집계된 값인지 보이면 확인할 곳이 좁혀집니다

다만 SQL이 분석을 대신하지는 않습니다. 쿼리는 물어본 것만 돌려주므로, 무엇을 물어볼지 정하는 일과 나온 숫자를 어떻게 판단할지는 여전히 사람이 합니다. KPI를 잘못 잡아 두면 쿼리를 빨리 돌려도 틀린 숫자를 더 빨리 보게 될 뿐입니다.

🧪 어디서 연습하는지

첫 연습은 아래 SQLite Fiddle을 사용합니다. 설치나 계정 없이 브라우저에서 작은 가상 자료를 실행하는 도구입니다. 여기서 배운 조회 구조를 사내 읽기 전용 분석 환경이나 BigQuery에 적용할 수 있습니다.

회사 환경에서는 표의 구조와 사용 권한, 비용을 먼저 확인합니다. 구글 스프레드시트의 QUERY 함수는 비슷한 표현을 쓰지만 SQL 전체와 같은 언어가 아니므로 문장을 그대로 옮길 수 있는 것은 아닙니다.

⚠️ 자주 하는 실수

  • SELECT *로 표 전체를 읽는 것: 별표는 모든 열을 뜻해서 열이 수백 개인 표에서는 필요 없는 값까지 읽습니다. 읽은 양만큼 비용이 붙는 곳도 있어 쓸 열만 적는 편이 안전하고 결과도 빨리 나옵니다
  • 기간 조건을 빼먹는 것: WHERE에 날짜 조건이 없으면 표에 쌓인 처음부터 지금까지가 전부 집계됩니다. 숫자가 유난히 크면 기간 조건이 들어갔는지부터 확인합니다
  • 중복 집계를 눈치채지 못하는 것: 두 표를 이어 붙였을 때 한쪽에 같은 고객이 여러 줄로 들어 있으면 주문 하나가 여러 번 세어집니다. COUNT(DISTINCT customer_id)는 중복되지 않은 고객 수만 구하며 부풀려진 매출 합계를 고쳐 주지는 않습니다

중복 집계가 가장 늦게 드러납니다. 문장은 정상으로 실행되고 숫자만 커져 있어서, 합계가 평소보다 크면 줄 수부터 세어 봅니다. 채널별 숫자를 모델마다 다르게 집계하는 방법은 GA4 빅쿼리 어트리뷰션 분석에 쿼리와 함께 정리해 두었습니다.

❓ 자주 묻는 질문

SQLD 같은 자격증을 따야 하나요?

실무에서 쿼리를 쓰는 데 자격증이 필요하지는 않습니다. 자격증은 데이터베이스 설계와 이론까지 다루지만 마케팅 업무에서 쓰는 것은 그 가운데 조회 문장 일부입니다. 이력서에 자격이 필요한 상황이 아니라면 실제로 쓸 다섯 문장을 먼저 익히는 쪽이 낫습니다.

엑셀이나 스프레드시트를 잘하면 SQL은 필요 없나요?

피벗 테이블로 하던 일과 SQL로 하는 일은 상당 부분 겹칩니다. 달라지는 곳은 데이터 양과 반복입니다. 수십만 행을 넘어가면 시트가 느려지고, 매주 같은 정리를 되풀이한다면 쿼리 한 줄을 저장해 두는 쪽이 빠릅니다.

쿼리를 잘못 써서 데이터가 지워지지는 않나요?

이 글의 조회 예제는 원본 값을 수정하지 않습니다. SQL에는 수정과 삭제 명령도 있으므로 붙여 넣은 문장 전체를 확인하고 실무에서는 필요한 읽기 권한으로 실행합니다. 조회 자체에 비용이 드는 환경도 있습니다.

어느 정도까지 배우면 실무에 쓸 수 있나요?

한 표에서 기간과 대상을 고르고 건수와 합계를 구한 뒤 원자료와 대조할 수 있으면 첫 업무에 적용할 준비가 됩니다. 여러 표 연결과 재구매 같은 시간 순서 분석은 별도로 익힙니다.

🧑‍💻 계정 없이 세 주문으로 첫 조회하기

  1. 브라우저에서 SQLite Fiddle을 열고 초기화가 끝날 때까지 기다립니다.
  2. 명령을 한 줄씩 입력하는 화면이고 Run이 보이지 않으면 아래 Options의 Toggle view를 누릅니다. 입력 칸과 결과 칸이 나뉜 화면으로 전환됩니다.
  3. Clear Input을 눌러 입력 칸을 비우고 아래 코드 전체를 붙여 넣습니다.
  4. 글자 일부를 선택하지 않은 상태에서 Run을 누릅니다. 일부를 선택하면 그 부분만 실행될 수 있습니다.
WITH orders(channel, revenue) AS ( VALUES ('email', 10000), ('search', 20000), ('email', 30000) ) SELECT channel, COUNT(*) AS order_count, SUM(revenue) AS total_revenue FROM orders GROUP BY channel ORDER BY total_revenue DESC;

WITH 부분은 이 문장 안에서만 사용할 세 주문을 만드는 준비 코드입니다. 지금은 준비 부분을 그대로 두고 SELECT 아래에서 무엇을 묻는지 읽으면 됩니다. 결과는 다음 두 행입니다.

channelorder_counttotal_revenue
email240000
search120000

email의 10,000원과 30,000원을 더해 40,000원인지 대조하면 첫 실행을 마친 것입니다. 전체도 세 주문 60,000원으로 일치합니다.

no such table: orders가 나오면 WITH 부분까지 포함해 전체를 실행했는지 봅니다. syntax error가 나오면 괄호, 쉼표와 작은따옴표를 원문과 대조합니다. 웹페이지가 초기화되지 않으면 새로고침하고 다시 시도합니다.

결과 칸이 길어지면 Clear Output으로 이전 출력만 비울 수 있습니다. 입력 코드는 지워지지 않습니다.

혼자 반복하려면 FROM orders 다음 줄에 WHERE channel = 'email'을 추가합니다. 결과는 email 한 행, 주문 2건과 40,000원만 남아야 합니다. 이 예제는 실제 표를 저장하지 않으므로 반복 실행해도 주문이 중복 저장되지 않습니다. 회사 데이터나 파일을 넣을 필요 없이 이 가상 자료로 연습합니다.

📋 3줄 요약

  1. SQL은 데이터베이스의 자료를 조회하고 다루는 언어이며, 처음에는 SELECT로 행을 고르고 집계하는 것부터 익힙니다.

  2. 조회 결과가 나와도 기간과 원래 행 수, 합계를 대조해야 조건을 잘못 적은 오류를 찾을 수 있습니다.

  3. JOIN으로 행이 늘어 매출이 중복될 수 있으므로 연결할 열의 중복 여부와 실제 집계 기준을 확인합니다.

📚 참고 자료

Share

제대로 이해했는지 한 문제로 확인해 볼까요?

답을 고르면 바로 풀이가 나와요.

채널별 매출을 큰 순서로 다섯 줄만 보려고 할 때, 다섯 줄로 끊는 일을 맡는 조각은 무엇일까요?

예제나 확인 질문을 직접 시도한 뒤 완료 표시해요. 더 연습할 내용이 남으면 표시하지 않고 다음 글을 읽어도 됩니다. 완료 버튼은 이해도를 채점하지 않으며 잘못 표시하면 취소할 수 있어요.

15개념 / 클래스태블로와 루커 스튜디오 차이와 고르는 법