PostgreSQL - 서브쿼리

안녕하세요, 데이터베이스 열정가 여러분! 오늘은 PostgreSQL 서브쿼리의 fascineting 세계로 뛰어들어보겠습니다. 서브쿼리는 주 쿼리를 돕는 작은 도우미로 생각해보세요. 주 쿼리가 데이터를 검색하거나 조작하는 데 도움을 주는 것입니다. 그들은 당신의 좋아하는 슈퍼 헴어 영화에서의 신뢰할 수 있는 비서들처럼 - 항상 주목받지는 않지만, 임무를 완료하는 데 필수적입니다!

PostgreSQL - Sub Queries

SELECT 문에서의 서브쿼리

서브쿼리의 가장 일반적인 사용법 중 하나는 SELECT 문 내에서입니다. 상상해보세요, 당신이 도서점을 운영하고, 평균 가격 이상인 책을 찾고 싶다면 어떻게 할까요? 다음과 같이 할 수 있습니다:

SELECT title, price
FROM books
WHERE price > (SELECT AVG(price) FROM books);

이 쿼리에서, (SELECT AVG(price) FROM books) 부분이 서브쿼리입니다. 이 서브쿼리는 모든 책의 평균 가격을 계산하고, 주 쿼리는 이 값을 사용하여 결과를 필터링합니다.

이를 구분해보겠습니다:

  1. 서브쿼리는 평균 가격을 계산합니다.
  2. 주 쿼리는 각 책의 가격을 이 평균과 비교합니다.
  3. 평균 이상의 가격을 가진 책만 반환됩니다.

다른 예제를 보겠습니다. 모든 주문을 한 고객을 찾고 싶다면 어떻게 할까요?

SELECT customer_name
FROM customers
WHERE customer_id IN (SELECT DISTINCT customer_id FROM orders);

이 경우, 서브쿼리 (SELECT DISTINCT customer_id FROM orders)는 주문을 한 고객의 ID 목록을 반환합니다. 주 쿼리는 이 목록을 사용하여 고객 테이블을 필터링합니다.

INSERT 문에서의 서브쿼리

이제 INSERT 문에서 서브쿼리를 어떻게 사용할 수 있는지 살펴보겠습니다. 상상해보세요, 'featured books' 테이블을 생성하고, 1000부 이상 판매된 모든 책을 이 테이블에 추가하고 싶습니다:

INSERT INTO featured_books (book_id, title, author)
SELECT book_id, title, author
FROM books
WHERE book_id IN (SELECT book_id FROM sales WHERE copies_sold > 1000);

이 경우, 서브쿼리 (SELECT book_id FROM sales WHERE copies_sold > 1000)는 1000부 이상 판매된 책의 ID를 찾습니다. 주 쿼리는 이 책들의 세부 정보를 featured_books 테이블에 추가합니다.

UPDATE 문에서의 서브쿼리

서브쿼리는 UPDATE 문에서도 매우 유용할 수 있습니다. 예를 들어, 5권 이상의 책을 쓴 저자의 책에 10% 할인을 주고 싶다면 어떻게 할까요?

UPDATE books
SET price = price * 0.9
WHERE author_id IN (
SELECT author_id
FROM books
GROUP BY author_id
HAVING COUNT(*) > 5
);

이 예제에서, 서브쿼리는 5권 이상의 책을 쓴 저자를 식별합니다. 주 쿼리는 이 저자의 책 가격을 업데이트합니다.

DELETE 문에서의 서브쿼리

마지막으로, DELETE 문에서 서브쿼리를 어떻게 사용할 수 있는지 살펴보겠습니다. 예를 들어, 최근 1년 동안 구매를 하지 않은 고객의 주문을 모두 제거하고 싶다면 어떻게 할까요?

DELETE FROM orders
WHERE customer_id IN (
SELECT customer_id
FROM customers
WHERE last_purchase_date < CURRENT_DATE - INTERVAL '1 year'
);

이 경우, 서브쿼리는 최근 1년 동안 구매를 하지 않은 고객을 찾습니다. 주 쿼리는 이 고객의 주문을 모두 제거합니다.

일반 서브쿼리 메서드

다음은 PostgreSQL에서 일반적으로 사용되는 서브쿼리 메서드 표입니다:

메서드 설명 예제
IN 값이 서브쿼리 결과 set에 포함되어 있는지 확인합니다 WHERE id IN (SELECT id FROM table)
EXISTS 서브쿼리가 행을 반환하는지 확인합니다 WHERE EXISTS (SELECT 1 FROM table WHERE condition)
ANY 서브쿼리 값 중 하나가 조건을 만족하는지 확인합니다 WHERE column > ANY (SELECT column FROM table)
ALL 서브쿼리 값 모두가 조건을 만족하는지 확인합니다 WHERE column > ALL (SELECT column FROM table)

기억하세요, 연습이 완벽을 만듭니다! 자신만의 쿼리를 작성하고, 다양한 시나리오를 시험해보세요. 실수를 두려워하지 마세요. 그것이 우리가 배우고 성장하는 방법입니다!

마지막으로, 제 교육 경험 중 하나를 나누겠습니다. 제가 가르치는 학생 중 한 명은 서브쿼리를 잘못 이해하고 있었습니다. 그는 주 쿼리와 서브쿼리를 혼동하고 있었습니다. 그래서 저는 그에게 러시아 nesting doll을 생각하라고 말했습니다 - 가장 작은 인형(서브쿼리)이 가장 큰 인형(주 쿼리) 안에 들어맞습니다. 이 시각적인 도움으로 그는 곧 복잡한 쿼리를 작성할 수 있게 되었습니다!

이 튜토리얼이 PostgreSQL 서브쿼리를 이해하는 데 도움이 되길 바랍니다. 계속 쿼리를 작성하고, 배우고, 가장 중요한 것은 데이터베이스에 즐거움을 느끼세요!

Credits: Image by storyset