한양과학기술고등학교

에듀테크 프로젝트 대시보드

SELECT 기본

WHERE ORDER BY LIMIT DISTINCT ON keyset

조회의 뼈대. PostgreSQL 만의 편의 문법 몇 가지를 함께 봅니다.

1. 절 실행 순서

논리적 평가 순서
FROM → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMIT/OFFSET

그래서 WHERE 절에서는 SELECT 의 별칭(alias)을 못 쓰고, ORDER BY 에서는 쓸 수 있습니다.

2. 자주 쓰는 조건

WHERE name ILIKE '%한양%'                 -- 대소문자 무시 LIKE
WHERE grade IN (1, 2)
WHERE created_at >= now() - interval '1 day'
WHERE deleted_at IS NULL
WHERE a IS DISTINCT FROM b                 -- NULL 을 값처럼 비교 (a<>b 는 NULL 이면 UNKNOWN)
WHERE score BETWEEN 60 AND 100

3. DISTINCT ON — 그룹별 1행

-- 학생별 가장 최근 시험 기록
SELECT DISTINCT ON (student_id) student_id, exam_date, score
FROM exams
ORDER BY student_id, exam_date DESC;

DISTINCT ON (cols) 는 그 컬럼 기준 첫 행만 남깁니다. ORDER BY 앞부분이 ON 컬럼과 일치해야 합니다.

4. 페이지네이션

-- OFFSET 방식 — 뒤로 갈수록 느려짐(앞 행을 다 세고 버림)
SELECT * FROM posts ORDER BY id DESC LIMIT 20 OFFSET 4000;

-- keyset(seek) 방식 — 항상 빠름
SELECT * FROM posts
WHERE id < :last_seen_id
ORDER BY id DESC
LIMIT 20;
권장
  • 무한 스크롤·대용량 목록은 keyset. (created_at, id) 복합 커서로 정렬 안정성 확보
"트랜잭션은 짧게, 잠금은 더 짧게"