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로 옮길 때 자주 걸리는 부분만 모았습니다.

동작MySQLPostgreSQLOracleSQL Server
행 수 제한LIMIT 10LIMIT 10FETCH FIRST 10 ROWS ONLYTOP 10
문자열 연결CONCAT(a, b)a || ba || ba + b
현재 시각NOW()NOW()SYSDATEGETDATE()
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 괄호 누락ANDOR보다 우선순위가 높아 의도와 다른 조건이 됩니다.
  • 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 쿼리도 그대로 붙여넣어 사용할 수 있습니다.

주석이 포함된 쿼리도 유지되나요?

한 줄 주석(--)과 블록 주석(/* */) 모두 그대로 보존됩니다. 다만 주석 위치에 따라 줄바꿈 결과가 달라질 수 있으니 결과를 확인해 주세요.

포맷팅한 쿼리를 그대로 실행해도 되나요?

줄바꿈과 들여쓰기, 키워드 대소문자만 바뀌므로 실행 결과는 동일합니다. 다만 대소문자를 구분하는 설정(예: 일부 환경의 테이블명)에서는 키워드 대문자 옵션 적용 후 한 번 확인하는 것을 권장합니다.

관련 도구

광고