앞에서 INSERT, SELECT, UPDATE를 배웠다면, 이제 데이터 삭제, 테이블 조인, 성능 최적화 방법까지 익혀보자.
이 3가지 개념은 실무에서 반드시 사용되므로, 자세한 설명과 예제와 함께 정리해보겠다.

 


 

1. 데이터 삭제 (DELETE & TRUNCATE)

1) 자세한 설명

PostgreSQL에서 데이터를 삭제하는 방법은 크게 두 가지가 있다.

  • DELETE: 특정 조건을 만족하는 데이터만 삭제
  • TRUNCATE: 테이블의 모든 데이터를 한 번에 삭제

주의할 점

  • DELETE는 WHERE 절이 없으면 모든 데이터가 삭제되므로 반드시 조건을 넣어야 한다.
  • TRUNCATE는 빠르게 전체 데이터를 삭제하지만, ROLLBACK이 불가능하다.

 

2) 자세한 예시

사용자 데이터를 삭제하는 기본 예제

DELETE FROM users WHERE id = 3;

 

위 쿼리는 id = 3인 사용자만 삭제한다.

 

 

만약 모든 데이터를 삭제하고 싶다면?

DELETE FROM users;

 

하지만 이 방법은 속도가 느리다. 더 빠르게 삭제하려면 TRUNCATE를 사용하자.

 

TRUNCATE TABLE users;

 

TRUNCATE 는 테이블을 초기화하는 방법이라 성능이 뛰어나지만 되돌릴 수 없으므로 주의해야 한다

 


 

 

3) 실전 예시

쇼핑몰에서 30일 이상 주문이 없는 사용자 데이터를 삭제하는 경우

DELETE FROM users
WHERE id NOT IN (
    SELECT DISTINCT user_id FROM orders 
    WHERE order_date > NOW() - INTERVAL '30 days'
);

 

이렇게 하면 최근 30일 내 주문 기록이 없는 사용자만 삭제된다.

 


 

2. 테이블 조인 (JOIN) 기초

1) 자세한 설명

데이터베이스에서는 여러 개의 테이블을 조합해야 하는 경우가 많다.
예를 들어 users 테이블과 orders 테이블이 따로 있을 때, 특정 사용자의 주문 내역을 조회하려면 JOIN이 필요하다.

JOIN의 종류

  • INNER JOIN: 조건이 일치하는 데이터만 연결
  • LEFT JOIN: 왼쪽 테이블의 모든 데이터를 가져오고, 오른쪽 테이블에 일치하는 데이터가 없으면 NULL 반환
  • RIGHT JOIN: 오른쪽 테이블의 모든 데이터를 가져오고, 왼쪽 테이블에 일치하는 데이터가 없으면 NULL 반환
  • FULL JOIN: 두 테이블을 모두 합쳐서 조회

 

2) 자세한 예시

사용자 정보와 주문 정보를 연결하는 예제

SELECT users.id, users.name, orders.product_name, orders.price 
FROM users 
INNER JOIN orders ON users.id = orders.user_id;

 

위 쿼리는 users 테이블과 orders 테이블을 조인해서 사용자의 주문 내역을 조회한다.

 

만약 주문이 없는 사용자도 함께 조회하고 싶다면?

SELECT users.id, users.name, orders.product_name, orders.price 
FROM users 
LEFT JOIN orders ON users.id = orders.user_id;

 

이렇게 하면 주문이 없는 사용자도 함께 표시되며, 주문 내역이 없는 경우 NULL이 들어간다.

 


 

3) 실전 예시

사용자별 총 주문 금액을 조회하는 실전 예제

SELECT users.id, users.name, SUM(orders.price) AS total_spent
FROM users
LEFT JOIN orders ON users.id = orders.user_id
GROUP BY users.id, users.name
ORDER BY total_spent DESC;

 

이렇게 하면 사용자별 총 주문 금액을 조회하고, 가장 많이 지출한 사용자 순으로 정렬할 수 있다.

 


 

3. 성능 최적화를 위한 인덱스 (INDEX) 기초

1) 자세한 설명

PostgreSQL에서 데이터가 많아질수록 SELECT 속도가 느려질 수 있다.
이를 해결하기 위해 **INDEX(인덱스)**를 사용하면 검색 속도를 대폭 향상시킬 수 있다.

INDEX의 종류

  • B-TREE 인덱스: 가장 일반적인 인덱스로, 대부분의 검색 쿼리에 적합
  • HASH 인덱스: 빠른 정확한 검색(= 연산)에 적합
  • GIN/GiST 인덱스: JSON, 배열, 풀텍스트 검색 등에 사용

 

2) 자세한 예시

사용자의 이메일을 자주 검색한다면 인덱스를 추가하면 좋다.

CREATE INDEX idx_users_email ON users(email);

 

이제 다음과 같은 쿼리의 속도가 빨라진다.

 

SELECT * FROM users WHERE email = 'test@example.com';

 

인덱스를 추가하면 쿼리 실행 시간이 획기적으로 줄어든다!

 


 

3) 실전 예시

쇼핑몰에서 자주 검색되는 상품명을 빠르게 찾기 위한 인덱스 적용

CREATE INDEX idx_products_name ON products(product_name);

 

이제 상품을 검색할 때 속도가 훨씬 빨라진다.

 

SELECT * FROM products WHERE product_name ILIKE '%노트북%';

 

만약 상품명이 길고 자주 부분 검색을 한다면 GIN 인덱스를 활용할 수도 있다.

 

CREATE INDEX idx_products_name_gin ON products USING GIN (to_tsvector('english', product_name));

 

이렇게 하면 대용량 데이터에서 빠르게 키워드 검색을 수행할 수 있다.

 


마무리

이제 PostgreSQL에서 필수적으로 알아야 할 DELETE, JOIN, INDEX까지 배웠다!

DELETE: 데이터를 안전하게 삭제하는 방법
JOIN: 여러 개의 테이블을 연결하여 데이터 조회
INDEX: 검색 성능을 최적화하여 속도를 높이는 방법

이제 PostgreSQL을 실무에서 더욱 효과적으로 사용할 수 있을 것이다.
다음에는 좀 더 심화된 내용을 다루어보자! 🚀

+ Recent posts