[PostgreSQL] 두 테이블 비교 시 기준 테이블의 데이터를 모두 유지하는 방법

2025. 5. 25. 21:44·개발 (Development)/PostgreSQL

SQL을 사용하다 보면 두 개의 테이블을 비교하여 원하는 데이터를 조회해야 하는 경우가 자주 발생합니다. 이때 흔히 사용하는 방법이 WHERE a.column = b.column 조건을 통한 비교입니다. 하지만 이 방식은 교집합만 반환하기 때문에, 기준이 되는 테이블의 데이터 중 조건에 일치하지 않는 행은 결과에서 제외되는 문제가 있습니다.

PostgreSQL에서도 이러한 문제를 해결하기 위해 사용할 수 있는 방법이 있습니다. 바로 LEFT JOIN 문법입니다.

1. 단순 비교: INNER JOIN 또는 WHERE 절 사용

SELECT 
    a.*, 
    b.*
FROM 
    a, b
WHERE 
    a.column = b.column;

또는 PostgreSQL의 명시적 조인 방식으로 다음과 같이 쓸 수 있습니다:

SELECT 
    a.*, 
    b.*
FROM 
    a
JOIN 
    b ON a.column = b.column;

이 방식은 a.column = b.column이 일치하는 행만 결과에 포함시킵니다. 즉, 교집합만 출력됩니다.

2. 기준 테이블(a)의 모든 데이터를 포함: LEFT JOIN 사용

기준이 되는 테이블 a의 모든 데이터를 유지하고, b 테이블에 연결할 수 있는 데이터가 있을 때만 붙이려면 LEFT JOIN을 사용합니다. PostgreSQL에서도 이 방식이 일반적입니다.

SELECT 
    a.*, 
    b.column1, 
    b.column2
FROM 
    a
LEFT JOIN 
    b ON a.column = b.column;

이 쿼리는 다음과 같은 동작을 합니다:

  • a 테이블의 모든 행을 결과에 포함시킵니다.
  • a.column = b.column이 일치하는 경우, b의 해당 데이터도 함께 출력합니다.
  • b 테이블에 일치하는 값이 없다면, b.column1, b.column2 등은 NULL로 표시됩니다.

3. 실무 예시

예를 들어 user 테이블과 order 테이블이 있다고 가정해보겠습니다. 사용자가 주문을 했는지 여부를 포함하여 사용자 목록을 출력하려면 다음과 같이 쿼리를 작성할 수 있습니다.

SELECT 
    u.user_id, 
    u.name, 
    o.order_id, 
    o.order_date
FROM 
    users u
LEFT JOIN 
    orders o ON u.user_id = o.user_id;

이 쿼리는 모든 사용자를 기준으로 하며, 주문이 존재하는 경우 해당 주문 정보도 함께 출력합니다. 주문이 없는 사용자도 결과에 포함되며, 이 경우 주문 정보는 NULL로 나타납니다.

4. 정리

  • WHERE a.column = b.column 또는 JOIN은 교집합 조회에 사용됩니다.
  • LEFT JOIN은 PostgreSQL에서 기준 테이블(a)의 모든 데이터를 유지하면서, 연결 가능한 데이터를 붙이는 방식입니다.
  • RIGHT JOIN, FULL OUTER JOIN도 상황에 따라 사용할 수 있으며, PostgreSQL은 이들 조인도 모두 지원합니다.

PostgreSQL을 사용할 때 LEFT JOIN은 데이터를 기준 테이블 중심으로 조회할 수 있어, 리포트 작성이나 데이터 분석 시 매우 유용하게 쓰입니다. 조건에 맞지 않더라도 누락 없이 데이터를 유지하고 싶다면 LEFT JOIN을 기본으로 생각하시는 것이 좋습니다.

반응형

'개발 (Development) > PostgreSQL' 카테고리의 다른 글

[PostgreSQL] MyBatis foreach + UNION ALL 쿼리의 성능 문제와 PostgreSQL 최적화  (1) 2025.07.05
[PostgreSQL] PostgreSQL에서 threshold 값 이력 관리 및 최신값 조회 테이블 설계하기  (0) 2025.06.28
[PostgreSQL] 시퀀스 자동 증가 설정과 오류 해결 방법 정리  (0) 2025.05.18
[PostgreSQL] 실전 활용 - 문자열 포함, 쉼표 구분 배열 매칭, JSON 배열 필터링  (0) 2025.04.26
[PostgreSQL] PostgreSQL JSON 쿼리 성능 개선과 Java에서의 활용  (1) 2025.04.06
'개발 (Development)/PostgreSQL' 카테고리의 다른 글
  • [PostgreSQL] MyBatis foreach + UNION ALL 쿼리의 성능 문제와 PostgreSQL 최적화
  • [PostgreSQL] PostgreSQL에서 threshold 값 이력 관리 및 최신값 조회 테이블 설계하기
  • [PostgreSQL] 시퀀스 자동 증가 설정과 오류 해결 방법 정리
  • [PostgreSQL] 실전 활용 - 문자열 포함, 쉼표 구분 배열 매칭, JSON 배열 필터링
LoopThinker
LoopThinker
모르는 것을 알아가고, 아는 것을 더 깊게 파고드는 공간
  • LoopThinker
    CodeMemoir
    LoopThinker
  • 전체
    오늘
    어제
    • 분류 전체보기 (238)
      • 개발 (Development) (171)
        • Algorithm (1)
        • Angular (1)
        • AWS (7)
        • DeepSeek (2)
        • Docker (7)
        • Git (3)
        • Java (36)
        • JavaScript (4)
        • Kafka (5)
        • Kubernetes (4)
        • Linux (7)
        • PostgreSQL (38)
        • Python (34)
        • React (3)
        • TypeScript (3)
        • Vue.js (5)
        • General (11)
      • 데이터 분석 (Data Analysis) (1)
      • 알고리즘 문제 풀이 (Problem Solving.. (27)
      • 자격증 (Certifications) (24)
        • ADsP (14)
        • 정보처리기사 (4)
        • Linux Master (5)
        • SQLD (1)
      • 기술 동향 (Tech Trends) (12)
      • 기타 (Others) (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    docker
    데이터분석
    JPA
    Kubernetes
    pandas
    Vue.js
    백준알고리즘
    Linux master
    springboot
    JSON
    javascript
    백준
    파이썬
    리눅스 마스터 2급 2차
    백준자바
    DevOps
    오답노트
    ADsP
    Kafka
    java
    Linux
    AWS
    timescaledb
    python
    백준온라인저지
    리눅스 마스터 2급
    자바
    deepseek
    MyBatis
    PostgreSQL
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
LoopThinker
[PostgreSQL] 두 테이블 비교 시 기준 테이블의 데이터를 모두 유지하는 방법
상단으로

티스토리툴바