SQL 포매터

SQL 쿼리를 정렬·미화·최소화합니다. 무료, 브라우저에서 처리.

  • 브라우저에서 처리
  • 데이터가 브라우저 밖으로 나가지 않습니다
  • 무료 · 회원가입 불필요
공백 두 개, 네 개 또는 탭을 고르세요. 옵션을 바꾼 뒤 “서식 지정”을 누르면 현재 쿼리에 적용됩니다.
선택하면 서식 지정과 최소화에서 인식한 키워드를 대문자로, 해제하면 소문자로 바꿉니다. 따옴표로 묶인 이름, 문자열 및 다른 식별자는 그대로 둡니다.
현재 들여쓰기와 키워드 대소문자 설정으로 입력의 서식을 지정합니다. 입력창에서 Ctrl+Enter(Mac은 ⌘+Enter)로도 실행합니다.
입력에서 SQL을 만듭니다. 보통 한 줄이 되며 -- 와 /* */ 주석, 불필요한 공백을 제거합니다. /*! */와 /*+ */는 그대로 두고, # 주석과 공백 없는 --x도 남기고 그 뒤에서 줄을 바꿉니다.
두 텍스트 칸과 상태를 지우고 대기 중인 서식 지정을 취소합니다. 들여쓰기와 키워드 옵션은 유지됩니다. 도구 안에서 Ctrl+L(Mac은 ⌘+L)로도 지웁니다.
SQL을 붙여 넣으세요. 입력을 멈추고 0.3초 뒤 자동으로 서식을 지정합니다. SQL 문법을 검사하거나 실행하지는 않습니다.
화면 밖의 내용까지 현재 출력 전체를 복사합니다.

서식이 지정된 SQL이 여기에 표시됩니다...

예시·자세한 설명·자주 묻는 질문 실제 출력이 있는 예시, 다른 도구와의 차이, 자주 묻는 질문.

Oracle ROWNUM 페이징 쿼리 정렬하기

Oracle의 ROWNUM은 쿼리가 행을 고른 순서대로 1, 2, 3…을 매기는 의사 컬럼(pseudocolumn)이고, ORDER BY보다 먼저 매겨지기 때문에 정렬한 결과에 번호를 붙이려면 서브쿼리 안에서 먼저 정렬해야 합니다(Oracle Database SQL Language Reference: ROWNUM Pseudocolumn). 아래처럼 게시판 목록의 11~20번째 글을 가져오는 쿼리는 세 겹으로 중첩되어, 한 줄로 쓰면 괄호의 짝을 찾기 어렵습니다.

select * from (select rownum as rn, b.* from (select * from board order by reg_date desc) b where rownum <= 20) where rn > 10;
SELECT
  *
FROM (
  SELECT
    rownum AS rn,
    b.*
  FROM (
    SELECT
      *
    FROM board
    ORDER BY reg_date DESC
  ) b
  WHERE rownum <= 20
)
WHERE rn > 10;

서브쿼리마다 한 단계씩 들여쓰고, 닫는 괄호는 여는 괄호가 있던 줄의 들여쓰기로 돌아갑니다. rownum은 키워드 목록에 없으므로 입력한 대로 소문자로 남습니다. rn > 10 대신 rn between 11 and 20이라고 쓰면, BETWEEN 뒤의 AND도 조건을 잇는 AND처럼 새 줄에서 시작합니다. 의미는 같지만 줄 모양이 어색해 보일 수 있습니다.

한글 컬럼명 그대로 정렬하기

PostgreSQL은 따옴표 없는 식별자에 비라틴 문자도 쓸 수 있다고 설명합니다(PostgreSQL: Lexical Structure). 그래서 가입일 같은 한글 컬럼명은 따옴표 없이도 실행됩니다. 이 도구는 이어진 유니코드 문자·숫자·_·$를 한 이름으로 읽기 때문에 한글 이름도 떨어지지 않고 그대로 남습니다.

select 이름, 가입일 from 회원 where 등급 = 'VIP';
SELECT
  이름,
  가입일
FROM 회원
WHERE 등급 = 'VIP';

이름처럼 두 글자인 이름도 한 덩어리로 남으므로, “이 컬럼에 름이라는 별칭”으로 잘못 읽힐 일이 없습니다. SQLite 3.49.1(sql.js)에서 확인하면 원래 문장과 서식을 지정한 문장이 모두 실행되고 같은 행을 돌려줍니다. 큰따옴표로 감싼 한글 이름도 그대로 정렬됩니다.

select "이름", "가입일" from "회원" where "등급" = 'VIP';
SELECT
  "이름",
  "가입일"
FROM "회원"
WHERE "등급" = 'VIP';

키워드 소문자, 탭 들여쓰기

“키워드 대문자”를 끄고 들여쓰기를 탭으로 바꾼 예입니다. 이 설정은 “서식 지정”을 누를 때 적용됩니다.

SELECT "등급", COUNT(*) AS cnt FROM "회원" GROUP BY "등급";
select
	"등급",
	count(*) as cnt
from "회원"
group by "등급";

COUNT도 소문자가 됩니다. 대소문자를 바꾸는 대상은 고정된 54개 키워드(집계 함수 COUNT, SUM, AVG, MIN, MAX 포함)뿐이고, 큰따옴표로 감싼 이름은 그대로입니다.

CTE 예시

WITH ... AS (...)의 본문은 서브쿼리처럼 들여씁니다. SUM(total) 같은 함수 호출은 한 줄에 들어가며, ROW_NUMBER() OVER (PARTITION BY ... ORDER BY ...) 같은 윈도 함수도 마찬가지입니다.

with recent as (select user_id, sum(total) as spent from orders group by user_id) select u.name, r.spent from users u join recent r on r.user_id = u.id order by r.spent desc;
WITH recent AS (
  SELECT
    user_id,
    SUM(total) AS spent
  FROM orders
  GROUP BY user_id
)
SELECT
  u.name,
  r.spent
FROM users u
JOIN recent r ON r.user_id = u.id
ORDER BY r.spent DESC;

제한 사항

  • 방언은 범용 1종류뿐이며 문법 검사를 하지 않습니다. MySQL·PostgreSQL·SQL Server 등의 모드가 없고, 잘못된 SQL도 오류 없이 서식이 지정됩니다.
  • 문자열 안의 백슬래시는 두 가지 읽기 방식 중 하나로 처리합니다. MySQL은 NO_BACKSLASH_ESCAPES가 꺼져 있으면 문자열 안의 \'를 이스케이프된 작은따옴표로 읽습니다(MySQL 8.4 String Literals). 기본값 standard_conforming_strings = on인 PostgreSQL(PostgreSQL: Lexical Structure)과 SQLite(SQLite: Literal Values)에서 백슬래시는 일반 문자입니다. 이 도구는 MySQL 방식으로 읽었을 때 모든 문자열이 닫히면 그 방식을, 닫히지 않으면 표준 방식을 씁니다. select * from users where note = 'It\'s'는 최소화한 뒤에도 SELECT * FROM users WHERE note = 'It\'s'이고, 단독으로 쓴 'C:\'도 한 문자열로 남습니다. 문자열 내용은 항상 그대로 복사하며, 읽기 방식은 문자열이 끝나는 위치만 정합니다.
  • #와 --x 뒤는 줄 끝까지 그대로 복사합니다. 그 줄의 나머지는 서식이 지정되지 않으므로 PostgreSQL의 # 연산자나 SQL Server의 #temp 테이블 이름 뒤의 키워드는 대소문자와 위치가 그대로입니다. 이 부분에서 다음 줄까지 이어지는 문자열이나 /* */ 주석이 시작되면(MySQL에서는 유효) 결과가 원문과 달라질 수 있습니다.
  • CASE는 한 줄로 유지됩니다(AND / OR 제외). CASE WHEN ... THEN ... END는 WHEN마다 줄바꿈되지 않지만, 안의 AND·OR는 WHERE에서처럼 새 줄에서 시작합니다. select case when a = 1 and b = 2 then 'x' else 'y' end as k from t의 결과입니다.
SELECT
  CASE WHEN a = 1
  AND b = 2 THEN 'x' ELSE 'y' END AS k
FROM t
  • Oracle의 대체 인용 q'[...]'는 인식하지 않습니다. select q'[it's]' from dual은 SELECT q '[it' s ] ' from dual이 되어 실행되지 않습니다. 이런 문자열은 'it''s'처럼 작은따옴표를 두 번 써서 바꾼 뒤 정렬하세요.
  • 최소화하면 -- 와 /* */ 주석이 제거되고(/*! … */와 /*+ … */는 그대로 두고, # 주석과 공백 없는 --x는 남기고 줄을 바꿉니다), 닫는 괄호 뒤의 공백도 없어집니다(예: SELECT COUNT(*)FROM events).

FAQ

어떤 SQL 방언을 지원하나요?

방언별 모드는 없고, SELECT·INSERT·UPDATE·DELETE·CREATE TABLE·JOIN·서브쿼리·CTE를 범용 SQL로 정렬합니다. 자주 쓰는 방언 문법은 그대로 남습니다. 백틱과 [대괄호] 이름, N'...'·X'...'·PostgreSQL의 E'...' 문자열, $$...$$ 달러 인용 문자열, $1·?1·:id·@id·@@session.sql_mode 같은 매개변수와 변수입니다. 문자열 안의 백슬래시는 MySQL 방식으로 읽어 모든 문자열이 닫힐 때만 이스케이프로 봅니다. 최소화하면 --와 공백으로 시작하는 주석과 일반 /* */ 주석은 지우고, MySQL의 /*! */와 옵티마이저 힌트 /*+ */는 그대로 둡니다. # 주석(MySQL)과 공백 없는 --x는 데이터베이스마다 읽는 방식이 달라 줄 끝까지 그대로 두고 그 자리에서 줄을 바꿉니다.

SQL 문법도 검사하나요?

아니요. 서식만 정리하는 도구라 문법 오류나 테이블 구조는 확인하지 않습니다. 잘못된 SQL도 오류 없이 서식이 지정됩니다.

길고 복잡한 쿼리도 정렬되나요?

됩니다. JOIN은 하나씩 줄을 나누고, 서브쿼리와 WITH ... AS (...)의 본문은 한 단계 더 들여씁니다. SUM(total)이나 ROW_NUMBER() OVER (PARTITION BY ... ORDER BY ...) 같은 함수 호출은 한 줄로 둡니다. CASE 식은 한 줄로 남고(안의 AND / OR는 새 줄에서 시작), CREATE TABLE의 열 정의도 한 줄로 남습니다.

서식 옵션을 바꿀 수 있나요?

들여쓰기(공백 2개·공백 4개·탭)와 키워드 대소문자를 고를 수 있습니다. 입력하는 동안의 자동 서식은 현재 옵션을 쓰고, 옵션을 바꾼 뒤에는 “서식 지정”을 눌러야 지금 출력에 반영됩니다.

한글 컬럼명은 따옴표로 감싸야 하나요?

이 도구에서는 따옴표로 감싸지 않아도 됩니다. 이어진 유니코드 문자·숫자·결합 문자·_·$를 한 이름으로 읽으므로 이름, 가입일 같은 한글 이름은 그대로 남고, 대소문자가 바뀌는 것은 54개 영어 키워드뿐입니다. 따옴표 없는 한글 이름을 받아들이는지는 데이터베이스에 따라 다릅니다. PostgreSQL은 비라틴 문자를, MySQL은 U+0080~U+FFFF 문자를 따옴표 없는 이름에 쓸 수 있습니다.

데이터가 서버로 전송되나요?

아니요. 쿼리는 지금 보고 있는 브라우저 탭 안에서 정렬하며, 서버로 보내지도 브라우저 저장소에 저장하지도 않습니다. “서식 지정” 또는 “최소화”를 누르면 페이지 통계에 도구 이름과 그 동작이 기록되지만 SQL 내용은 담지 않습니다.