inblog logo
|
soultree
    OracleSQL

    [SQL] 서브쿼리 (SUBQUERY)

    서브쿼리(Subquery)는 하나의 쿼리 안에 존재하는 또 다른 쿼리이다.
    Hi's avatar
    Hi
    Aug 12, 2024
    [SQL] 서브쿼리 (SUBQUERY)
    Contents
    ✅ 1. 위치에 따른 서브쿼리✅ 2. 다중 행 서브쿼리✅ 3. 스칼라 서브쿼리✅ 4. 인라인 뷰✅ 5. 중첩 서브쿼리

    💡
    서브쿼리(Subquery)는 하나의 쿼리 안에 존재하는 또 다른 쿼리이다.
    ✅ 1. 위치에 따른 서브쿼리✅ 2. 다중 행 서브쿼리✅ 3. 스칼라 서브쿼리☑️ 1) 스칼라 서브쿼리가 위치할 수 있는 곳✅ 4. 인라인 뷰✅ 5. 중첩 서브쿼리☑️ 1) 비연관 서브쿼리☑️ 2) 연관 서브쿼리☑️ 3) 반환하는 데이터 형태
     
     

    ✅ 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
    Contents
    ✅ 1. 위치에 따른 서브쿼리✅ 2. 다중 행 서브쿼리✅ 3. 스칼라 서브쿼리✅ 4. 인라인 뷰✅ 5. 중첩 서브쿼리

    soultree

    RSS·Powered by Inblog