백엔드 데이터 인프라 19편. 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_case—created_at·user_id - 인덱스:
idx_<테이블>_<컬럼>—idx_users_email - 외래 키:
fk_<테이블>_<참조테이블>—fk_orders_user - 시퀀스 자동:
<테이블>_<컬럼>_seq—users_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(자바 DB 연결 표준)·psql(PG 공식 CLI) 클라이언트는 — 한 번에 여러 문장 전송 가능.
공백·줄바꿈
-- 모두 같은 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 자동 빼고.
키워드(대문자 컨벤션) · 식별자(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
시리즈 다른 편 (앞뒤 글 모음)
이전 글:
- 14편 — DELETE 데이터 삭제와 소프트 삭제 패턴
- 15편 — 외래 키 참조 무결성
- 16편 — 뷰 VIEW와 MATERIALIZED VIEW
- 17편 — 트랜잭션 BEGIN COMMIT ROLLBACK
- 18편 — 윈도우 함수와 고급 SQL
다음 글: