🗄️ SQL Formatter

Format and minify SQL queries with proper indentation

📝 Input SQL

✨ Formatted SQL

ℹ️ About SQL Formatter

🎨 Beautify

Format SQL with proper indentation, keyword capitalization, and line breaks.

🗜️ Minify

Compress SQL by removing whitespace to reduce query size.

📊 Statistics

See line counts, size changes, and compression ratios.

💾 Download

Copy formatted SQL or download as a .sql file.

📖 SQL 포맷팅이란?

🔤 SQL 포맷팅 (SQL Formatting)

SQL 포맷팅은 데이터베이스 쿼리문을 일관된 스타일과 들여쓰기로 정리하여 가독성을 높이는 과정입니다. 복잡한 JOIN, 서브쿼리, 여러 조건문이 포함된 SQL을 구조화하여 이해하기 쉽게 만들고, 팀원 간 코드 스타일을 통일합니다. 또한 minify 기능으로 쿼리 크기를 줄여 네트워크 전송을 최적화할 수 있습니다.

포맷팅 전:
SELECT u.id,u.name,o.total FROM users u JOIN orders o ON u.id=o.user_id WHERE o.total>1000 ORDER BY o.total DESC;
포맷팅 후:
SELECT
    u.id,
    u.name,
    o.total
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.total > 1000
ORDER BY o.total DESC;

💡 SQL Formatter 사용 사례

  • 디버깅: 복잡한 쿼리의 구조를 시각적으로 파악하여 오류 찾기
  • 코드 리뷰: 팀원이 작성한 SQL을 쉽게 이해하고 검토
  • 쿼리 최적화: 포맷된 쿼리로 성능 병목 지점 파악
  • 문서화: 기술 문서나 위키에 SQL 예제 깔끔하게 작성
  • 교육: 신입 개발자에게 SQL 구조 설명 시 명확한 예시 제공
  • 마이그레이션: 데이터베이스 스키마 변경 스크립트 정리

🔧 사용 방법

  1. SQL 입력: 포맷하려는 SQL 쿼리를 입력 영역에 붙여넣기
  2. Format 버튼: 자동으로 들여쓰기와 줄바꿈 적용
  3. Minify 버튼: 모든 공백과 줄바꿈 제거하여 압축
  4. 데이터베이스 선택: MySQL, PostgreSQL, Oracle 등 문법에 맞게 변환
  5. 복사: 포맷된 결과를 클릭하여 클립보드에 복사

📚 SQL 포맷팅 규칙

1. 키워드는 대문자

SELECT, FROM, WHERE, JOIN 등 SQL 키워드는 대문자로 작성하여 데이터와 구분합니다.

✅ 좋은 예:
SELECT name, age FROM users WHERE age > 18;
❌ 나쁜 예:
select name, age from users where age > 18;
2. 들여쓰기와 정렬

주요 절(SELECT, FROM, WHERE)은 새 줄에 작성하고, 하위 항목은 들여쓰기합니다.

✅ 좋은 예:
SELECT
    u.id,
    u.name,
    u.email
FROM users u
WHERE u.active = TRUE;
❌ 나쁜 예:
SELECT u.id, u.name, u.email FROM users u WHERE u.active = TRUE;
3. 연산자 주변 공백

=, >, <, AND, OR 등 연산자 양쪽에 공백을 추가합니다.

✅ 좋은 예:
WHERE price > 100 AND quantity < 50
❌ 나쁜 예:
WHERE price>100 AND quantity<50
4. JOIN은 명시적으로

JOIN 조건을 명확하게 표시하고, 각 JOIN은 새 줄에 작성합니다.

✅ 좋은 예:
FROM users u
INNER JOIN orders o ON u.id = o.user_id
LEFT JOIN payments p ON o.id = p.order_id
❌ 나쁜 예:
FROM users u, orders o, payments p WHERE u.id=o.user_id

🎯 복잡한 쿼리 포맷팅 예시

서브쿼리와 CTE (Common Table Expression)
WITH monthly_sales AS (
    SELECT
        DATE_TRUNC('month', order_date) AS month,
        SUM(total) AS total_sales,
        COUNT(*) AS order_count
    FROM orders
    WHERE status = 'completed'
    GROUP BY DATE_TRUNC('month', order_date)
),
top_customers AS (
    SELECT
        user_id,
        SUM(total) AS lifetime_value
    FROM orders
    WHERE created_at >= NOW() - INTERVAL '1 year'
    GROUP BY user_id
    HAVING SUM(total) > 10000
    ORDER BY lifetime_value DESC
    LIMIT 100
)
SELECT
    u.id,
    u.name,
    u.email,
    tc.lifetime_value,
    ms.total_sales
FROM users u
INNER JOIN top_customers tc ON u.id = tc.user_id
LEFT JOIN monthly_sales ms ON DATE_TRUNC('month', u.created_at) = ms.month
WHERE u.active = TRUE
ORDER BY tc.lifetime_value DESC;

⚡ SQL 작성 모범 사례

✅ DO (해야 할 것)
  • 별칭 사용: 테이블과 컬럼에 의미 있는 별칭 부여
  • 명시적 JOIN: INNER/LEFT/RIGHT JOIN 명시
  • 인덱스 활용: WHERE, JOIN 조건에 인덱스된 컬럼 사용
  • 필요한 컬럼만: SELECT * 대신 필요한 컬럼만 명시
  • LIMIT 사용: 대량 데이터 조회 시 LIMIT으로 제한
  • 주석 추가: 복잡한 로직은 주석으로 설명
❌ DON'T (하지 말아야 할 것)
  • SELECT * 남용: 불필요한 컬럼까지 조회하여 성능 저하
  • 암시적 JOIN: WHERE 절의 JOIN은 가독성 떨어짐
  • 서브쿼리 중첩: 3단계 이상 중첩 시 성능 문제
  • OR 남용: 인덱스 활용 불가, IN 또는 UNION 고려
  • 함수 사용: WHERE 절 컬럼에 함수 사용하면 인덱스 무효
  • DISTINCT 남발: 중복 원인 분석 후 JOIN 수정

💻 데이터베이스별 주요 차이점

MySQL / MariaDB
  • 문자열 연결: CONCAT()
  • 날짜 형식: DATE_FORMAT()
  • LIMIT: LIMIT 10 OFFSET 20
  • 자동증가: AUTO_INCREMENT
  • 백틱 사용: `table_name`
PostgreSQL
  • 문자열 연결: || 또는 CONCAT()
  • 날짜 형식: TO_CHAR()
  • LIMIT: LIMIT 10 OFFSET 20
  • 자동증가: SERIAL, IDENTITY
  • 큰따옴표: "table_name"
Oracle
  • 문자열 연결: ||
  • 날짜 형식: TO_CHAR()
  • LIMIT: ROWNUM, FETCH FIRST
  • 자동증가: SEQUENCE
  • 큰따옴표: "table_name"
SQL Server
  • 문자열 연결: + 또는 CONCAT()
  • 날짜 형식: FORMAT()
  • LIMIT: TOP, OFFSET FETCH
  • 자동증가: IDENTITY
  • 대괄호: [table_name]

❓ 자주 묻는 질문 (FAQ)

Q: SQL 키워드는 대문자로 써야 하나요?

A: 필수는 아니지만 강력히 권장됩니다. 대문자 키워드는 테이블명, 컬럼명과 시각적으로 구분되어 가독성이 크게 향상됩니다. 대부분의 SQL 스타일 가이드가 대문자를 권장합니다.

Q: Minify된 SQL을 사용하면 성능이 좋아지나요?

A: 네트워크 전송량은 줄어들지만, 데이터베이스 실행 성능은 동일합니다. SQL 엔진은 공백을 무시하고 실행 계획을 생성합니다. Minify는 주로 웹 애플리케이션에서 쿼리 문자열 크기를 줄일 때 사용합니다.

Q: SELECT * 를 사용하면 안 되나요?

A: 개발 중에는 괜찮지만 프로덕션에서는 피해야 합니다. 불필요한 컬럼까지 조회하여 네트워크 트래픽과 메모리를 낭비하고, 나중에 컬럼이 추가되면 예상치 못한 데이터가 포함될 수 있습니다. 필요한 컬럼만 명시하세요.

Q: JOIN과 서브쿼리 중 뭐가 더 빠른가요?

A: 상황에 따라 다릅니다. 최신 데이터베이스 옵티마이저는 둘을 비슷하게 최적화하지만, 일반적으로 JOIN이 더 명확하고 최적화하기 쉽습니다. 실행 계획(EXPLAIN)을 확인하여 판단하세요.

Q: CTE와 서브쿼리의 차이는?

A: CTE(WITH 절)는 가독성이 좋고 재사용 가능하며, 재귀 쿼리를 작성할 수 있습니다. 성능은 대부분 비슷하지만, CTE는 복잡한 쿼리를 논리적 단위로 나눠 이해하기 쉽게 만듭니다.

💡 SQL 작성 팁

  • EXPLAIN 활용: 쿼리 앞에 EXPLAIN을 붙여 실행 계획 확인
  • 인덱스 확인: SHOW INDEX로 어떤 인덱스가 있는지 파악
  • 트랜잭션 사용: 여러 쿼리를 하나의 트랜잭션으로 묶어 일관성 보장
  • 준비된 문 (Prepared Statement): SQL 인젝션 방지
  • 배치 처리: 대량 INSERT는 VALUES를 여러 개 묶어서 처리
  • 파티셔닝: 대용량 테이블은 날짜나 범위로 파티션 분할
  • 읽기 복제본: SELECT는 읽기 전용 복제본에서 실행하여 부하 분산

⚠️ 주의사항

  • SQL 인젝션 방지: 사용자 입력을 직접 쿼리에 넣지 말고 파라미터 바인딩 사용
  • 트랜잭션 롤백: 오류 발생 시 반드시 ROLLBACK 처리
  • 락 경합: UPDATE, DELETE 시 필요한 행만 잠금 (FOR UPDATE 주의)
  • N+1 문제: 루프 안에서 쿼리 실행하지 말고 JOIN 또는 IN 사용
  • 타임아웃 설정: 장시간 실행 쿼리는 타임아웃 설정으로 리소스 보호
  • 백업 확인: DROP, TRUNCATE 전에 반드시 백업 확인