CS/DataBase

[데이터베이스] 서브쿼리

아란정 2025. 3. 8. 00:29

쿼리(select ~) 안에 또 쿼리(select from ~ ) 형식을 가지는 것을 서브쿼리라 한다. 

즉, JOIN처럼 값을 가져오기 위함인데 가상의 테이블을 만든다고 생각하면 된다. 

‼️ 모든 서브쿼리는 괄호() 안에 포함되어야 한다.

  • select, from, where 절에서 사용 가능

 

  • Scalar subquery : 단일값
    • Select, where, having
  • Table subquery : 테이블이 반환 
    • From절에서 사용되는데 별칭 필수 => INLINE VIEW
  • Correlated subquery : 메인 쿼리의 각 행을 참조하여 수행
    • Where에서 사용

 

Scalar subquery

SELECT productName,buyPrice
FROM products
WHERE buyPrice > (SELECT AVG(buyPrice) FROM products);

집계함수(avg)로 단일값 반환한다. where이 붙어있으면 조건에 맞는 값을 모두 반환하니 단일값이 아닐 가능성이 높음!

 

Table subquery

SELECT customerNumber,order_count
FROM 
	(SELECT customerNumber,
    	COUNT(orderNumber) AS order_count 
     FROM orders 
     GROUP BY customerNumber) AS subquery
WHERE order_count >= 5;

‼️ from 절 안에 있는 서브쿼리가 As 로 alias를 가지는 것 확인!!

 

Correlated subquery

SELECT c.customerName, o.orderDate
FROM customers c, orders o
WHERE c.customerNumber = o.customerNumber
AND o.orderDate = (SELECT MAX(orderDate)
				FROM orders 
                    WHERE customerNumber = c.customerNumber);

상관(연관) 서브쿼리는 메인 쿼리의 각 행에 대해 별도로 실행되므로, 메인쿼리 행 개수만큼 반복 실행한다. 또한, 메인 쿼리의 열을 참조하므로 메인 쿼리 현재 행에 따른 값 반환도 가능하다. 

메인 쿼리의 값을 참조하기 때문에 ‼️ FROM 절에는 correlated 서브쿼리 사용이 불가능하다. 독립적으로 실행되어야 하기 때문!!

더보기

메인 쿼리의 매 행에 대해 실행된다는 뜻은, 메인쿼리에서 where customerNumber 값이 103이면 서브쿼리 where 절의 c.customerNumber에 103이 참조되어 서브쿼리가 실행된다는 것이다. 즉, 각각의 customerNumber 행에 대해 서브쿼리가 실행된다.