SQL 포맷

예쁘게 만들기 및 SQL 쿼리 포맷. 여러 방언. 완전 무료.
SQL 방언
입력 SQL
포맷된 SQL
입력 SQL

비공개 및 보안

모든 것이 브라우저에서 발생합니다. 파일은 서버에 닿지 않습니다.

엄청나게 빠른

업로드도, 기다림도 없습니다. 파일을 놓는 순간 변환하세요.

정말로 무료

계정이 필요 없습니다. 숨겨진 비용이 없습니다. 파일 크기 트릭이 없습니다.

SQL(Structured Query Language)은 지구상의 거의 모든 진지한 관계형 데이터베이스에서 사용되는 공통 언어입니다— PostgreSQL, MySQL, SQLite 부터 SQL Server 및 Oracle과 같은 상용 시스템까지. 데이터 구조를 정의하고, 데이터를 저장하며, 효율적으로 쿼리하고, 해당 데이터의 동작에 대한 규칙을 강제할 수 있습니다.

다음은 SQL에 대한 약 2,500단어의 심층적인 투어입니다: SQL이 무엇인지, 어떻게 작동하는지, 실제 시스템에서 어떻게 잘 사용하는지.

1. SQL이란 무엇인가(그리고 왜 여전히 중요한가)

SQL은 선언형 언어입니다: 어떤 데이터를 원하는지 설명하고, 데이터베이스가 어떻게 가져올지 결정합니다. W3Schools의 SQL 가이드 W3Schools.in의 SQL 시리즈 와 같은 튜토리얼은 SQL을 많은 데이터베이스 엔진에서 데이터를 저장, 조작 및 검색하기 위한 표준 언어로 소개합니다.

SQL이 표준화되어 널리 지원되기 때문에 동일한 정신 모델을 다음에 사용할 수 있습니다:

  • MySQL 또는 PostgreSQL의 웹 애플리케이션
  • SQLite 를 사용하는 임베디드 애플리케이션
  • SQL Server 또는 Oracle과 같은 엔터프라이즈 시스템

대부분의 일상적인 비즈니스 데이터—주문, 사용자, 결제, 로그, 분석—는 결국 SQL로 쿼리할 수 있는 테이블에 저장됩니다.

2. SQL 표준 및 방언

SQL은 ISO/IEC 9075 표준 패밀리에 의해 표준화되어 있으며, 핵심 언어와 많은 선택적 확장을 정의합니다. 표준은 SQL-86, SQL-92, SQL:1999, SQL:2003부터 SQL:2023까지 발전해 왔습니다. SQL 표준 ISO/IEC 9075:2023 에 대한 ANSI의 개요와 같은 기사는 ANSI 및 ISO 표준이 시간이 지남에 따라 어떻게 정렬되는지 설명합니다.

표준 자체는 여러 부분으로 나뉩니다:

  • 파트 1(Framework)파트 2(Foundation)
  • 파트 3(Call-Level Interface) (API용)
  • 파트 4(Persistent Stored Modules) (저장 프로시저용)
  • SQL/XML, SQL/MED, 심지어 속성 그래프 쿼리를 위한 SQL/PGQ와 같은 후속 파트

전체 목록은 SQL의 ISO 카탈로그 페이지 Modern SQL의 표준 파트 분해 와 같은 리소스에서 확인할 수 있습니다.

실제로 각 데이터베이스는 자체 방언을 구현합니다:

  • PostgreSQL은 고급 데이터 유형 및 전체 텍스트 검색과 같은 확장 기능을 추가하며, PostgreSQL 매뉴얼 에 문서화되어 있습니다.
  • MySQL은 SQL 문 함수 의 자체 변형을 가지고 있습니다.
  • SQLite는 일부 고유한 동작을 가진 SQL의 상당한 부분 집합을 지원하며, SELECT 문서 에 자세히 설명되어 있습니다.

핵심 개념—테이블, 행, 열, 조인, 집계—는 이식 가능하지만, 사소하지 않은 시스템은 특정 방언의 특성과 기능을 학습하는 것을 포함합니다.

3. 관계형 기초: 테이블, 행, 키

핵심에서 SQL은 관계형 모델을 중심으로 설계되었습니다: 데이터는 테이블(관계)에 존재하며, 각 행은 사실을 나타내고 각 열은 속성을 설명합니다.

일반적인 요소는 다음과 같습니다:

  • 테이블: 예: customers, orders
  • : 예: id, name, order_date, total_amount
  • 기본 키: 각 행에 대한 고유 식별자(종종 id)
  • 외래 키: 다른 테이블의 기본 키를 참조하는 열(예: orders.customer_idcustomers.id)

정규화 가이드— DigitalOcean의 정규화 튜토리얼 또는 freeCodeCamp의 1NF, 2NF, 3NF 설명—는 데이터를 잘 구조화된 테이블로 분할하고 키로 연결하여 중복을 최소화하고 업데이트 이상을 방지하는 것을 좋은 관계형 설계로 구성합니다.

SQL로 쿼리할 때 본질적으로 데이터베이스에 묻고 있습니다: "이 테이블들에서, 이러한 조건 하에서, 어떤 행과 열을 봐야 합니까?"

4. 핵심 쿼리: SELECT

SELECT 문은 SQL의 작업 말이며 아마도 가장 복잡한 명령입니다. SQLite SELECT 참조 는 이를 "SQL 언어에서 가장 복잡한 명령"이라고 부르며, MySQL의 SELECT 문서 SQLite Tutorial의 SELECT 가이드 와 같은 튜토리얼은 많은 옵션을 다룹니다.

SELECT id, name
FROM customers;

핵심 부분:

  • SELECT는 열을 나열합니다(또는 모든 열에 대해 *, 비록 명시적인 것이 일반적으로 더 좋지만).
  • FROM은 하나 이상의 테이블을 선택합니다.
  • WHERE는 행을 필터링합니다.
  • ORDER BY는 결과를 정렬합니다.
  • LIMIT는 볼 수 있는 행 수를 제한합니다.
SELECT id, name, created_at
FROM customers
WHERE active = TRUE
ORDER BY created_at DESC
LIMIT 50;

W3Schools SQL 튜토리얼 W3Schools MySQL의 일반적인 명령 개요 와 같은 소개 튜토리얼은 SELECT를 사용하여 단일 읽기 가능한 표현식으로 테이블에서 데이터를 추출하는 방법을 보여줍니다.

5. 필터링, 정렬 및 표현식

SQL은 쿼리에서 직접 필터링과 표현식을 결합할 때 빛을 발합니다:

SELECT
 id,
 total_amount,
 total_amount * 0.1 AS tax_estimate
FROM orders
WHERE status = 'paid'
 AND total_amount >= 100
ORDER BY total_amount DESC;

WHERE 절은 비교 연산자(=, <>, >, <), 논리 연산자(AND, OR, NOT), 패턴 일치(LIKE, ILIKE) 등을 사용할 수 있습니다. MySQL과 같은 데이터베이스는 숫자, 문자열, 날짜/시간, JSON 및 기타 작업을 위한 풍부한 내장 함수 및 연산자 세트를 문서화합니다.

다음도 할 수 있습니다:

  • 목록과 일치하도록 IN 사용: WHERE status IN ('paid', 'refunded')
  • 범위에 BETWEEN 사용: WHERE created_at BETWEEN '2025-01-01' AND '2025-01-31'
  • 누락된 값을 처리하기 위해 IS NULL / IS NOT NULL 사용

좋은 튜토리얼과 매뉴얼은 표현식이 많은 절—WHERE, ORDER BY, HAVING, 심지어 SELECT 자체—에 나타난다는 것을 강조합니다. MySQL 문서는 함수 및 연산자 장 내의 표현식 평가 섹션에서 이를 강조합니다.

6. 테이블 조인

실제 데이터베이스는 모든 것을 단일 테이블에 유지하는 경우가 거의 없습니다. 대신 데이터를 여러 테이블로 정규화하고 쿼리할 때 조인합니다. 조인은 W3Schools의 SQL 조인 페이지, GeeksforGeeks의 조인 튜토리얼, TutorialsPoint의 조인 개요, 및 SQL Practice Online의 SQL 조인 튜토리얼 와 같은 리소스에서 광범위하게 다룹니다.

SELECT
 id,
 c.name,
 o.order_date,
 o.total_amount
FROM orders AS o
JOIN customers AS c
 ON c.id = o.customer_id;

일반적인 조인 유형:

  • INNER JOIN – 두 테이블 모두에 일치하는 행만
  • LEFT JOIN – 왼쪽 테이블의 모든 행, 더하기 오른쪽의 일치
  • RIGHT JOIN – 왼쪽 조인의 반대(SQLite와 같은 일부 엔진에서는 지원되지 않음)
  • FULL OUTER JOIN – 일치하지 않더라도 양쪽의 행

DbSchema의 "SQL joins explained" 기사 또는 LearnSQL.com의 조인 예제 와 같은 시각적이고 코드 중심의 설명은 조인이 어떻게 동작하는지에 대한 강한 직관을 구축하는 훌륭한 방법입니다.

7. 집계, 그룹화 및 윈도우 함수

데이터를 요약하기 위해—합계, 평균, 개수—집계 함수(COUNT, SUM, AVG, MIN, MAX)를 GROUP BY와 함께 사용합니다:

SELECT
 customer_id,
 COUNT(*) AS order_count,
 SUM(total_amount) AS total_spent
FROM orders
WHERE status = 'paid'
GROUP BY customer_id
HAVING SUM(total_amount) >= 1000
ORDER BY total_spent DESC;

MySQL의 함수 및 연산자 장 PostgreSQL의 집계 및 윈도우 함수 문서 와 같은 참조는 이러한 표현식에서 사용할 수 있는 내장 함수를 카탈로그화합니다.

모던 SQL은 윈도우 함수도 지원하며, 개별 행을 반환하면서 행의 슬라이딩 "윈도우"에 대해 집계를 계산할 수 있습니다—예를 들어, 누적 합계 또는 순위. 윈도우 함수는 SQL:1999에 대한 수정을 통해 SQL에 들어왔고, 나중에 SQL:2003에 통합되었습니다. SQL:1999 및 SQL:2003 표준 에 대한 노트에 요약되어 있습니다.

SELECT
 customer_id,
 order_date,
 total_amount,
 SUM(total_amount) OVER (
   PARTITION BY customer_id
   ORDER BY order_date
 ) AS running_total
FROM orders;

이러한 유형의 쿼리는 데이터베이스에서 직접 분석하는 데 매우 강력합니다.

8. 데이터 정의: 스키마 생성 및 진화

SQL은 쿼리만을 위한 것이 아닙니다. 또한 Data Definition Language(DDL) 문을 통해 데이터의 형태를 정의합니다. 이는 PostgreSQL의 데이터 정의 가이드 MySQL의 SQL 문 장 와 같은 섹션에서 잘 문서화되어 있습니다.

일반적인 DDL 명령:

  • CREATE DATABASE my_app; – 데이터베이스 생성
  • CREATE TABLE customers (...); – 테이블 정의
  • ALTER TABLE customers ADD COLUMN phone TEXT; – 테이블 구조 변경
  • DROP TABLE customers; – 테이블 제거
CREATE TABLE customers (
 id           SERIAL PRIMARY KEY,
 email        VARCHAR(255) UNIQUE NOT NULL,
 name         TEXT NOT NULL,
 created_at   TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
 active       BOOLEAN NOT NULL DEFAULT TRUE
);

주의할 사항:

  • 데이터 유형: 정수, 문자열, 날짜, 부울, JSON 등
  • 제약 조건: PRIMARY KEY, UNIQUE, NOT NULL, CHECK 표현식
  • 기본값 및 생성된 열

모든 주요 RDBMS 매뉴얼— PostgreSQL의 SQL 언어 섹션, MySQL 참조 매뉴얼, 및 SQLite 언어 참조 —는 스키마 결정이 나중에 변경하기 어렵기 때문에 DDL에 대해 신중하게 생각하는 것을 강조합니다.

9. 트랜잭션, 동시성 및 제약 조건

SQL 데이터베이스는 일반적으로 ACID 속성—원자성, 일관성, 격리, 지속성—을 트랜잭션을 통해 구현합니다:

BEGIN;

UPDATE accounts
SET balance = balance - 200
WHERE id = 1;

UPDATE accounts
SET balance = balance + 200
WHERE id = 2;

COMMIT;

BEGINCOMMIT 사이에서 무언가가 실패하면 트랜잭션이 롤백되어 중간 변경 사항이 데이터베이스로 누출되지 않도록 합니다.

MySQL의 트랜잭션 및 잠금 문 섹션은 START TRANSACTION, COMMIT, ROLLBACK, 및 저장점을 다루며, PostgreSQL의 동시성 제어 트랜잭션 관리 장은 격리 수준과 MVCC가 내부적으로 어떻게 작동하는지 설명합니다.

제약 조건—외래 키 또는 체크 제약 조건과 같은—은 비즈니스 규칙을 강제하는 데이터베이스의 방법입니다:

ALTER TABLE orders
ADD CONSTRAINT fk_orders_customer
FOREIGN KEY (customer_id)
REFERENCES customers (id);

잘 사용되면 데이터베이스를 불변량의 수호자로 변환하여 애플리케이션 로직에만 의존하는 대신 소스에서 잘못된 데이터를 방지합니다.

10. 스키마 설계 및 정규화

스키마를 올바르게 만드는 것은 종종 영리한 쿼리보다 더 중요합니다. 정규화는 중복을 줄이고 일관성을 향상시키기 위해 테이블을 구조화하는 프로세스입니다. 다음과 같은 튜토리얼:

일반적인 진행:

  • 1NF: 반복 그룹 없음; 각 열은 원자 값을 보유합니다.
  • 2NF: 각 비키 속성은 전체 기본 키에 종속됩니다(복합 키의 경우).
  • 3NF: 전이적 종속성 없음(비키 속성이 다른 비키 속성에 종속되지 않음).

과도한 정규화는 성능을 저해하고 쿼리를 복잡하게 만들 수 있습니다. 실용적인 팀은 종종 3NF로 정규화한 다음 성능이 필요한 경우 선택적으로 비정규화합니다(예: 집계 캐싱).

11. 인덱스 및 쿼리 성능

인덱스는 SQL 쿼리를 빠르게 만드는 주요 도구입니다. 이들은 데이터베이스가 전체 테이블을 스캔하는 대신 관련 행으로 직접 점프할 수 있게 하는 보조 데이터 구조입니다.

인덱싱에 대한 매우 존경받는 리소스는 Markus Winand의 Use The Index, Luke!입니다. 이는 SQL 성능 및 인덱싱 전략에 완전히 초점을 맞춘 무료 온라인 책입니다. 사이트의 메인 페이지, UseTheIndexLuke.com, 및 "Indexing LIKE filters" "More indexes, slower INSERT" 와 같은 기사는 인덱스가 언제 도움이 되고 언제 해를 끼치는지 설명합니다.

핵심 아이디어:

  • B-tree 인덱스는 동등성 및 범위 검색을 가속화합니다(WHERE email = ..., WHERE created_at >= ...).
  • 복합 인덱스는 열 순서를 고려합니다—예를 들어, (customer_id, created_at) WHERE customer_id = ? AND created_at >= ?에 잘 작동합니다.
  • 인덱스는 필터가 있는 SELECT, UPDATE, 및 DELETE를 도와주지만, 삽입을 느리게 만듭니다. 각 삽입이 관련된 모든 인덱스를 업데이트해야 하기 때문입니다.

MSSQLTips의 SQL Server 인덱스 설계 기사 와 같은 가이드는 인덱스에서 열 선택 및 순서가 실제 쿼리에 어떤 영향을 미치는지 보여줍니다.

실용적인 경험 법칙:

  • 기본 키 및 빈번한 조인/필터 열에 인덱스를 생성합니다.
  • 모든 열에 인덱스를 생성하는 것을 피합니다—너무 많은 인덱스는 쓰기 성능을 죽입니다.
  • 데이터베이스의 EXPLAIN/EXPLAIN ANALYZE를 사용하여 쿼리가 어떻게 실행되는지 확인합니다.

12. 모던 SQL 기능: CTE, JSON 및 그 이상

기초는 안정적으로 유지되었지만, 모던 SQL은 크게 성장했습니다:

  • WITH를 통한 Common Table Expressions(CTE)는 더 읽기 쉽고 모듈화된 쿼리를 허용합니다:
    WITH recent_orders AS (
     SELECT *
     FROM orders
     WHERE order_date >= CURRENT_DATE - INTERVAL '7 days'
    )
    SELECT customer_id, COUNT(*) 
    FROM recent_orders
    GROUP BY customer_id;
  • JSON 지원을 통해 반구조화된 데이터를 관계형 테이블과 혼합할 수 있습니다. PostgreSQL, MySQL 및 기타는 매뉴얼에서 광범위한 JSON 함수를 문서화합니다. 예를 들어, MySQL의 JSON 기능은 JSON 함수 아래에 나열되어 있습니다.
  • 고급 데이터 유형(배열, hstore, 지오메트리, 전체 텍스트 검색)은 PostgreSQL 매뉴얼 의 PostgreSQL의 데이터 유형 및 인덱스 장에서 설명됩니다.

SQL 표준 자체는 XML, 다차원 배열 및 속성 그래프 쿼리를 위한 파트를 추가했습니다. 이는 ISO SQL 표준 카탈로그 ANSI SQL 표준 기사 와 같은 SQL의 진화에 대한 기사에 문서화되어 있습니다.

모던 SQL은 많은 애플리케이션이 복잡한 로직—계층 구조, 분석, 이벤트 처리—을 데이터베이스 계층으로 푸시할 수 있을 정도로 강력합니다.

13. SQL을 효과적으로 학습하기

SQL이 데이터 작업의 기초로 남아 있기 때문에 풍부한 학습 리소스 생태계가 있습니다:

실용적인 학습 전략:

  1. SELECT 및 기본 필터링을 마스터합니다. 간단한 쿼리로 시작하여 점진적으로 WHERE, ORDER BY, 및 LIMIT를 추가합니다.
  2. 조인에 익숙해집니다. 모든 조인 유형을 연습하여 자신 있게 결과를 예측할 수 있을 때까지 계속합니다.
  3. 그룹화 및 집계를 추가합니다. "월별 수익" 또는 "상위 10명의 고객"과 같은 질문에 GROUP BY로 답하는 방법을 배웁니다.
  4. 스키마 설계를 학습합니다. 정규화를 연구하고 실제 시스템—예: 상점, 예약 시스템, 소셜 네트워크—의 모델링을 연습합니다.
  5. 좋아하는 엔진의 기능을 탐색합니다. 데이터베이스의 공식 문서— PostgreSQL의 SQL 언어 섹션, MySQL 참조 매뉴얼, 또는 SQLite 언어 참조 —를 읽어 엔진별 도구를 발견합니다.
  6. 마지막으로, 성능을 학습합니다. Use The Index, Luke! 및 유사한 리소스의 개념을 사용하여 인덱스로 실험하고 EXPLAIN으로 쿼리를 프로파일링합니다.

SQL을 편안하게 읽고 쓸 수 있다면 프로덕션에서 직접 데이터를 검사하고, 스프레드시트로 내보내지 않고 보고서를 구축하고, 기본 테이블을 보고 애플리케이션 로직을 디버깅하며, 엔지니어 및 분석가와 더 효과적으로 협력할 수 있습니다.

14. 큰 그림

SQL은 독특한 교차점에 있습니다: 40년 이상 된 역사를 가지고 있지만 오늘날의 클라우드 네이티브, 분석 중심 시스템에서 깊이 관련되어 있습니다. ISO/IEC 9075 표준 및 그 많은 부분은 계속 진화하고 있으며, PostgreSQL, MySQL, 및 SQLite 와 같은 오픈 소스 데이터베이스는 실용적인 기능과 성능 개선을 추진하고 있습니다.

데이터로 작업하는 경우—개발자, 분석가, 데이터 과학자 또는 제품 관리자—SQL은 데이터베이스에 직접 질문할 수 있게 해주는 공통 언어입니다. 한 번 배울 가치가 있으며, 나머지 경력 동안 보상합니다.

자주 묻는 질문

SQL 포맷팅이란 무엇입니까?

SQL 포맷팅은 적절한 들여쓰기, 줄 바꿈 및 키워드 대소문자를 사용하여 SQL 쿼리를 구성하여 가독성과 유지보수성을 향상시키는 프로세스입니다.

어떤 SQL 방언이 지원됩니까?

우리 포맷터는 MySQL, PostgreSQL, SQL Server, SQLite, Oracle 및 기타 여러 SQL 방언을 지원합니다.

내 SQL 코드가 안전합니까?

예! 모든 SQL 포맷팅은 완전히 브라우저에서 수행됩니다. 쿼리는 컴퓨터를 떠나지 않아 완전한 개인정보 보호 및 보안을 보장합니다.

여러 SQL 문을 포맷할 수 있나요?

예, 여러 SQL 문을 한 번에 포맷할 수 있습니다. 포맷터는 선택한 방언에 따라 각 문을 적절하게 처리합니다.

SQL에 구문 오류가 있으면 어떻게 되나요?

포맷터는 구문 오류가 포함되어 있어도 SQL을 포맷하려고 시도합니다. 그러나 구문 분석할 수 없는 잘못된 SQL에 대한 오류 메시지가 표시될 수 있습니다. 항상 데이터베이스 시스템으로 SQL을 검증하세요.