SQL 포매터·정렬기
SQL을 20개 방언으로 정렬하거나 한 줄로 압축합니다. 키워드·식별자 대소문자, 들여쓰기, 주석 제거, Python·PHP 문자열 출력 — 100% 브라우저 처리.
1번째 줄, 1번째 칸
-- 지난달 서울 사용자와 주문 수 SELECT u.id, u.name, count(o.id) AS order_count FROM users u JOIN orders o ON o.user_id = u.id WHERE u.active = 1 AND u.city = '서울' GROUP BY u.id, u.name ORDER BY order_count DESC;
🔒 브라우저에서 정렬되며 업로드되지 않습니다.
정렬(beautify)과 압축(minify), 20개 방언
쿼리를 붙여넣거나 .sql 파일(최대 5MB)을 열면 입력하는 즉시 결과가 갱신됩니다 — 따로 실행 버튼을 누를 필요가 없습니다. 정렬은 일관된 들여쓰기와 주요 절(SELECT·FROM·JOIN·WHERE·GROUP BY·ORDER BY) 앞의 줄바꿈을 넣습니다. 압축은 쿼리를 한 줄로 만듭니다. 주석이 사라지고 문자열 리터럴 바깥의 연속 공백이 한 칸으로 줄어들 뿐, 토큰의 순서나 내용은 그대로입니다. PostgreSQL의 $$…$$ 본문이나 MySQL의 백슬래시 이스케이프도 쓴 그대로 남습니다. 정렬은 널리 쓰이는 sql-formatter 엔진이 담당하며, 그 엔진이 아는 20개 방언을 모두 고를 수 있습니다: 표준 SQL, MySQL, MariaDB, PostgreSQL, SQLite, SQL Server(T-SQL), Oracle PL/SQL, BigQuery, Amazon Redshift, Snowflake, IBM DB2(LUW), IBM DB2 for i, Apache Hive, Spark SQL, Trino/Presto, ClickHouse, DuckDB, TiDB, SingleStore, Couchbase N1QL. 방언은 배치만 정하지 않습니다. 주석 기호도 해당 방언의 렉서에서 읽어오므로 BigQuery·MySQL의 #와 Snowflake의 //는 주석이 되고, PostgreSQL의 #는 연산자로 남습니다.
서식의 모든 요소가 옵션
키워드와 식별자는 각각 대문자·소문자·첫 글자만 대문자·원본 유지 중에서 고를 수 있고, 문자열 리터럴의 대소문자는 절대 바뀌지 않습니다. 들여쓰기는 스페이스 2칸·4칸·탭, 방식은 표준·키워드 왼쪽 정렬·키워드 오른쪽 정렬입니다. 주석 제거는 기본이 꺼짐이라 요청하지 않으면 아무것도 지우지 않습니다. 켜더라도 문자열 안의 주석 기호는 건드리지 않고, 지운 주석이 차지하던 줄바꿈은 남겨 아래 줄의 줄 번호가 밀리지 않습니다. 입력창 아래에는 커서 위치가 3번째 줄, 12번째 칸처럼 실시간으로 표시되고, 파서가 쿼리를 읽지 못하면 몇 번째 줄 몇 번째 칸에서 멈췄는지 한국어 한 문장으로 알려줍니다.
결과 가져가기
출력은 SQL 그대로, 또는 코드에 바로 붙여넣을 수 있는 Python·PHP 문자열 리터럴로 받을 수 있습니다. 한 줄씩 따옴표로 묶이고 줄바꿈은 리터럴 안에 이스케이프로 들어가며, 따옴표·백슬래시와 PHP의 $도 이스케이프됩니다. 복사하거나 내려받을 수 있고, monthly.sql을 열었다면 결과는 monthly.sql·monthly.py·monthly.php로, 그냥 붙여넣은 쿼리는 formatted.sql·minified.sql·query.py·query.php로 저장됩니다.
정렬이 중요한 이유
읽기 좋은 SQL은 검토·디버깅·인수인계가 쉽습니다. 잘 들여쓴 쿼리는 어떤 조건이 어느 절에 속하는지, 조인이나 서브쿼리가 어디서 시작하고 끝나는지 한눈에 보여, 잘못 놓인 AND나 빠진 GROUP BY 열 같은 실수를 잡는 데 도움이 됩니다. 일관된 서식은 코드 리뷰와 버전 관리 diff도 더 작고 명확하게 만듭니다. 모든 처리가 브라우저에서 이뤄지므로 실제 테이블·열 이름이 담긴 쿼리도 기기를 벗어나지 않습니다.
자주 묻는 질문
어떤 SQL 방언을 지원하나요?
sql-formatter 엔진이 아는 20개 전부입니다: 표준 SQL, MySQL, MariaDB, PostgreSQL, SQLite, SQL Server(T-SQL), Oracle PL/SQL, BigQuery, Amazon Redshift, Snowflake, IBM DB2(LUW), IBM DB2 for i, Apache Hive, Spark SQL, Trino/Presto, ClickHouse, DuckDB, TiDB, SingleStore, Couchbase N1QL. 방언 선택은 배치뿐 아니라 주석 판정에도 쓰입니다. 주석 기호를 해당 방언의 렉서에서 읽어오므로 BigQuery·MySQL의 #와 Snowflake의 //는 주석, PostgreSQL의 #는 연산자로 처리됩니다.
쿼리의 동작이 바뀌나요?
정렬은 공백과 키워드 대소문자만, 압축은 공백과 주석만 건드립니다. 토큰의 순서나 내용은 바뀌지 않고 문자열 리터럴은 그대로 복사되므로 쿼리는 이전과 똑같이 실행됩니다. 다만 직접 고르면 텍스트가 바뀌는 옵션이 둘 있습니다. '주석 제거'는 주석을 지우고, '식별자' 대소문자 옵션은 따옴표 없는 테이블·열 이름의 대소문자를 바꿉니다 — 이름의 대소문자를 구분하는 환경에서는 의미가 달라질 수 있으니 확신이 없으면 '그대로'로 두세요.
SQL이 서버로 전송되나요?
아니요. 정렬은 전적으로 브라우저에서 이뤄집니다. 테이블·열 이름을 포함한 쿼리는 기기를 벗어나지 않으며 저장되지 않습니다.
쿼리를 한 줄로 압축할 수도 있나요?
네. 모드를 압축(minify)으로 바꾸면 주석이 제거되고 문자열 리터럴 바깥의 연속 공백이 한 칸으로 줄어듭니다. 그 밖에는 아무것도 움직이지 않아 PostgreSQL의 $$…$$ 본문, MySQL의 백슬래시 이스케이프, 따옴표 안의 공백은 그대로 남습니다. 압축은 토큰을 다시 쓰지 않으므로 대소문자·들여쓰기 옵션은 이 모드에서 적용되지 않습니다.
결과를 Python·PHP 문자열로 받을 수 있나요?
네. 출력 형식을 Python 문자열 또는 PHP 문자열로 바꾸면 코드에 바로 붙여넣을 수 있는 리터럴이 나옵니다. 한 줄씩 따옴표로 묶이고 따옴표·백슬래시는 이스케이프되며 PHP에서는 $도 이스케이프됩니다. 내려받는 파일 이름도 query.py·query.php(또는 연 파일 이름에 해당 확장자)로 따라갑니다.
.sql 파일을 열어서 쓸 수 있나요?
네. '파일 열기'로 .sql 또는 .txt 파일을 최대 5MB까지 불러오며, 브라우저에서 직접 읽으므로 업로드되지 않습니다. 이어지는 다운로드는 그 파일 이름을 따라가서 monthly.sql을 열면 monthly.sql로 저장됩니다(출력 형식을 바꿨다면 monthly.py·monthly.php).
'첫 글자만 대문자' 옵션은 어떻게 동작하나요?
해당 종류의 단어를 Select·From처럼 첫 글자만 대문자로 씁니다. 엔진에는 이런 설정이 없어서 도구가 유도합니다 — 같은 쿼리를 대문자판과 소문자판으로 두 번 정렬한 뒤, 두 결과가 서로 다른 단어만 첫 글자를 올립니다. 그래서 키워드와 식별자 모두에 정확하고, 이름·숫자·문자열 리터럴은 건드리지 않습니다.
쿼리를 해석하지 못하면 어떻게 되나요?
라이브러리의 영어 문법 목록 대신, 파서가 멈춘 줄과 칸을 짚는 한 문장이 한국어로 표시됩니다. 입력창 아래의 '몇 번째 줄, 몇 번째 칸' 표시를 보며 커서를 옮기면 그 위치를 바로 찾을 수 있습니다.