1. JOIN이란?
SQL에서 JOIN은 두 개 이상의 테이블을 특정 조건을 기반으로 결합하는 연산이다. 데이터를 효과적으로 관리하기 위해서는 다양한 JOIN을 이해하고 적절히 사용할 필요가 있다. PostgreSQL에서는 JOIN을 활용하여 여러 테이블 간의 관계를 설정하고 필요한 데이터를 추출할 수 있다.
2. 실습을 위한 데이터셋 생성
아래 SQL을 실행하여 customers, orders, products, categories 테이블을 생성하고, 샘플 데이터를 삽입할 수 있다.
-- 고객 테이블 생성
CREATE TABLE customers (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
-- 주문 테이블 생성
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_id INT REFERENCES customers(id),
order_date DATE NOT NULL
);
-- 상품 테이블 생성
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
-- 카테고리 테이블 생성
CREATE TABLE categories (
id SERIAL PRIMARY KEY,
category_name VARCHAR(100) NOT NULL
);
-- 샘플 데이터 삽입
INSERT INTO customers (name) VALUES ('Alice'), ('Bob'), ('Charlie');
INSERT INTO orders (customer_id, order_date) VALUES (1, '2024-01-10'), (2, '2024-01-11');
INSERT INTO products (name) VALUES ('Laptop'), ('Phone'), ('Tablet');
INSERT INTO categories (category_name) VALUES ('Electronics'), ('Home Appliances');
3. JOIN의 종류
PostgreSQL에서 제공하는 주요 JOIN 유형은 다음과 같다.
(1) INNER JOIN (내부 조인)
INNER JOIN은 두 테이블에서 조인 조건을 만족하는 행만 반환하는 방식이다. 즉, 두 테이블에 공통으로 존재하는 데이터만 결과에 포함된다.
사용 예시
고객이 주문한 데이터를 조회하려면 다음과 같이 INNER JOIN을 사용할 수 있다.
SELECT customers.id, customers.name, orders.order_date
FROM customers
INNER JOIN orders ON customers.id = orders.customer_id;
(2) LEFT JOIN (왼쪽 외부 조인)
LEFT JOIN은 왼쪽 테이블(A)의 모든 행을 반환하고, 오른쪽 테이블(B)에서 일치하는 데이터가 있는 경우 해당 데이터를 포함한다. 일치하는 데이터가 없다면 NULL을 반환한다.
사용 예시
모든 고객 목록을 가져오되, 주문이 없는 고객도 포함시키려면 다음과 같이 LEFT JOIN을 사용할 수 있다.
SELECT customers.id, customers.name, orders.order_date
FROM customers
LEFT JOIN orders ON customers.id = orders.customer_id;
(3) RIGHT JOIN (오른쪽 외부 조인)
RIGHT JOIN은 LEFT JOIN과 반대로 오른쪽 테이블(B)의 모든 행을 반환하고, 왼쪽 테이블(A)에 일치하는 데이터가 있으면 함께 출력한다. 일치하는 데이터가 없으면 NULL이 반환된다.
사용 예시
모든 주문을 가져오되, 고객 정보가 없는 주문도 포함시키려면 다음과 같이 RIGHT JOIN을 사용할 수 있다.
SELECT customers.id, customers.name, orders.order_date
FROM customers
RIGHT JOIN orders ON customers.id = orders.customer_id;
(4) FULL JOIN (완전 외부 조인)
FULL JOIN은 LEFT JOIN과 RIGHT JOIN을 결합한 방식으로, 두 테이블에 존재하는 모든 데이터를 반환한다. 일치하는 행이 없으면 NULL이 채워진다.
사용 예시
모든 고객과 모든 주문 데이터를 포함하려면 다음과 같이 FULL JOIN을 사용할 수 있다.
SELECT customers.id, customers.name, orders.order_date
FROM customers
FULL JOIN orders ON customers.id = orders.customer_id;
(5) CROSS JOIN (교차 조인)
CROSS JOIN은 두 테이블 간의 모든 가능한 조합(데카르트 곱, Cartesian Product)을 반환한다. 두 테이블의 행 수를 곱한 만큼 결과가 생성된다.
사용 예시
모든 상품과 모든 카테고리 조합을 생성하려면 다음과 같이 CROSS JOIN을 사용할 수 있다.
SELECT products.name, categories.category_name
FROM products
CROSS JOIN categories;
4. JOIN과 조건문
SQL에서 특정 조건을 추가하면 JOIN 유형을 간접적으로 구현할 수 있다.
(1) LEFT JOIN 후 WHERE B.column IS NOT NULL을 사용하면 INNER JOIN과 동일
SELECT * FROM customers
LEFT JOIN orders ON customers.id = orders.customer_id
WHERE orders.id IS NOT NULL;
(2) LEFT JOIN 후 WHERE B.column IS NULL을 사용하면 B에 없는 데이터를 찾는 용도로 활용
SELECT * FROM customers
LEFT JOIN orders ON customers.id = orders.customer_id
WHERE orders.id IS NULL;
5. 성능 최적화
(1) JOIN 순서가 중요
PostgreSQL의 쿼리 플래너는 최적의 JOIN 순서를 자동으로 결정하지만, 대규모 데이터셋에서는 직접 최적화를 고려해야 한다.
대규모 데이터를 JOIN 했을 때 속도가 느리다면 INDEX로 속도 향상이 가능하다.
(2) JOIN 방식 비교
- HASH JOIN: 해시 테이블을 이용해 빠르게 JOIN 수행 (대량 데이터에 적합)
- NESTED LOOP JOIN: 한 테이블의 각 행을 다른 테이블과 비교 (소규모 데이터에 적합)
- MERGE JOIN: 정렬된 데이터를 기반으로 JOIN 수행 (인덱스 활용 가능)
EXPLAIN ANALYZE를 사용하면 쿼리 실행 계획을 확인하여 최적의 JOIN 방식을 선택할 수 있다.
6. 결론
PostgreSQL의 JOIN을 효과적으로 사용하면 데이터를 효율적으로 결합할 수 있다. 각 JOIN의 특성과 조건을 이해하고 활용하면 복잡한 데이터 분석과 조회 성능을 최적화할 수 있다. 또한 EXPLAIN ANALYZE를 활용해 실행 계획을 분석하고 최적화하는 것이 중요하다.
'POSTGRES & PYTHON > chat GPT와 함께하는 postgres & postgis' 카테고리의 다른 글
| PostgreSQL 기초 - DELETE, JOIN, INDEX (0) | 2025.02.11 |
|---|---|
| PostgreSQL 기초 쿼리 3가지 - INSERT, SELECT, UPDATE 문 (0) | 2025.02.11 |
| postgres 학습용 목차(feat. chat GPT) (1) | 2024.04.04 |