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 JOINLEFT 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 JOINLEFT JOINRIGHT 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 JOINWHERE 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 JOINWHERE 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를 활용해 실행 계획을 분석하고 최적화하는 것이 중요하다.

 

 

PostgreSQL은 강력한 기능을 제공하는 오픈소스 데이터베이스다. 하지만 처음 접하면 SQL 문법이 어렵게 느껴질 수도 있다. 그래서 초보자가 반드시 알아야 할 기본 쿼리 3가지를 정리해보았다.

이 글에서는 **데이터 삽입(INSERT), 조회(SELECT), 수정(UPDATE)**을 다룰 예정이다. 예제와 실전 예제도 함께 보면서 익혀보자!

 

 

1. 데이터 삽입 (INSERT INTO)

1) 설명

PostgreSQL에서 데이터를 추가할 때 사용하는 기본적인 쿼리다.
새로운 레코드를 테이블에 추가하려면 INSERT INTO를 사용한다.

2) 기본 예제

다음은 users 테이블이 있다고 가정하고, 새로운 사용자를 추가하는 예제다.

 

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50),
    age INT,
    email VARCHAR(100)
);

INSERT INTO users (name, age, email)
VALUES ('김철수', 30, 'chulsoo@example.com');

 

 

3) 실전 예제

예를 들어 쇼핑몰의 orders 테이블에 새로운 주문을 추가하는 경우를 생각해보자.

 

CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    user_id INT,
    product_name VARCHAR(100),
    price DECIMAL(10,2),
    order_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO orders (user_id, product_name, price)
VALUES (1, '무선 키보드', 45000);

 

위와 같이 실행하면, orders 테이블에 새로운 주문이 추가된다.

 


 

2. 데이터 조회 (SELECT)

1) 설명

테이블에 저장된 데이터를 가져오려면 SELECT 문을 사용한다.
특정 컬럼만 선택할 수도 있고, 모든 데이터를 가져올 수도 있다.

2) 기본 예제

모든 유저 정보를 가져오는 가장 기본적인 쿼리다.

-- 특정 컬럼 조회
SELECT * FROM users;

-- 조건(where) 추가시 특정 데이터 조회
SELECT * FROM users WHERE age > 25;

 

3) 실전 예제

만약 특정 사용자의 주문 목록을 조회하고 싶다면?

 

SELECT order_id, product_name, price, order_date
FROM orders
WHERE user_id = 1
ORDER BY order_date DESC;

위 쿼리는 user_id가 1인 사용자의 주문 목록을 최신 주문부터 정렬해서 보여준다.

 


 

3. 데이터 수정 (UPDATE)

1) 설명

데이터를 수정할 때는 UPDATE 문을 사용한다.
UPDATE는 특정 조건을 지정하지 않으면 모든 데이터가 변경될 위험이 있으므로 WHERE 절을 항상 포함해야 한다.

2) 기본 예제

예를 들어, 사용자의 나이를 수정하는 쿼리는 다음과 같다.

UPDATE users
SET age = 31
WHERE name = '김철수';

 

여러 개의 컬럼을 동시에 수정할 수도 있다.

UPDATE users
SET age = 32, email = 'newemail@example.com'
WHERE name = '김철수';

 

3) 실전 예제

쇼핑몰에서 특정 사용자의 주문 금액을 수정해야 하는 경우를 생각해보자.

UPDATE orders
SET price = 40000
WHERE order_id = 1;

 

또는, 특정 날짜 이후의 모든 주문에 대해 할인을 적용하는 경우

UPDATE orders
SET price = price * 0.9  -- 10% 할인 적용
WHERE order_date > '2024-01-01';

 

위와 같이 실행하면 2024년 1월 1일 이후의 모든 주문 금액이 10% 할인된다.

 


PostgreSQL의 기본적인 3가지 쿼리(INSERT, SELECT, UPDATE)에 대해 알아보았다.

 

INSERT: 데이터를 추가할 때 사용
SELECT: 데이터를 조회할 때 사용
UPDATE: 데이터를 수정할 때 사용

 

이 3가지만 확실히 익혀도 PostgreSQL의 기본적인 조작이 가능할 것 같다. 

앞으로 갈길이 멀다 !

안녕하세요 !

chat GPT와 함께 postgres에 관한 학습용 블로그를 함께 만들어 볼까요?

 

소개 및 기초 개념

1.  POSTGRES란 무엇인가?
 - 데이터베이스의 기본 개념과 용어
 - POSTGRES의 특징과 장점 소개
 - 설치 및 환경 구성

2. POSTGRES 설치하기
 -  데이터베이스 생성 및 설정
 -  클라이언트 도구 소개 (pgAdmin, psql 등)
 -  테이블 관리

3. 테이블 생성하기
 -  데이터 유형과 제약 조건
 -  테이블 수정과 삭제
 -  데이터 조작

4. 데이터 삽입, 수정, 삭제하기
 -  데이터 조회를 위한 SELECT 문 활용
 -  다양한 필터링 및 정렬 방법 소개
 -  인덱싱과 성능 최적화

5. 인덱스의 개념과 종류
 -  쿼리 성능 향상을 위한 인덱스 사용법
 -  성능 최적화를 위한 팁과 기법
 -  집계 함수와 그룹화

6. 집계 함수의 개념과 종류
 -  GROUP BY와 HAVING 절 활용
 -  데이터 그룹화를 통한 분석 및 보고서 작성
 -  서브쿼리와 조인

7. 서브쿼리의 개념과 활용
 -  다양한 종류의 조인 (INNER JOIN, OUTER JOIN 등)
 -  조인을 활용한 복잡한 데이터 추출 방법
 -  트랜잭션과 동시성 제어

8. 트랜잭션 개념 및 ACID 속성 소개
 -  동시성 제어를 위한 LOCK과 트랜잭션 관리
 -  병행성 문제 해결을 위한 방법 소개
 -  데이터베이스 보안

9. 사용자 및 권한 관리
 -  접근 제어 및 보안 정책 설정
 -  보안 취약점 대응 및 보안 강화 방법
 -  고급 주제

10. Window 함수의 활용
 -  JSON 데이터 다루기
 -  GIS 데이터 처리를 위한 POSTGIS 소개

+ Recent posts