안녕하세요. 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 강좌 책 구매

강좌가 도움이 되셨다면, 책으로 구매 가능합니다. 책 판매 수익금은 전액 코딩 교육 사회공헌 활동에 기부되며, 아래 링크에서 구매하시면 더 많은 금액이 기부됩니다. 

 

책구매 링크: 챗GPT와 함께하는 마이크로소프트 SQL Server 2022 

책구매링크.png

No. Subject Author Date Views
Notice SQL강좌: 챗GPT와 함께 배우는 SQL Server 무료 강좌 목차와 소개 (2023년 9월 업데이트) 코난(김대우) 2023.08.18 13580
Notice Python 무료 강좌 - 기초, 중급, 머신러닝(2023년 6월 업데이트) 코난(김대우) 2021.01.01 8394
2234 SQL강좌: 2-12. SQL UNION 연산자 코난(김대우) 2023.08.18 30
2233 SQL강좌: 2-11. SELECT INTO - 쿼리 결과를 테이블로 복사 코난(김대우) 2023.08.18 62
» SQL강좌: 2-10. 하위 쿼리(Subquery-서브쿼리) 코난(김대우) 2023.08.18 41
2231 SQL강좌: 2-9. JOIN - 테이블 연결 file 코난(김대우) 2023.08.18 63
2230 SQL강좌: 2-8. GROUP BY, ROLLUP, CUBE 코난(김대우) 2023.08.18 69
2229 SQL강좌: 2-7. ORDER BY 결과 정렬 코난(김대우) 2023.08.18 36
2228 SQL강좌: 2-6. DISTINCT 문을 이용한 중복 제거 코난(김대우) 2023.08.18 43
2227 SQL강좌: 2-5. WHERE절의 조건에 의한 행의 검색 코난(김대우) 2023.08.18 56
2226 SQL강좌: 2-4. 데이터형(Data type)과 함수(Function) 코난(김대우) 2023.08.18 58
2225 SQL강좌: 2-3. SELECT - 컬럼선택 file 코난(김대우) 2023.08.18 86
2224 SQL강좌: 2-2. 데이터 검색 - SELECT 구문 file 코난(김대우) 2023.08.18 93
2223 SQL강좌: 2-1. T-SQL SQL Server 언어에 대한 간단한 소개 file 코난(김대우) 2023.08.18 90
2222 SQL강좌: 1-11. 예제 데이터베이스 설치 코난(김대우) 2023.08.18 110
2221 SQL강좌: 1-10. SQL Server 2022 관리 도구 소개 [2] file 코난(김대우) 2023.08.18 78
2220 SQL강좌: 1-9. 업그레이드와 설치 제거 file 코난(김대우) 2023.08.18 40
2219 SQL강좌: 1-8. SQL Server 2022 설치 - 컨테이너 file 코난(김대우) 2023.08.18 43
2218 SQL강좌: 1-7. SQL Server 2022 설치 - 리눅스 file 코난(김대우) 2023.08.18 51
2217 SQL강좌: 1-6. SQL Server 2022 설치 - 윈도 [2] file 코난(김대우) 2023.08.18 144
2216 SQL강좌: 1-5. SQL클라우드와 On-Premise file 코난(김대우) 2023.08.18 69
2215 SQL강좌: 1-4. SQL Server 설치 전 점검사항 file 코난(김대우) 2023.08.18 69





XE Login