백엔드 데이터 인프라 19편 — PostgreSQL SQL 어휘 구조

2026-05-17백엔드 데이터 인프라

백엔드 데이터 인프라 19편. SQL의 어휘 구조 — 키워드·식별자·리터럴·주석·연산자 표준 규칙을 풀어쓴 학습 노트.

📚 백엔드 데이터 인프라 · 19편 — PostgreSQL SQL 어휘 구조

이 글은 백엔드 데이터 인프라 시리즈 70편 중 19편이에요. Part 1 튜토리얼 18편 까지 완주했으니, 이번 19편부터 Part 2 SQL Language 깊이 로 들어가요. 첫 단계 — SQL의 "어휘 구조".

어휘가 헷갈리는 이유

SQL 코드 보면 — SELECT·'문자열'·"컬럼"·123·-- 주석 같은 다양한 표기가 섞여 있어요. 어디까지가 "PG의 약속" 이고 어디부터가 "내가 쓰는 값" 인지 모호.

이 글에서는 5가지 어휘 요소를 정리: 1. 키워드 (SELECT·INSERT 등) 2. 식별자 (테이블·컬럼명) 3. 리터럴 (문자열·숫자·날짜 등) 4. 연산자 (+·=·||·~ 등) 5. 주석 (-- 와 / /)

(1) 키워드 — SQL의 약속

SELECT  name  FROM  users  WHERE  id = 1;

SELECT·FROM·WHERE 가 SQL이 약속한 "키워드". 대소문자 무관 — Select·select·SELECT 모두 동작. 컨벤션 = 대문자.

PG의 키워드는 약 1000여 개. 자주 쓰는 50개만 외워도 OK.

예약어 vs 비예약어

종류 의미
예약어 (Reserved) 식별자로 사용 X SELECT·FROM·WHERE·USER
비예약어 (Non-reserved) 식별자로도 가능 (불편) NAME·VALUE·VERSION
CREATE TABLE select (...)   -- ❌ ERROR — 예약어
CREATE TABLE "select" (...) -- ✅ 큰 따옴표로 강제 (권장 X)

비예약어조차 식별자로 박으면 — 사람·도구가 헷갈림. 테이블·컬럼명은 키워드 회피.

(2) 식별자 — 우리가 만드는 이름

테이블·컬럼·인덱스·사용자 등의 이름. 규칙:

  • 글자 + 숫자 + _ (밑줄)
  • 첫 글자는 글자 또는 _
  • 최대 63자
  • 대소문자 구분 X (기본)
CREATE TABLE users (...)        -- ✅
CREATE TABLE user_orders (...)  -- ✅
CREATE TABLE 1user (...)        -- ❌ 숫자 시작
CREATE TABLE Users (...)        -- ✅ 다만 자동으로 users 로 저장

큰 따옴표 — 강제 식별자

CREATE TABLE "User" (id INT, "Name" TEXT);

SELECT "Name" FROM "User";    -- 대소문자 그대로
SELECT name FROM user;        -- ❌ User 와 다른 테이블

거의 안 권장 — 일관성 깨짐. ORM과 충돌 가능. 대소문자 섞인 식별자는 운영에서 골칫거리.

명명 규칙 — 한국 회사 표준

  • 테이블: snake_case 복수 — users·order_items
  • 컬럼: snake_casecreated_at·user_id
  • 인덱스: idx_<테이블>_<컬럼>idx_users_email
  • 외래 키: fk_<테이블>_<참조테이블>fk_orders_user
  • 시퀀스 자동: <테이블>_<컬럼>_sequsers_id_seq

(3) 리터럴 — 박는 값

문자열 — 작은 따옴표

SELECT * FROM users WHERE name = 'Alice';
SELECT 'Hello, World';
SELECT 'It''s a test';        -- 작은 따옴표 안에 작은 따옴표 = 두 번 박기

큰 따옴표 vs 작은 따옴표 — 가장 자주 헷갈리는

의미
'문자열' 작은 따옴표 = 문자열 리터럴
"이름" 큰 따옴표 = 식별자 (테이블·컬럼명)
SELECT "Alice"        -- ❌ "Alice" 라는 컬럼명 찾기
SELECT 'Alice'        -- ✅ 'Alice' 문자열

자바·JS 출신자가 가장 자주 실수.

달러 인용 — Dollar Quoting

SELECT $$It's a "great" day with O'Brien$$;
SELECT $tag$Multi-line
text with 'all kinds' of "quotes"$tag$;

$$...$$ 또는 $tag$...$tag$ = 내부에 작은·큰 따옴표 자유롭게. 함수·트리거 본문에 매우 자주.

CREATE FUNCTION greet() RETURNS TEXT AS $$
    SELECT 'Hello, ' || current_user;
$$ LANGUAGE sql;

숫자

123          -- 정수
123.45       -- 소수
1.23e5       -- 지수 표기 (= 123000)

타입 캐스팅 명시:

123::INTEGER
'123'::INTEGER         -- 문자열 → 정수
'2026-05-17'::DATE

날짜·시각

'2026-05-17'::DATE
'2026-05-17 14:30:00'::TIMESTAMP
'2026-05-17 14:30:00 KST'::TIMESTAMPTZ
NOW()                   -- 현재 시각 (함수)
CURRENT_DATE             -- 오늘 (키워드)
INTERVAL '7 days'        -- 기간

Boolean

TRUE·FALSE·NULL
't'·'f'   -- 단축 (가끔)

Bytea — 바이너리

'\x DEAD BEEF'::BYTEA    -- 16진수

NULL

NULL                     -- 값 없음
-- 비교 = IS NULL (= NULL 안 됨, [7편])

(4) 연산자

산술

1 + 2     -- 더하기
3 - 1     -- 빼기
2 * 3     -- 곱하기
10 / 3    -- 나누기 (정수면 정수 나누기 — 3)
10 % 3    -- 나머지 (1)
2 ^ 8     -- 거듭제곱

비교

=  <>  !=  >  <  >=  <=

논리

AND  OR  NOT

문자열

'Hello' || ' ' || 'World'   -- 연결 (||)
'Hello' LIKE 'H%'           -- 패턴
'Hello' SIMILAR TO 'H_l%'   -- SQL 표준 패턴
'Hello' ~ '^H'              -- 정규식 (PG 특별)

비트

1 & 2    -- AND
1 | 2    -- OR
1 # 2    -- XOR
~1       -- NOT
1 << 2   -- 시프트

(5) 주석

-- 한 줄 주석 (-- 부터 줄 끝까지)

/*
   여러 줄 주석
   /* 중첩 가능 */
*/

SELECT *  -- 라인 중간에도
FROM users;

SQL 문장의 구조

SELECT name, email FROM users WHERE id = 1;

문장(statement) = 세미콜론(;) 까지가 한 단위. 여러 문장 = 세미콜론 구분:

INSERT INTO users (name) VALUES ('Alice');
INSERT INTO users (name) VALUES ('Bob');

JDBC·psql 클라이언트는 — 한 번에 여러 문장 전송 가능.

공백·줄바꿈

-- 모두 같은 SQL
SELECT name FROM users WHERE id = 1;
SELECT   name   FROM   users   WHERE   id = 1;
SELECT
    name
FROM
    users
WHERE
    id = 1;

공백·탭·줄바꿈은 무관. 가독성을 위해 들여쓰기 = 한국 회사 표준.

함정 5가지

(1) 큰 vs 작은 따옴표

WHERE name = "Alice"   ❌
WHERE name = 'Alice'   ✅

가장 자주 실수.

(2) 키워드를 식별자로

CREATE TABLE order (...)   ❌
CREATE TABLE orders (...)  ✅

order 가 예약어. 복수형 또는 다른 이름.

(3) 대소문자 섞은 식별자

CREATE TABLE Users ...    -- PG가 자동 lowercase → users
CREATE TABLE "Users" ...   -- 강제 — 매번 큰 따옴표 필요

ORM·도구 호환성 위해 — 모두 lowercase.

(4) 정수 나눗셈

SELECT 10 / 3;     -- 3 (정수)
SELECT 10.0 / 3;   -- 3.333...
SELECT 10 / 3::FLOAT;   -- 3.333...

정수 나눗셈 결과는 정수.

(5) || 와 NULL

'Hello' || ' ' || NULL    -- NULL (NULL 끼면 전체 NULL)

NULL 안전 연결 = CONCAT('Hello', ' ', NULL) — NULL 자동 빼고.

🎯 어휘 5요소

키워드(대문자 컨벤션) · 식별자(snake_case·lowercase) · 리터럴(작은 따옴표 문자열·::TYPE 캐스팅) · 연산자(=·||·~) · 주석(-- + /* */). 이 5가지가 모든 SQL의 토대.

한 줄 정리 — SQL 어휘 = 키워드(대문자)·식별자(snake_case)·리터럴(작은 따옴표·달러 인용)·연산자(=·||)·주석(-- + / /). 큰 따옴표 = 식별자, 작은 = 문자열. 정수 나눗셈 주의. NULL 연결은 NULL.

시험 직전 한 번 더 — SQL 어휘 입문자가 매번 헷갈리는 것

  • 키워드 = SQL의 약속 (대소문자 무관, 컨벤션 대문자)
  • 예약어 = 식별자로 사용 X (SELECT·FROM·USER 등)
  • 식별자 = 테이블·컬럼 이름
  • 규칙 = 글자/숫자/, 첫 글자는 글자/
  • 최대 63자
  • 컨벤션 = snake_case lowercase
  • 큰 따옴표 = 식별자 (대소문자 그대로)
  • 작은 따옴표 = 문자열 리터럴
  • 작은 따옴표 안 작은 따옴표 = 두 번 ('')
  • 달러 인용 = $$...$$·$tag$...$tag$ (함수·트리거)
  • 숫자 = 123·1.23·1.23e5
  • 타입 캐스팅 = ::TYPE
  • 날짜 = '2026-05-17'::DATE
  • INTERVAL = INTERVAL '7 days'
  • Boolean = TRUE·FALSE·NULL
  • || = 문자열 연결 (NULL 만나면 NULL)
  • CONCAT = NULL 안전
  • 산술 = +·-·*·/·%·^
  • 비교 = =·<>·!=·>·<·>=·<=
  • 논리 = AND·OR·NOT
  • 패턴 = LIKE·SIMILAR TO·~ 정규식
  • 주석 = -- 한 줄, /* */ 여러 줄 (중첩 가능)
  • ; 문장 끝
  • 공백·줄바꿈 무관 — 가독성 위주
  • 정수 나눗셈 = 정수 결과 (FLOAT 캐스팅 필요)
  • 한국 표준 = lowercase snake_case

시리즈 다른 편

  • Part 2 SQL Language 깊이: 19편 (현재 글) — 시작
  • Part 1 PostgreSQL 튜토리얼 18편 완주: 1편 ~ 18편

시리즈 다음 글

다음 글(20편)에서는 SQL 문법 전반 — 문장 구조와 표현식의 깊이.

공식 문서: PostgreSQL 18 — SQL Syntax: Lexical Structure에서 더 자세한 사양을 확인할 수 있어요.

※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

답글 남기기

error: Content is protected !!