2 분 소요

[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회 이상 참여한 사람만 계산

검증 과정 흐름

  1. 전체 테이블 구조 파악 (battle)
  2. 특정 트레이너 ID 필터링 (예: 7번)
  3. 승리 횟수 / 총 참여 횟수 직접 눈으로 확인 (예상값 만들기)
  4. 쿼리 작성해서 비교
  5. 동일하면 조건 제거 후 전체 대상 실행

핵심 쿼리 흐름 요약

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. 마무리

가독성 있게 잘 짜고 싶네..

태그:

카테고리:

업데이트:

댓글남기기