PostgreSQL - 서브쿼리
안녕하세요, 데이터베이스 열정가 여러분! 오늘은 PostgreSQL 서브쿼리의 fascineting 세계로 뛰어들어보겠습니다. 서브쿼리는 주 쿼리를 돕는 작은 도우미로 생각해보세요. 주 쿼리가 데이터를 검색하거나 조작하는 데 도움을 주는 것입니다. 그들은 당신의 좋아하는 슈퍼 헴어 영화에서의 신뢰할 수 있는 비서들처럼 - 항상 주목받지는 않지만, 임무를 완료하는 데 필수적입니다!
SELECT 문에서의 서브쿼리
서브쿼리의 가장 일반적인 사용법 중 하나는 SELECT 문 내에서입니다. 상상해보세요, 당신이 도서점을 운영하고, 평균 가격 이상인 책을 찾고 싶다면 어떻게 할까요? 다음과 같이 할 수 있습니다:
SELECT title, price
FROM books
WHERE price > (SELECT AVG(price) FROM books);
이 쿼리에서, (SELECT AVG(price) FROM books)
부분이 서브쿼리입니다. 이 서브쿼리는 모든 책의 평균 가격을 계산하고, 주 쿼리는 이 값을 사용하여 결과를 필터링합니다.
이를 구분해보겠습니다:
- 서브쿼리는 평균 가격을 계산합니다.
- 주 쿼리는 각 책의 가격을 이 평균과 비교합니다.
- 평균 이상의 가격을 가진 책만 반환됩니다.
다른 예제를 보겠습니다. 모든 주문을 한 고객을 찾고 싶다면 어떻게 할까요?
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