[SQL] 서브쿼리 (SUBQUERY)

서브쿼리(Subquery)는 하나의 쿼리 안에 존재하는 또 다른 쿼리이다.
Hi's avatar
Aug 12, 2024
[SQL] 서브쿼리 (SUBQUERY)

💡
서브쿼리(Subquery)는 하나의 쿼리 안에 존재하는 또 다른 쿼리이다.
 
 

✅ 1. 위치에 따른 서브쿼리

  • SELECT 절: 스칼라 서브쿼리(Scalar Subquery)
  • FROM 절: 인라인 뷰(Inline View)
  • WHERE, HAVING 절: 중첩 서브쿼리(Nested Subquery)
 

✅ 2. 다중 행 서브쿼리

  • 다중 행이 나오는 서브쿼리의 경우, = 조건과 함께 사용할 수 없고 IN 절과 함께 사용할 수 있다.
 

✅ 3. 스칼라 서브쿼리

💡
주로 SELECT 절에 위치하지만, 컬럼이 올 수 있는 대부분의 위치에 사용할 수 있다. 컬럼 대신 사용되므로 반드시 하나의 값만 반환해야 한다.
 

☑️ 1) 스칼라 서브쿼리가 위치할 수 있는 곳

  • SELECT 절
  • UPDATE 문의 SET 절
  • ORDER BY 절
→ 하나의 값을 가진 컬럼이 오는 절
 
 
SELECT M.PRODUCT_CODE, (SELECT S.PRODUCT_NAME FROM PRODUCT S WHERE S.PRODUCT_CODE = M.PRODUCT_CODE) AS PRODUCT_NAME, FROM PRODUCT_REVIEW M
스칼라 서브쿼리를 사용하여 PRODUCT_REVEIW 테이블에 존재하지 않는 PRODUCT_NAME 데이터를 출력할 수 있다.
 

✅ 4. 인라인 뷰

💡
FROM 절 등 테이블명이 올 수 있는 위치에 사용이 가능하다.
 
SELECT M.PRODUCT_CODE S.PRODUCT_NAME FROM PRODUCT_REVIEW M, (SELECT PRODUCT_CODE FROM PRODUCT) S WHERE M.PRODUCT_CODE = S.PRODUCT_CODE
해당 쿼리에서만 사용되는 뷰를 일시적으로 만들어준다.
 

✅ 5. 중첩 서브쿼리

💡
WHERE 절과 HAVING 절에 사용할 수 있다.
 
중첩 서브쿼리는 메인쿼리와의 관계에 따라 2가지로 나뉜다.
  • 비연관 서브쿼리: 메인쿼리와 관계를 맺고 있지 않음.
  • 연관 서브쿼리: 메인쿼리와 관계를 맺고 있음.
 

☑️ 1) 비연관 서브쿼리

SELECT NAME, JOB FROM ENTERTAINER WHERE AGENCY_CODE = (SELECT AGENCY_CODE FROM AGENCY WHERE AGENCY_NAME = 'ABC')
서브쿼리 내에 메인쿼리의 컬럼이 존재하지 않는다.
 

☑️ 2) 연관 서브쿼리

SELECT ORDER_NO, DRINK_CODE, CNT FROM CAFE_ORDER WHERE ORDER_CNT = (SELECT MAX(ORDER_CNT) FROM CAFE_ORDER B WHERE B.DRINK_CODE = A.DRINK_CODE)
서브쿼리 내에 메인쿼리의 컬럼이 존재한다.
 

☑️ 3) 반환하는 데이터 형태

  • 단일 행 서브쿼리
    • 서브쿼리가 1건 이하의 데이터를 반환
    • 단일 행 비교 연산자와 함께 사용
    • EX. =, <, >, <=, >=, <>
SELECT * FROM PRODUCT WHERE PRICE = (SELECT MAX(PRICE) FROM PRODUCT);
가격이 가장 높은 상품의 정보 조회
 
  • 다중 행 서브쿼리
    • 서브쿼리가 여러 건의 데이터를 반환
    • 다중 행 비교 연산자와 함께 사용
    • EX. IN, ALL, ANY, SOME, EXISTS
SELECT * FROM PRODUCT WHERE PRODUCT_CODE IN (SELECT PRODUCT_CODE FROM PRODUCT_REVIEW);
리뷰가 존재하는 상품 정보 조회
 
  • 다중 컬럼 서브쿼리
    • 서브쿼리가 여러 컬럼의 데이터를 반환
SELECT * FROM EMPLOYEES WHERE (JOB_ID, SALARY) IN (SELECT JOB_ID, MAX_SALARY FROM JOBS WHERE MAX_SALARY = 10000);
최대 급여가 10000이고, 최대 급여를 받는 직원의 정보를 조회
 
 
Share article

soultree