SQL 포맷터 · 정리 · 압축

로그에 찍힌 쿼리나 ORM이 만든 긴 SQL을 붙여넣으면 읽기 좋게 정리합니다. 서브쿼리는 괄호 깊이에 따라 들여쓰고, 반대로 정리된 쿼리를 한 줄로 압축할 수도 있습니다.

SQL 포맷터 · 정리 · 압축모두의계산기

정리 규칙

토큰 단위로 나눈 뒤 SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY, LIMIT, INSERT INTO, VALUES, UPDATE, SET, DELETE, CREATE, WITH, UNION 같은 주요 절 키워드 앞에서 줄을 바꿉니다. JOIN 계열은 FROM과 같은 깊이에 두고, 조건의 AND·OR는 한 단계 들여쓴 새 줄로 시작합니다. 괄호 안에 SELECT가 나오면 서브쿼리로 보고 괄호 깊이만큼 들여쓰며, 함수 호출의 괄호(COUNT(*))는 줄을 바꾸지 않습니다. CASE … WHEN … END는 WHEN·ELSE마다 줄을 바꿉니다. BETWEEN a AND b의 AND는 조건 연결이 아니므로 줄을 바꾸지 않습니다.

문자열·주석·식별자 보호

작은따옴표 문자열, 큰따옴표와 백틱으로 감싼 식별자, 대괄호 식별자(SQL Server), $$ 블록(PostgreSQL)은 하나의 토큰으로 취급해 내부를 절대 바꾸지 않습니다. 키워드 대문자 변환은 문자열 안의 "select"에는 적용되지 않습니다. -- 줄 주석과 /* */ 블록 주석도 보존되며, 압축 모드에서는 주석만 제거합니다.

키워드 대소문자

SQL 키워드는 대소문자를 구분하지 않으므로 스타일 문제입니다. 대문자는 키워드와 식별자를 눈으로 구분하기 쉽고, 소문자는 타이핑이 편합니다. 변환 대상은 내장 키워드 목록에 있는 단어뿐이므로 name, user_id 같은 컬럼명은 바뀌지 않습니다. 다만 date, key, index처럼 키워드와 같은 이름의 컬럼은 함께 바뀔 수 있습니다. 이런 컬럼은 따옴표나 백틱으로 감싸면 보호됩니다.

한계

문법 검사를 하지 않으므로 잘못된 SQL도 형식만 맞춰 출력합니다. 저장 프로시저·트리거의 BEGIN…END 블록, PL/pgSQL, 복잡한 윈도 함수 절은 기본 규칙으로만 처리되어 손으로 다듬어야 할 수 있습니다. 방언별 특수 문법(MySQL의 ON DUPLICATE KEY UPDATE, PostgreSQL의 ON CONFLICT, RETURNING)은 절 키워드로 인식합니다.

자주 묻는 질문

컬럼명이 대문자로 바뀌었어요.

date, key, index, count처럼 키워드와 같은 이름의 컬럼은 변환 대상이 됩니다. "그대로" 옵션을 쓰거나 컬럼명을 백틱·큰따옴표로 감싸면 유지됩니다.

여러 쿼리를 한 번에 넣어도 되나요?

예. 세미콜론마다 문장을 나누어 빈 줄로 구분합니다.

압축하면 실행 결과가 달라지나요?

주석을 제거하고 공백을 줄일 뿐이라 의미는 같습니다. 단, 주석 안에 옵티마이저 힌트(/*+ … */)가 있는 경우 힌트도 사라지니 주의하세요.

함께 보기