티스토리 뷰

반응형

 

예전에는 시스템 개발 및 운영 실무에서 주로 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 확장 데이터형으로 범용성 강화
  • 오픈소스 생태계 기반으로 유연한 확장 가능

 

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/12   »
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
글 보관함