안녕하세요. SQLER의 코난 김대우입니다.
이번 강좌에서는, 2-10. 하위 쿼리(Subquery-서브쿼리)를 진행 하겠습니다.
SQLER에서 진행되는, 챗GPT와 함께 배우는 SQL Server 강좌 목록
이번 강좌에서 소개해 드릴 내용은 하위 쿼리(Subquery-서브쿼리)입니다. 예전에는 “부질의”로 번역했으나, “하위 쿼리”로 공식 번역해 사용됩니다. 강좌에서는 서브쿼리 또는 하위 쿼리를 혼용해 사용합니다.
TL;DR
하위 쿼리는 중첩된 SQL 쿼리로, SELECT, FROM, WHERE 절에서 사용할 수 있습니다. 대부분의 하위 쿼리는 JOIN으로 변환 가능하며, 효율성을 고려해 JOIN을 사용을 권장합니다.
하위 쿼리란 무엇인가
SQL 쿼리 내에 중첩된 SQL 쿼리입니다. SELECT 절이나 FROM 절, WHERE 절 등에서 하위 쿼리를 사용해 쿼리를 중첩시킬 수 있습니다.
예제를 보면서 말씀드리겠습니다. 지난 JOIN 강좌에서 생성한 products 테이블을 이용합니다.
값을 받아 WHERE 조건 필터링에 사용
제품 가격이 평균 가격보다 높은 제품만 출력하려면 어떻게 해야 할까요?
SELECT product_name, price FROM products WHERE price > (SELECT AVG(price) FROM products); GO
결과
product_name
|
price |
포테토칩 | 1800 |
꼬북칩 | 1300 |
위 SQL 쿼리의 SELECT AVG(price) FROM products 결과는 1275입니다. 결과적으로 WHERE price > 1275로 처리됩니다.
하위 쿼리 결과 셋을 FROM 절의 테이블로 사용
SELECT orders.order_id, customers.customer_name FROM (SELECT * FROM orders WHERE order_date > '2022-03-01') AS orders JOIN customers ON orders.customer_id = customers.customer_id; GO
결과
order_id
|
customer_name |
3 | 손석구 |
4 | 손석구 |
주문 테이블과 고객 테이블을 JOIN 합니다. 이때, 주문일을 필터링해서 부분결과만 가지고 JOIN을 수행한 다음 결과를 출력합니다.
SELECT 절에서 하위 쿼리 적용
제품에 대해 전체 주문 수를 카운트할 때 아래처럼 하위 쿼리를 사용합니다.
SELECT product_name, (SELECT COUNT(*) FROM orders WHERE orders.product_id = products.product_id) AS total_orders FROM products; GO
결과
product_name
|
total_orders |
초코파이 | 1 |
칸쵸 | 2 |
포테토칩 | 1 |
꼬북칩 | 0 |
WHERE 절의 IN에서 하위 쿼리 사용
많이 사용되는 처리입니다. IN 또는 EXISTS와 함께 서브 쿼리의 결과를 필터로 쿼리 합니다.
SELECT product_name FROM products WHERE product_id IN ( SELECT product_id FROM orders WHERE order_date > '2022-02-01' ); GO
결과
product_name
|
칸쵸 |
포테토칩 |
하위 쿼리 제약사항
- 단일 값을 리턴한다면 하위 쿼리 표현식이 허용되는 모든 곳에서 사용 가능.
- 텍스트와 이미지 자료형 컬럼은 허용되지 않음.
- EXISTS를 포함하는 경우, select_list는 *로 구성되어야 함.
- 여러 번 중첩된 하위 쿼리도 수행 가능.
하위 쿼리와 JOIN
대부분의 하위 쿼리를 JOIN으로 변환해 사용이 가능합니다. JOIN과 하위 쿼리 중 어떤 것이 더 효율적일까요?
공식 가이드에 따르면 대부분의 경우 JOIN 사용을 권장하고 있습니다.
하위 쿼리는 사용자가 쿼리의 실행 순서를 임의로 지정하는 방식입니다. (대부분의 경우 쿼리 실행 계획이 생성되면서, 실행 순서가 풀리고 SQL Server 쿼리 최적화기가 재정의 하기도 합니다.) JOIN은 실행될 때, SQL Server 쿼리 최적화기(쿼리 실행계획을 수립)가 JOIN구문을 먼저 분석 후 최적화된 실행 계획을 세워 수행하므로 특수한 경우를 제외하고 더 빠르게 수행됩니다.
JOIN 또는 하위 쿼리 중 선택해서 사용해야 할 경우라면 JOIN을 먼저 염두에 두고 쿼리를 작성하세요.
SQL 강좌 책 구매
강좌가 도움이 되셨다면, 책으로 구매 가능합니다. 책 판매 수익금은 전액 코딩 교육 사회공헌 활동에 기부되며, 아래 링크에서 구매하시면 더 많은 금액이 기부됩니다.