SQL스타일 가이드 및 검증 전략
[SQL]**SQL스타일 가이드(가독성 있게끔..)
1. 가독성을 챙기기 위한 SQL 스타일 가이드 & 결과 검증 전략
1-1. 왜 스타일 가이드가 중요한가?
데이터 엔지니어링 실무에서는 SQL 쿼리를 협업 또는 자동화된 프로세스에서 자주 재사용하게 됨. 이때 가독성 있는 쿼리는 유지보수성을 높이고, 실수나 오류를 줄이는 데 매우 중요함.
실수가 발생하는 일반적인 원인
- 문법에 대한 이해 부족
- 데이터 특성을 파악하지 않고 쿼리를 작성
- 쿼리가 너무 복잡해져서 흐름이 꼬이는 경우
결국, “내가 작성한 쿼리를 다시 봤을 때 바로 이해가 가는가?“가 핵심임.
2-1. SQL 스타일 가이드 핵심 요약
출처:
1) 예약어는 대문자로
SELECT column1 FROM my_table WHERE col2 = 1
2) 컬럼/별칭은 snake_case 사용
SELECT user_id, order_amount AS total_amount FROM orders
3) 명시적인 Alias 사용 (AS 권장)
SELECT o.order_id, u.user_name FROM orders AS o LEFT JOIN users AS u ON o.user_id = u.id
4) SELECT/컬럼은 한 줄에 하나씩
SELECT
user_id,
user_name,
created_at
FROM users
5) 쉼표는 컬럼 뒤에 (BigQuery는 허용)
SELECT
col1,
col2,
col3
FROM table
6) JOIN 시 테이블 명시 + Alias 사용
FROM orders AS o
LEFT JOIN users AS u ON o.user_id = u.id
7) WITH문(CTE)을 적극 활용
WITH daily_sales AS (
SELECT date, SUM(amount) AS total_sales FROM sales GROUP BY date
)
SELECT * FROM daily_sales
장점: 쿼리를 블록 단위로 나눠서 관리 가능 + 재사용성 증가
3-1. PARTITION을 활용한 성능 개선
특히 BigQuery 같은 MPP DB에서는 파티션 필터링이 쿼리 비용에 큰 영향을 줌.
예시
SELECT *
FROM battle
WHERE DATE(battle_datetime) = '2023-12-19'
- 파티션 필터가 없으면 전체 테이블 스캔
- 날짜나 ID로 범위를 좁히는 조건을 먼저 걸어야 함
파티션 필드를
WHERE에 직접 조건으로 거는 게 핵심
4-1. 데이터 결과 검증 (Data Result Validation)
정의
SQL 쿼리로 나온 결과가 내가 기대한 값과 일치하는지 확인하는 과정
왜 중요한가?
- 분석 결과의 정확성, 신뢰성 확보
- 실무에서 데이터 잘못 주면, 신뢰도도 떨어지고 재작업 발생함
내가 자주 쓰는 검증 전략
1) COUNT로 행 수 확인
SELECT COUNT(*) FROM table
2) NULL 존재 여부 확인
SELECT COUNT(*) FROM table WHERE important_col IS NULL
3) DISTINCT 값 확인
SELECT DISTINCT col FROM table
4) CASE/IF문으로 라벨링해 보기
SELECT
user_id,
CASE
WHEN score >= 90 THEN 'A'
WHEN score >= 70 THEN 'B'
ELSE 'C'
END AS grade
FROM users
5) 샘플 유저 필터링 후 검증
-- 특정 user_id 하나만 보기
SELECT * FROM table WHERE user_id = 123
6) WITH문으로 샘플 데이터 생성 후 검증
WITH sample_data AS (
SELECT 1 AS user_id, 'A' AS status
UNION ALL
SELECT 2, 'B'
)
SELECT * FROM sample_data
5-1. 실전 예시: 배틀 승률 계산 문제 검증
문제: 트레이너가 진행한 배틀 중, 승률을 구하되 9회 이상 참여한 사람만 계산
검증 과정 흐름
- 전체 테이블 구조 파악 (
battle) - 특정 트레이너 ID 필터링 (예: 7번)
- 승리 횟수 / 총 참여 횟수 직접 눈으로 확인 (예상값 만들기)
- 쿼리 작성해서 비교
- 동일하면 조건 제거 후 전체 대상 실행
핵심 쿼리 흐름 요약
WITH battle_basic AS (
SELECT id AS battle_id, player1_id AS trainer_id, winner_id FROM basic.battle
UNION ALL
SELECT id, player2_id, winner_id FROM basic.battle
),
battle_with_result AS (
SELECT
*,
CASE
WHEN trainer_id = winner_id THEN 'WIN'
WHEN winner_id IS NULL THEN 'DRAW'
ELSE 'LOSE'
END AS battle_result
FROM battle_basic
)
SELECT
trainer_id,
COUNTIF(battle_result = 'WIN') AS win_count,
COUNT(battle_id) AS total_battle_count,
COUNTIF(battle_result = 'WIN') / COUNT(battle_id) AS win_ratio
FROM battle_with_result
GROUP BY trainer_id
HAVING total_battle_count >= 9
6-1. 마무리
가독성 있게 잘 짜고 싶네..
댓글남기기