상세 컨텐츠

본문 제목

[SQL] subquery 종류 및 사용법 정리

SQL

by ollive 2024. 7. 16. 19:39

본문

서브쿼리란?

  • 쿼리안에 들어가는 쿼리를 이다.
  • SELECT, FROM, WHERE, HAVING, ORDER BY 등에 사용가능하다.
  • 외부쿼리와 내부쿼리로 구분되어 내부쿼리(서브쿼리)가 실행된 후, 외부쿼리가 실행된다.

 

사용하는 이유?

  • 쿼리를 구조화 시켜 각 부분이 명확하게 구분된다.
  • 복잡한 구조를 가독성 좋게 만들어 준다.

 


1. SELECT : SCALAR SUBQUERY

  • SELECT 에 오는 서브쿼리
  • 한번에 한 가지레코드만 처리한다.  두개 이상의 레코드는 처리하지 못한다.

예시 1) 왼쪽 테이블은 같은 값이 하나씩 존재하므로 오른쪽 테이블과 같은 값을 추출하여 인라인 서브쿼리로 붙일 수 있음
예시 2) 왼쪽테이블은 값이 중복되므로 오른쪽 테이블에 인라인 서브쿼리로 넣는다면 같은 값의 행을 처리할 수 없어 오류가 뜸 하지만 오른쪽 테이블을 왼쪽 테이블에 인라인 서브쿼리로 붙이는 것은 가능함

  • 일치하는 값이 없으면 NULL을 반환한다.
  • ORDER BY를 사용할 수 없다.

예시)

WITH RENT AS(SELECT car_id
             FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
             WHERE '2022-10-16' BETWEEN start_date AND end_date)

SELECT DISTINCT car_id
       ,IF (car_id in (table rent), '대여중','대여 가능') AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
ORDER BY 1 DESC

 

* 가져오는 행이 여러개일 경우 = 이 아니라 IN을 사용한다.

 

 

 


2. FROM : IN LINE SUBQUERY= IN LINE VIEW

  • FROM 에 오는 서브쿼리
  • 인라인 뷰에서 SELECT로 가져온 COLUMN만 사용가능하다
  • 서브쿼리의 결과를 임시적으로 테이블(derived table)처럼 사용할 수 있다.
  • 하나의 값을 반환할 수도 있고 하나의 COLUMN에 여러 행을 반환할 수도 있고, 하나의 테이블을 반환한 수도 있다.
  • 전체 테이블과 비교하는 것보다 데이터량이 적어서 속도가 빠르다.
  • 사용한 후에 Alias를 필수로 사용하여 구분한다.

예시) 'milk'와  ' yogurt' 가 모두 담긴 cart_id 구하기

SELECT CART_ID
-- 우유와 요거트만 있는 행을 추출하여 테이블처럼 사용함
FROM
    (SELECT CART_ID, NAME
    FROM CART_PRODUCTS
    WHERE NAME LIKE '%YOGURT%'
    UNION
    SELECT CART_ID, NAME
    FROM CART_PRODUCTS
    WHERE NAME LIKE '%MILK%' 
     ) A
GROUP BY CART_ID
HAVING COUNT(CART_ID) > 1
ORDER BY CART_ID

 

 

 

 


 

3.WHERE : 중첩 서브쿼리

SELECT ID, NAME, HOST_ID
FROM places 
-- 추출된 host_id들과 본식의 host_id의 값이 일치하면 SELECT 한다.
WHERE HOST_ID IN (SELECT host_id 
                 FROM places 
                 GROUP BY host_id
                 HAVING COUNT(id) >= 2)
ORDER BY id

 

  • ANY, SOME : 서브쿼리에 있는 값 중에 어느 하나라도 만족하면 TRUE
  • EXISTS : 서브쿼리에 있는 값 중에 조건에 만족하는 값이 있는지 확인하여 있을 경우 SELECT에 반환, 아닐 경우 반환하지 않음, NOT EXISTS로도 사용 가능
  • ALL : 서브쿼리에 있는 값과 모든 값을 만족하는 행을 반환

 

 

 

 

관련글 더보기