간단한 쿼리 정리
select id,name from users where active=true order by created_at desc limit 10SELECT id, nameFROM usersWHERE active = trueORDER BY created_at DESCLIMIT 10;각 절이 자기 줄로 떨어지고 컬럼 목록이 들여쓰기되어 있습니다. 코드 리뷰에서 이 쿼리를 검토하기가 10배는 쉬워졌죠.
구문을 인식한 들여쓰기로 SQL 쿼리를 정리.
마지막 업데이트
SQL 포매터는 한 줄로 길게 늘어선 쿼리나 ORM이 자동 생성한 SQL을 일관된 들여쓰기와 줄바꿈으로 다시 써줍니다. 조인을 검토할 때, 필터 조건을 디버깅할 때, ORM 출력 결과를 정리할 때, 티켓이나 문서에 쿼리를 공유할 때, 또는 실행 계획을 한 줄씩 따라가며 분석할 때 자주 쓰입니다.
포매팅은 쿼리가 *하는 일*을 바꾸지 않습니다. 사람이 읽기 편한 형태로 모양만 다듬을 뿐이죠. 레이아웃이 일정해지면 SELECT, FROM, JOIN, WHERE, GROUP BY, HAVING, ORDER BY가 어떻게 엮여 있는지 훨씬 쉽게 파악할 수 있습니다. 특히 서브쿼리와 CTE가 섞인 복잡한 쿼리에서 효과가 큽니다.
SQL은 *방언(dialect)*이 많습니다. PostgreSQL, MySQL, SQLite, T-SQL(Microsoft SQL Server), Oracle, BigQuery 모두 표준 위에 자기들만의 문법을 얹어 놓았죠. 좋은 포매터는 선택한 방언을 이해해서 벤더 고유 문법을 망가뜨리지 않습니다.
SELECT은 컬럼을 고르고, FROM은 테이블을 지정하며, WHERE는 행을 걸러내고, GROUP BY는 묶고, ORDER BY는 정렬합니다.RETURNING, LIMIT, TOP, 그리고 식별자 인용 방식([col] vs "col")은 DB마다 호환되지 않습니다.입력창에 SQL을 그대로 붙여 넣으세요. 한 줄짜리, ORM이 만든 것, 일부만 정리된 SQL 모두 잘 처리됩니다.
PostgreSQL, MySQL, SQLite, T-SQL 중에 골라야 LIMIT, TOP, RETURNING 같은 벤더별 키워드를 망가뜨리지 않고 정리할 수 있습니다.
키워드 대소문자(대문자가 표준)와 들여쓰기 폭(2칸 또는 4칸)을 선택하세요. 대부분의 팀은 키워드 대문자 + 2칸 들여쓰기를 씁니다.
각 절은 자기 줄에 자리 잡고, 조인은 정렬되며, 서브쿼리는 들여쓰기됩니다. 주석도 그대로 남아 있습니다.
정리된 쿼리를 마이그레이션, ORM의 raw 쿼리, BI 도구 등에 붙여 넣으면 됩니다. 모든 처리는 브라우저 안에서만 이루어집니다.
SELECT 쿼리의 95%에서 만나는 절들을, 개념적으로 처리되는 순서대로 정리했습니다. 공식 문서: PostgreSQL SELECT, MySQL SELECT.
| 절 | 역할 | 예시 |
|---|---|---|
SELECT | 반환할 컬럼/표현식을 지정 | SELECT id, name |
FROM | 원본 테이블을 지정 | FROM users |
JOIN ... ON | 다른 테이블의 행과 결합 | JOIN orders ON orders.user_id = users.id |
WHERE | 그룹화 전에 행을 필터링 | WHERE active = true |
GROUP BY | 값이 같은 행끼리 묶어서 집계 | GROUP BY country |
HAVING | 집계된 그룹에 대한 필터 | HAVING COUNT(*) > 10 |
ORDER BY | 결과 정렬 | ORDER BY created_at DESC |
LIMIT / OFFSET | 결과 페이지네이션 | LIMIT 20 OFFSET 40 |
WITH ... AS | CTE — 서브쿼리에 이름 붙이기 | WITH active AS (...) |
select id,name from users where active=true order by created_at desc limit 10SELECT id, nameFROM usersWHERE active = trueORDER BY created_at DESCLIMIT 10;각 절이 자기 줄로 떨어지고 컬럼 목록이 들여쓰기되어 있습니다. 코드 리뷰에서 이 쿼리를 검토하기가 10배는 쉬워졌죠.
select u.name,o.total from users u join orders o on o.user_id=u.id where o.total>100SELECT u.name, o.totalFROM users uJOIN orders o ON o.user_id = u.idWHERE o.total > 100;테이블에 별칭(users u, orders o)을 붙이면 컬럼 목록이 짧아집니다. JOIN ... ON 줄을 따로 띄우면 두 테이블의 관계가 한눈에 보입니다.
select * from users where id in (select user_id from enrollments where course_id=5)SELECT *FROM usersWHERE id IN ( SELECT user_id FROM enrollments WHERE course_id = 5);안쪽 쿼리를 들여쓰기하면 의존 관계가 분명해집니다. 구조가 눈에 보이고 나면, 많은 서브쿼리는 JOIN이나 CTE로 다시 쓸 수 있다는 사실도 함께 보이게 되죠.
LIMIT 10, T-SQL의 TOP 10, 표준 SQL의 FETCH FIRST 10 ROWS ONLY는 같은 일을 하지만 서로 호환되지 않습니다.SELECT, FROM, WHERE)는 대문자, 식별자는 소문자를 권장합니다. 시각적인 대비 덕분에 쿼리 구조가 더 잘 보이거든요. 어떤 스타일을 쓰든 일관성만 유지하면 됩니다.