도구
가이드

SQL 포매터

포맷

sql-formatter로 다양한 방언(MySQL, PostgreSQL, T-SQL 등)의 SQL을 포맷하거나 축소합니다.

100% 클라이언트 백엔드 없음
SQL
출력
이 페이지에서

SQL 포매터란?#

SQL 포매터는 엔진을 위해 쓰인 쿼리 — 흔히 한 줄에 욱여넣어지거나, 로그에서 무작위 들여쓰기로 복사된 — 를 사람을 위해 쓰인 쿼리로 바꿉니다. 키워드는 제 줄에 놓이고, 컬럼이 정렬되며, 서브쿼리는 한 단계 들여쓰기 되고, AND 조건 다섯 개를 가진 WHERE 절은 더 이상 텍스트의 벽이 아닙니다. 반대 연산인 압축은 쿼리가 설정 파일이나 API 매개변수로 옮겨야 할 때 그 모든 공백을 다시 한 줄로 붕괴시킵니다.

SQL 포매팅이 까다로운 이유는 모든 데이터베이스가 자기만의 방언을 가졌기 때문입니다. RETURNING 이 있는 Postgres 쿼리, 백틱으로 인용된 식별자가 있는 MySQL 쿼리, TOP (n) 이 있는 SQL Server 쿼리, 구조체와 배열 리터럴이 있는 BigQuery 쿼리는 모두 다르게 보이며, 보편적 SQL이 하나 있다고 가정하는 포매터는 구석 사례를 은근히 틀립니다. 이 페이지는 sql-formatter 와 명시적인 방언 선택 으로 이를 처리합니다. 표준 SQL, MySQL, MariaDB, PostgreSQL, SQLite, T-SQL, PL/SQL, BigQuery, Redshift, Snowflake, DB2, Trino입니다. 데이터베이스가 실제로 쓰는 것을 고르면, 포매터가 그에 맞게 파싱합니다.

사용 방법#

  1. 왼쪽의 SQL 패널에 쿼리를 붙여넣거나, 예제 를 눌러 짧은 예시를 불러오세요.
  2. 도구 모음에서 방언 을 고르세요. 여러분 데이터베이스의 방언입니다. 기본 sql 은 안전한 일반적 버전이며, 쿼리가 방언 특유의 문법을 쓸 때 postgresql, mysql, tsql 등으로 전환하세요.
  3. 들여쓰기 를 고르세요. 2, 4, 또는 . 긴 컬럼 목록을 읽기 쉽게 유지하므로 SQL에서는 공백 4칸이 흔합니다.
  4. 동작 버튼을 누르세요.
    • 서식 — 다시 들여쓰기하고, 논리적 줄로 쿼리를 나누며, 기본적으로 키워드를 대문자로 해 SELECT, FROM, WHERE 가 식별자와 구분되게 합니다.
    • 압축-- 줄 주석과 /* */ 블록 주석을 벗기고, 모든 공백 연속을 단일 공백으로 붕괴시킵니다. 줄바꿈은 공백이 되며, 이는 SQL 문이 줄바꿈이 아니라 세미콜론에서 끝나므로 안전합니다.
  5. 출력 패널에서 결과를 읽으세요. 복사 로 가져가고, 지우기 로 양쪽 패널을 초기화합니다.

주요 기능#

  • 열두 가지 방언. MySQL, MariaDB, PostgreSQL, SQLite, T-SQL, PL/SQL, BigQuery, Redshift, Snowflake, DB2, Trino, 그리고 일반 표준 SQL. 포매터의 문법이 맞춰 바뀌어 방언 특유의 키워드가 올바른 자리에 놓입니다.
  • 키워드 대소문자. 서식은 기본적으로 키워드를 대문자로(selectSELECT 가 되도록) 하고 식별자는 그대로 둡니다. 순전히 외양을 다루며 쿼리가 하는 일을 결코 바꾸지 않습니다.
  • 안전한 압축. 공백은 단일 공백으로 붕괴됩니다. SQL은 세미콜론으로 끝나므로, 줄을 합치는 것이 줄바꿈에 민감한 언어에서처럼 두 문장을 하나로 융합할 수 없습니다.
  • 압축 시 주석 제거. 압축할 때 --/* */ 주석이 모두 제거되어 페이로드를 타이트하게 유지합니다.
  • 두 패널, 복사 준비 완료, 완전한 클라이언트 사이드. 포매터는 브라우저에서 실행되며, 쿼리는 어디로도 전송되지 않습니다.

실전 예시#

한 줄에 내뱉어진 보고 쿼리로, 주석과 조인, GROUP BY 가 있습니다.

입력:

select u.id,u.name,count(o.id) as orders from users u join orders o on o.user_id=u.id where u.status='active' and o.created_at >= '2026-01-01' group by u.id,u.name order by orders desc

방언을 postgresql 로 고르고, 서식2 칸으로 누르면:

SELECT
  u.id,
  u.name,
  count(o.id) AS orders
FROM
  users u
  JOIN orders o ON o.user_id = u.id
WHERE
  u.status = 'active'
  AND o.created_at >= '2026-01-01'
GROUP BY
  u.id,
  u.name
ORDER BY
  orders DESC

이제 모든 절이 제 줄을 가지고, 조인 조건이 보이며, 두 WHERE 술어가 나뉘어 날짜 필터가 > 가 아니라 >= 라는 것을 한눈에 알 수 있습니다. 키워드 대소문자는 대문자로 갔고 컬럼 이름은 쓰인 그대로 남았습니다. 같은 입력에서 압축 을 누르면 한 줄 형태를 다시 얻어, 설정이나 ?query= 매개변수에 붙여넣을 준비가 됩니다.

select u.id,u.name,count(o.id) as orders from users u join orders o on o.user_id=u.id where u.status='active' and o.created_at >= '2026-01-01' group by u.id,u.name order by orders desc

FAQ#

어느 방언을 골라야 하나요?#

여러분 데이터베이스에 맞추세요. 확신이 서지 않으면 일반 sql 이 합리적인 출발점이며 흔한 절들을 올바로 처리합니다. 쿼리가 일반 문법이 예상하지 못하는 문법을 쓸 때 특정 방언으로 전환하세요. RETURNING (Postgres), 백틱 식별자(MySQL), TOP (n) (T-SQL), 구조체/배열 리터럴(BigQuery). 잘못된 방언을 골라도 보통은 포맷되지만, 생소한 키워드를 잘못된 자리에 놓을 수 있습니다.

왜 서식은 키워드는 대문자로 하지만 컬럼 이름은 그러지 않나요?#

키워드를 대문자로 하는 것은 의미를 결코 바꾸지 않는 가독성 관례이기 때문입니다. SELECTselect 는 엔진에 동일합니다. 반면 식별자는 대소문자를 구분할 수 있습니다(Postgres는 따옴표 없는 식별자를 소문자로 접고, MySQL은 일부 플랫폼에서 대소문자를 구분합니다). 식별자를 그대로 두는 것이 안전한 기본값입니다. 키워드를 소문자로 선호한다면, 쿼리를 포맷한 뒤 수동으로 한 번 더 손보세요.

압축은 다중 문 스크립트를 보존하나요?#

각 공백 연속을 단일 공백(줄바꿈 포함)으로 붕괴시키지만, 세미콜론은 정확히 있던 자리에 둡니다. 그래서 SELECT 1; SELECT 2;; 로 구분된 두 문장으로 남습니다. 그렇지만, 문장이 많은 긴 마이그레이션 스크립트에서는 한 줄로 압축된 형태가 읽기도, 디버그하기도 어렵습니다. 압축은 단일 쿼리나 짧은 배치에 어울립니다.

제 쿼리는 어디로 업로드되나요?#

어디로도 업로드되지 않습니다. 포매터는 페이지에 꾸려 넣어져 브라우저에서 로컬로 실행됩니다. 테이블 이름도, 리터럴도, SQL에 관한 어떤 것도 탭을 떠나지 않습니다.