SQL 포맷터
📋 포맷/변환SQL 쿼리를 키워드별로 줄바꿈하고 들여쓰기하여 가독성을 높입니다.
🗃️ SQL 포맷터란?
복잡한 SQL 쿼리를 키워드 기준으로 자동 정렬합니다. SELECT, FROM, WHERE, JOIN 등 주요 키워드별로 줄바꿈과 들여쓰기를 적용해 구조를 명확히 보여줍니다.코드 리뷰, 쿼리 최적화, 문서화, 팀 협업 시 일관된 스타일 유지에 필수.MySQL/PostgreSQL/Oracle/SQL Server 등 표준 SQL을 지원합니다.
🔧 포맷팅 옵션
키워드 대문자
SELECT, WHERE 등 키워드를 대문자로 변환
자동 줄바꿈
주요 키워드 앞에서 자동으로 줄바꿈
들여쓰기
컬럼 목록, 서브쿼리 등에 들여쓰기 적용
압축 (Minify)
모든 공백 제거하여 한 줄로 변환
📄 포맷팅 전후 비교
ORM이 생성했거나 로그에서 긁어온 쿼리는 대부분 한 줄로 붙어 있습니다. 아래는 주문 테이블에서 최근 30일 결제 완료 건을 집계하는 실제 형태의 쿼리를 정렬한 예시입니다.
입력 (한 줄)
select o.id, u.name, sum(oi.price*oi.qty) total from orders o inner join users u on u.id=o.user_id left join order_items oi on oi.order_id=o.id where o.status='PAID' and o.created_at >= now() - interval 30 day group by o.id, u.name having total > 10000 order by total desc limit 50
출력 (정렬본)
SELECT
o.id,
u.name,
SUM(oi.price * oi.qty) total
FROM orders o
INNER JOIN users u
ON u.id = o.user_id
LEFT JOIN order_items oi
ON oi.order_id = o.id
WHERE o.status = 'PAID'
AND o.created_at >= NOW() - INTERVAL 30 DAY
GROUP BY o.id, u.name
HAVING total > 10000
ORDER BY total DESC
LIMIT 50정렬본에서는 JOIN이 몇 개인지, 어떤 조건이 WHERE에 걸려 있는지가 한눈에 들어옵니다. 쿼리 튜닝은 실행 계획을 보기 전에 구조부터 파악하는 일이라, 이 단계에서 이미 절반이 끝납니다.
🗄️ DBMS별 문법 차이
같은 동작이라도 DBMS마다 키워드가 다릅니다. 정렬된 쿼리를 다른 DB로 옮길 때 자주 걸리는 부분만 모았습니다.
| 동작 | MySQL | PostgreSQL | Oracle | SQL Server |
|---|---|---|---|---|
| 행 수 제한 | LIMIT 10 | LIMIT 10 | FETCH FIRST 10 ROWS ONLY | TOP 10 |
| 문자열 연결 | CONCAT(a, b) | a || b | a || b | a + b |
| 현재 시각 | NOW() | NOW() | SYSDATE | GETDATE() |
| NULL 대체 | IFNULL(a, b) | COALESCE(a, b) | NVL(a, b) | ISNULL(a, b) |
| 식별자 인용 | `col` | "col" | "col" | [col] |
💡 SQL 스타일 가이드
- 키워드는 대문자, 테이블/컬럼명은 소문자 권장
- JOIN은 명시적으로 (
INNER JOIN,LEFT JOIN등) SELECT절의 각 컬럼은 새 줄에 작성WHERE조건은 AND/OR별로 줄바꿈- 테이블 별칭은 의미 있게 —
a,b보다o(orders),u(users) - 콤마는 줄 끝에 붙이는 방식이 일반적이지만, 팀 컨벤션이 우선입니다
⚠️ 정렬하면 바로 보이는 실수들
쿼리가 한 줄로 뭉쳐 있으면 놓치기 쉬운데, 줄바꿈만 넣어도 눈에 띄는 문제들입니다.
- LEFT JOIN인데 WHERE에 조건을 건 경우 — 결과적으로 INNER JOIN이 되어 행이 사라집니다. 조건은
ON절로 옮겨야 합니다. - AND/OR 괄호 누락 —
AND가OR보다 우선순위가 높아 의도와 다른 조건이 됩니다. - GROUP BY 누락 컬럼 — SELECT에는 있는데 GROUP BY에 빠진 컬럼. MySQL은 넘어가지만 PostgreSQL은 에러입니다.
- 중복 JOIN — 같은 테이블을 두 번 조인해 행이 배수로 부풀어 있는 경우.
- 인덱스를 못 타는 WHERE — 컬럼에 함수를 씌운 조건(
DATE(created_at) = ...)은 인덱스를 무시합니다.
💡 실무 팁
슬랙·티켓에 쿼리 공유할 땐 정렬본을, 코드/로그에 임베드할 땐 압축본을 사용하세요. 상황에 맞는 포맷이 리뷰 시간을 절반으로 줄입니다.
자주 묻는 질문
DBMS별로 문법 차이가 있는데 호환되나요?▼
표준 SQL(ANSI SQL) 기준으로 포맷팅합니다. LIMIT(MySQL), TOP(SQL Server), ROWNUM(Oracle) 등 DBMS 고유 문법도 대부분 지원합니다.
복잡한 서브쿼리도 포맷팅되나요?▼
네, 서브쿼리도 계층적으로 들여쓰기됩니다. 다만 매우 복잡한 쿼리는 수동 조정이 필요할 수 있습니다.
압축(Minify)은 언제 사용하나요?▼
로그 기록, 네트워크 전송, 코드 난독화 등 쿼리 크기를 줄여야 할 때 사용합니다. 가독성보다 효율이 중요한 경우입니다.
입력한 쿼리가 서버로 전송되나요?▼
아니요. 포맷팅은 브라우저 안에서만 처리되며 쿼리 내용이 서버로 전송되거나 저장되지 않습니다. 운영 DB 쿼리도 그대로 붙여넣어 사용할 수 있습니다.
주석이 포함된 쿼리도 유지되나요?▼
한 줄 주석(--)과 블록 주석(/* */) 모두 그대로 보존됩니다. 다만 주석 위치에 따라 줄바꿈 결과가 달라질 수 있으니 결과를 확인해 주세요.
포맷팅한 쿼리를 그대로 실행해도 되나요?▼
줄바꿈과 들여쓰기, 키워드 대소문자만 바뀌므로 실행 결과는 동일합니다. 다만 대소문자를 구분하는 설정(예: 일부 환경의 테이블명)에서는 키워드 대문자 옵션 적용 후 한 번 확인하는 것을 권장합니다.