SQL 기초
SQL은 데이터베이스에서 정확한 데이터를 가져오기 위한 공통 언어입니다. 모델 성능 문제처럼 보이는 이슈도 실제로는 SQL 추출 오류인 경우가 많습니다.학습 목표
SELECT부터JOIN,GROUP BY까지 핵심 쿼리를 이해합니다.- 윈도우 함수와 CTE를 활용하여 복잡한 분석 쿼리를 작성할 수 있습니다.
EXPLAIN을 사용하여 쿼리 성능을 진단할 수 있습니다.- 학습 데이터 추출 쿼리를 재현 가능하게 작성할 수 있습니다.
기본 실행 순서(논리적)
SQL 쿼리의 논리적 처리 순서는 작성 순서와 다릅니다. 이 순서를 이해하면 에러 원인을 빠르게 파악할 수 있습니다.| 순서 | 절 | 역할 |
|---|---|---|
| 1 | FROM / JOIN | 대상 테이블 결정 |
| 2 | WHERE | 행 필터링 |
| 3 | GROUP BY | 집계 단위 정의 |
| 4 | HAVING | 집계 결과 필터링 |
| 5 | SELECT | 최종 컬럼 선택/생성 |
| 6 | DISTINCT | 중복 제거 |
| 7 | ORDER BY | 정렬 |
| 8 | LIMIT / OFFSET | 출력 제한 |
WHERE에서 SELECT의 별칭(alias)을 사용할 수 없는 이유가 바로 이 실행 순서 때문입니다.
WHERE는 SELECT보다 먼저 실행됩니다.기본 패턴 예시
조인 시 체크 포인트
- 조인 키가 PK/FK 관계인지 확인합니다.
INNER JOIN과LEFT JOIN차이를 이해하고 선택합니다.- 조인 후 행 수가 예상보다 늘어나면 중복 키를 의심합니다.
| 조인 타입 | 동작 | 사용 시점 |
|---|---|---|
INNER JOIN | 양쪽 모두 일치하는 행만 | 두 테이블 모두에 데이터가 있어야 할 때 |
LEFT JOIN | 왼쪽 전체 + 오른쪽 일치 | 왼쪽 기준으로 빠진 데이터를 찾을 때 |
RIGHT JOIN | 오른쪽 전체 + 왼쪽 일치 | LEFT JOIN을 뒤집은 것 (잘 안 씀) |
FULL OUTER JOIN | 양쪽 전체 합집합 | 양쪽 데이터 누락을 모두 확인할 때 |
CROSS JOIN | 모든 조합 (카테시안 곱) | 조합 생성 시 (주의: 행 폭증) |
윈도우 함수 (Window Function)
윈도우 함수는GROUP BY 없이 집계와 원본 행을 함께 볼 수 있어 분석에 매우 유용합니다.
CTE (Common Table Expression)
CTE는 복잡한 쿼리를 단계별로 나누어 가독성과 재사용성을 높입니다.EXPLAIN 실행계획 읽기
EXPLAIN은 쿼리가 실제로 어떻게 실행되는지 보여줍니다. 느린 쿼리의 원인을 찾을 때 필수입니다.
| 실행계획 항목 | 좋은 신호 | 나쁜 신호 |
|---|---|---|
| Scan 타입 | Index Scan, Index Only Scan | Seq Scan (대량 테이블) |
| 예상 행 수 vs 실제 행 수 | 비슷함 | 크게 차이남 (통계 갱신 필요) |
| Sort 방식 | Sort Key + Index | Sort Method: external merge |
| Join 방식 | Hash Join, Merge Join | Nested Loop (대량 데이터) |
데이터 품질 검증 쿼리
학습 데이터 추출 후 반드시 실행해야 할 검증 쿼리 패턴입니다.성능 점검 기본
SELECT *대신 필요한 컬럼만 조회합니다.- 필터 컬럼에 인덱스가 있는지 확인합니다.
- 큰 조인 전에는 CTE/서브쿼리로 대상 행을 줄입니다.
- 실행 계획(
EXPLAIN ANALYZE)으로 전체 스캔 여부를 확인합니다. - 대량 데이터 조회 시
LIMIT으로 먼저 샘플을 확인합니다.
초보자가 가장 많이 하는 실수: 중복 조인
초보자가 가장 많이 하는 실수: 중복 조인
1:N 관계를 모르고 조인하면 행 수가 폭증합니다.
먼저 조인 전/후 카운트를 비교하고, 키 중복 여부를 확인하세요.
학습 데이터 추출에서 꼭 필요한 검증
학습 데이터 추출에서 꼭 필요한 검증
- 총 행 수 2) 라벨 분포 3) 결측치 비율 4) 기간 범위가 요구사항과 일치하는지 확인하세요. 쿼리 결과를 바로 모델에 넣지 말고 통계 요약을 먼저 확인하세요.
RAG/LLMOps에서 SQL을 쓰는 대표 사례
RAG/LLMOps에서 SQL을 쓰는 대표 사례
프롬프트 실험 로그 분석, 사용자 피드백 집계, 모델 버전별 성능 비교, 비용 집계에 SQL이 핵심입니다.
특히 A/B 테스트 결과 분석과 토큰 사용량 추적에 윈도우 함수가 자주 활용됩니다.
인덱스를 언제 만들어야 하나?
인덱스를 언제 만들어야 하나?
WHERE, JOIN, ORDER BY에 자주 사용되는 컬럼에 인덱스를 만듭니다.
단, 인덱스가 많으면 INSERT/UPDATE 성능이 떨어집니다.
EXPLAIN으로 Seq Scan이 발생하는 쿼리를 먼저 찾고, 해당 컬럼에 인덱스를 추가하세요.체크리스트
- 쿼리 목적(분석/피처/운영 리포트)이 분명한가요?
- 결과 검증 지표(행 수, 분포, 결측치)를 기록했나요?
- 성능 문제가 생길 때
EXPLAIN ANALYZE를 확인하나요? - CTE를 활용하여 복잡한 쿼리를 단계별로 분리했나요?
- 학습 데이터 추출 후 품질 검증 쿼리를 실행했나요?

