티스토리 뷰
목차
데이터 분석가, 마케터, 서비스 기획자 등 직무를 불문하고 데이터 기반의 합리적인 의사결정이 중요해지면서 SQL은 선택이 아닌 필수적인 비즈니스 핵심 스킬로 자리 잡았습니다. 단순한 이론적 지식이나 자격증 취득을 위한 공부가 아니라, 실제 치열한 실무 환경에서 수백만 건이 넘는 방대한 데이터베이스로부터 자신이 원하는 비즈니스 인사이트를 정확하고 빠르게 뽑아내기 위해 빈번하게 사용되는 핵심 문법들은 어느 정도 정해져 있습니다. 현업 데이터 추출 업무에서 가장 강력하고 자주 쓰이는, 실무자라면 반드시 숙지해야 할 SQL 문법 5가지를 아주 상세하고 이해하기 쉽게 정리해 드립니다. 당장 내일 출근해서 실무에 바로 적용할 수 있는 유용한 꿀팁들과 함께 핵심만을 짚어보겠습니다.
1. 조건에 맞는 데이터만 정교하게 골라내기: SELECT, FROM, WHERE
가장 기본적이면서도 실제 데이터 추출 업무의 80% 이상을 차지하는 뼈대이자 모든 쿼리의 시작점입니다. SELECT 구문으로 최종 결과물로 가져올 컬럼(열)을 지정하고, FROM 구문으로 데이터를 가져올 대상 원본 테이블을 선택한 뒤, WHERE 절을 통해 자신이 원하는 특정 조건에 부합하는 데이터만 정밀하게 필터링합니다. 데이터베이스 시스템의 연산 부하를 최소화하고 쿼리 속도를 높이기 위해서는 데이터 추출의 가장 첫 단계에서부터 불필요한 데이터를 제외하고 필요한 데이터만 솎아내는 작업이 매우 중요합니다. 실무 현장에서는 WHERE 절에서 단순한 등호(=) 연산을 넘어 훨씬 다양한 연산자가 복합적으로 활용됩니다. 특정 기간(예: 최근 1주일, 특정 월)을 필터링하는 BETWEEN, 여러 개의 조건 값을 한 번에 다중 검색하는 IN, 특정 패턴의 문자열(예: 특정 도메인 이메일)을 검색하는 LIKE 연산자가 매우 빈번하게 사용됩니다. 여기에 AND와 OR 논리 연산자를 괄호로 묶어 복잡한 비즈니스 로직을 그대로 쿼리로 구현해 내는 것이 실무의 핵심입니다.





2. 흩어진 데이터를 하나로 연결하여 의미 찾기: JOIN
실제 기업의 거대한 데이터베이스는 데이터 중복을 막고 효율성을 높이기 위한 정규화 과정을 거쳐 여러 테이블로 파편화되어 나뉘어 저장되어 있습니다. 예를 들어, '유저 기본 정보' 테이블과 '상세 결제 내역' 테이블이 분리되어 있기 때문에, 이 두 가지 이상의 테이블을 논리적으로 연결하여 비즈니스적으로 의미 있는 종합적인 뷰를 만들어내는 JOIN은 현업에서 절대적으로 필요한 필수 불가결한 문법입니다. 실무에서는 양쪽 테이블에 모두 존재하는 교집합 데이터만 가져오는 INNER JOIN과, 기준이 되는 왼쪽 테이블의 모든 데이터를 온전히 유지하면서 매칭되는 우측 데이터를 갖다 붙이는 LEFT JOIN이 압도적으로 많이 쓰입니다. 특히 주요 결제 데이터나 고객 정보가 누락되는 치명적인 유실 사태를 방지하기 위해, 전체 모수가 되는 핵심 테이블을 LEFT JOIN의 절대적인 기준으로 삼고 데이터를 차근차근 검증해 나가는 방식을 훨씬 선호합니다. 또한 실무에서는 세 개 이상의 다중 테이블을 JOIN하는 경우가 빈번하므로 테이블 간의 관계를 정확히 파악하는 것이 중요합니다.
3. 데이터를 그룹화하고 핵심 요약하기: GROUP BY와 집계 함수
수십만, 수백만 건의 로우(Row) 단위 원천 데이터를 있는 그대로 하나씩 살펴보는 것은 인간의 인지 능력으로는 불가능하며 큰 의미도 없습니다. 데이터를 특정 기준(예: 가입 날짜, 거주 지역, 구매한 상품 카테고리)에 따라 의미 있는 그룹으로 묶어주는 GROUP BY를 사용하고, 그 묶음 단위로 전체 합계(SUM), 평균(AVG), 개수(COUNT), 최댓값 및 최솟값(MAX/MIN) 등을 계산하는 집계 함수를 반드시 적용해야만 비로소 비즈니스 방향성을 결정할 수 있는 거시적인 인사이트를 얻을 수 있습니다. 일별, 주별, 월별 활성 사용자 수(DAU/MAU)의 장기적인 추이를 분석하거나, 연령대별 평균 객단가를 산출할 때 절대적으로 필요한 문법입니다. 특히 고유한 유저 수를 셀 때는 COUNT(DISTINCT user_id)와 같은 형태로 중복을 제거하는 테크닉이 자주 쓰입니다. 또한, 그룹화 및 집계가 완료된 요약 결과 수치에 또 다른 조건을 걸어 2차 필터링을 진행할 때는 WHERE 절이 아닌 HAVING 절을 반드시 사용해야 한다는 점이 입문자들이 가장 자주 실수하는 중요한 핵심 포인트입니다.





4. 복잡한 쿼리를 깔끔하게 구조화하기: WITH 절 (CTE)
현업의 데이터 추출 요구사항은 생각보다 매우 복잡하고 까다롭기 때문에 단 한 번의 단순한 SELECT 문만으로 원하는 최종 데이터를 모두 추출해 내기란 거의 불가능에 가깝습니다. 이때 메인 쿼리 안에 또 다른 임시 쿼리를 작성하여 데이터를 단계별로 가공하는 방식을 사용합니다. 과거에는 FROM 절 안에 괄호를 겹겹이 치는 복잡한 인라인 뷰 서브쿼리를 주로 썼지만, 최근 실무 환경에서는 쿼리의 가독성과 추후 유지보수성을 극대화하기 위해 WITH 절(Common Table Expression)을 압도적으로 많이 사용하는 추세입니다. WITH 절을 사용하면 복잡한 로직을 가진 임시 테이블 뷰를 쿼리 코드 상단에 명시적으로 분리하여 만들어두고, 메인 쿼리에서는 이를 마치 변수처럼 간편하고 깔끔하게 참조하는 방식으로 동작합니다. 이는 동료들과의 쿼리 공유나 코드 리뷰 시 로직의 흐름을 빠르게 파악할 수 있게 해주는 엄청난 장점이 있으며, 동일한 서브쿼리를 여러 번 반복해서 작성할 필요가 없어 코드의 길이도 획기적으로 줄여줍니다.
5. 고급 데이터 분석의 꽃, 행 간 관계 분석: 윈도우 함수
실무 데이터 추출 및 데이터 분석의 수준을 단숨에 한 단계 높여주는 핵심적이고 강력한 최고급 문법입니다. 앞서 설명한 GROUP BY는 데이터를 요약하여 전체 행의 수를 대폭 줄여버리지만, 윈도우 함수는 기존 원본 데이터 행의 디테일을 그대로 유지한 상태에서 특정 윈도우(범위, PARTITION BY) 내에서의 순위 매기기, 누적합 계산, 이전 행 또는 다음 행과의 차이 등을 아주 정밀하게 계산할 수 있게 해줍니다. ROW_NUMBER(), RANK()를 이용한 특정 카테고리별 매출 상위권 랭킹 매기기나, LAG(), LEAD() 함수를 이용한 '이전 달 대비 이번 달 매출 증감률' 계산, 특정 유저별 '재구매 소요 기간(주기)' 분석 등에 필수적으로 쓰이는 강력한 기능입니다. 데이터를 그룹 단위로 쪼개는 PARTITION BY와 그 안에서 순서를 정하는 ORDER BY를 자유자재로 다룰 수 있다면, 고객의 행동 패턴을 깊이 있게 이해하고 리텐션 전략을 세우는 등 고도화된 비즈니스 인사이트 도출에 매우 유용하게 활용할 수 있습니다.






