티스토리 뷰

예전에는 시스템 개발 및 운영 실무에서 주로 MS-SQL이나 Oracle을 활용했으나, 최근에는 대형 시스템에서도 PostgreSQL을 도입하는 사례가 늘어나면서 자연스럽게 PostgreSQL을 접할 기회가 많아졌습니다. 그 과정에서 각 DBMS 간의 문법적 차이를 직접 체감하게 되었고, 이에 대한 정리가 필요하다고 느꼈습니다.
이번 글에서는 PostgreSQL에 적응하기 위해, SQL 표준이라 할 수 있는 ANSI SQL과 PostgreSQL SQL을 비교하면서 공통적으로 사용할 수 있는 쿼리와 차이가 있는 부분을 정리해 보겠습니다.
SQL은 데이터베이스에서 데이터를 정의하고 조작하기 위한 표준 언어입니다. 그러나 데이터베이스 벤더마다 ANSI SQL을 기반으로 한 고유의 SQL 방언(SQL Dialect)을 제공합니다. PostgreSQL은 오픈소스 관계형 데이터베이스 관리 시스템(RDBMS) 중 하나로, ANSI SQL 표준을 충실히 따르면서도 다양한 확장을 통해 강력한 기능을 제공합니다.
1. ANSI SQL과 PostgreSQL 문법 : 공통점
PostgreSQL은 ANSI SQL 표준을 충실히 준수하기 때문에 대부분의 기본적인 SQL 문법과 데이터형은 동일합니다.
-- 테이블 생성
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(100),
hire_date DATE
);
-- 데이터 삽입
INSERT INTO employees (id, name, hire_date)
VALUES (1, 'Alice', DATE '2020-01-01');
-- 데이터 조회
SELECT name, hire_date
FROM employees
WHERE hire_date > DATE '2019-12-31';
-- 정렬
SELECT *
FROM employees
ORDER BY hire_date DESC;
2. ANSI SQL과 PostgreSQL 문법 : 차이점
PostgreSQL은 ANSI SQL의 기능을 지원하면서도 다양한 확장 기능을 제공합니다.
2.1 자동 증가 컬럼
PostgreSQL은 SERIAL, BIGSERIAL 타입을 제공하며, 10 이후 버전에서는 GENERATED AS IDENTITY도 지원합니다.
ANSI SQL
CREATE TABLE test (
id INT GENERATED ALWAYS AS IDENTITY,
name VARCHAR(50)
);
PostgreSQL
CREATE TABLE test (
id SERIAL PRIMARY KEY,
name VARCHAR(50)
);
2.2 행 제한 (LIMIT)
PostgreSQL은 LIMIT/OFFSET을 주로 사용하며, 페이징 처리에서 직관적입니다.
ANSI SQL
SELECT * FROM employees
FETCH FIRST 10 ROWS ONLY;
PostgreSQL
SELECT * FROM employees
LIMIT 10 OFFSET 0;
2.3 문자열 연결
ANSI SQL에서는 문자열 연결 시 || 연산자를 사용합니다. PostgreSQL은 이를 그대로 지원하며, 추가로 CONCAT 함수를 제공합니다.
ANSI SQL
SELECT first_name || ' ' || last_name AS full_name
FROM employees;
PostgreSQL
-- || 연산자 (ANSI SQL 동일)
SELECT first_name || ' ' || last_name AS full_name
FROM employees;
-- CONCAT 함수 (NULL 안전 처리)
SELECT CONCAT(first_name, ' ', last_name) AS full_name
FROM employees;
2.4 날짜 및 시간 함수
ANSI SQL은 CURRENT_DATE, CURRENT_TIME, CURRENT_TIMESTAMP 같은 기본적인 날짜·시간 함수를 정의합니다. PostgreSQL은 이 외에도 NOW(), AGE(), DATE_TRUNC() 같은 확장 함수들을 지원합니다.
ANSI SQL
SELECT CURRENT_DATE, CURRENT_TIMESTAMP;
PostgreSQL
-- 현재 날짜/시간
SELECT NOW(), CURRENT_DATE, CURRENT_TIMESTAMP;
-- 두 날짜 차이 구하기
SELECT AGE(CURRENT_DATE, DATE '2000-01-01');
-- 특정 단위로 절삭
SELECT DATE_TRUNC('month', CURRENT_DATE); -- 이번 달의 1일 반환
2.5 JSON 지원
ANSI SQL은 최근 표준에서 JSON 데이터 타입과 일부 함수를 정의하기 시작했지만, 기능은 제한적입니다. PostgreSQL은 JSON 및 JSONB 타입을 오래 전부터 지원하며, 인덱스, 함수, 연산자까지 제공하여 사실상 NoSQL 기능을 SQL 안에 포함시켰다고 볼 수 있습니다.
PostgreSQL
-- JSON 컬럼에서 특정 키 조회
SELECT data->>'name' AS name
FROM employees_json
WHERE data->>'department' = 'IT';
-- JSONB를 이용한 빠른 조회
SELECT *
FROM employees_json
WHERE data @> '{"department": "Finance"}';
3. 데이터형 비교
| 범주 | ANSI SQL | PostgreSQL 문법 | 특징 |
| 정수형 | SMALLINT INTEGER BIGINT |
동일 | 표준과 동일 |
| 소수/실수형 | DECIMAL(p,s) NUMERIC(p,s) FLOAT REAL DOUBLE PRECISION |
동일 + MONEY | PostgreSQL의 NUMERIC은 정밀도 무제한 |
| 문자열형 | CHAR(n) VARCHAR(n) CLOB |
CHAR(n) VARCHAR(n) TEXT |
PostgreSQL의 TEXT는 사실상 무제한 문자열 |
| 날짜/시간형 | DATE TIME TIMESTAMP INTERVAL |
동일 + TIMESTAMPTZ | 타임존 포함 기능 강화 |
| 이진형 | BLOB BINARY |
BYTEA | 이진 데이터 저장 |
| 불리언형 | BOOLEAN | BOOLEAN | 동일 |
| 고유 확장형 | 없음 | UUID ARRAY JSON JSONB HSTORE GEOMETRY(PostGIS) |
PostgreSQL만 제공 |
| 자동증가형 | IDENTITY | SERIAL BIGSERIAL IDENTITY |
PostgreSQL은 SERIAL을 전통적으로 활용 |
4. PostgreSQL SQL의 특징 요약
- ANSI SQL을 충실히 따르므로 기본 쿼리 이식성이 높음
- 문자열 처리(CONCAT), 날짜 함수(AGE, DATE_TRUNC), JSON/JSONB 같은 실무 기능 제공
- TEXT, UUID, ARRAY, GIS 등 확장 데이터형으로 범용성 강화
- 오픈소스 생태계 기반으로 유연한 확장 가능
'IT Lab > Database' 카테고리의 다른 글
| [PostgreSQL] JSON 활용 방법 (JSON, JSONB) (2) | 2025.08.24 |
|---|---|
| [데이터 엔지니어링] 최신 데이터 도구 업데이트 (2025년 8월) | Airflow·Snowflake·PostgreSQL·Iceberg (9) | 2025.08.16 |
| [데이터 리니지] 3. 데이터 리니지, 어떻게 구성할까? (1) | 2025.08.02 |
| [데이터 리니지] 2. 분석계 데이터가 많아질수록 데이터 리니지가 필요한 이유 (0) | 2025.08.02 |
| [데이터 리니지] 1. AI 시대, 데이터 리니지의 중요성 (0) | 2025.08.02 |
- Total
- Today
- Yesterday
- DBMS
- 테이블복사
- 앱개발
- 챗gpt
- sql
- 데이터리니지
- DB
- java배포
- DATABASE
- sqlserver
- AnsiSQL
- datahub
- gpt활용
- cursorai
- Xcode
- 데이터플랫폼
- k8s
- IOS
- JSONB
- 데이터베이스
- AI코딩
- ChatGPT
- PostgreSQL
- db운영
- venv
- 바이브코딩
- mssql
- 데이터 리니지
- rockylinux
- data lineage
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |