📊 SQL Formatter
SQL 쿼리를 읽기 쉽게 포맷팅하고 최적화
🗄️ 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 구조 설명 시 명확한 예시 제공
- 마이그레이션: 데이터베이스 스키마 변경 스크립트 정리
🔧 사용 방법
- SQL 입력: 포맷하려는 SQL 쿼리를 입력 영역에 붙여넣기
- Format 버튼: 자동으로 들여쓰기와 줄바꿈 적용
- Minify 버튼: 모든 공백과 줄바꿈 제거하여 압축
- 데이터베이스 선택: MySQL, PostgreSQL, Oracle 등 문법에 맞게 변환
- 복사: 포맷된 결과를 클릭하여 클립보드에 복사
📚 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 < 50WHERE price>100 AND quantity<504. 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_idFROM 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 전에 반드시 백업 확인