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 |