본문 바로가기
Database

[Database] - 서브쿼리란

by nam_ji 2024. 11. 10.

서브쿼리 개념 및 예시

서브쿼리란?

  • 한 쿼리 내에 포함된 또 하나의 쿼리입니다.
  • GROUP BY 절을 제외하고 모든 부분에서 사용 가능합니다.
  • 서브쿼리는 반드시 괄호 안에 포함되어야 합니다.


SELECT의 서브쿼리

SELECT [컬럼], (SELECT [컬럼] FROM [테이블] WHERE 조건) 
FROM [테이블]
WHERE 조건;
  • = 스칼라 서브쿼리입니다.
  • SELECT 절의 서브쿼리는 결과가 반드시 하나의 값이어야 합니다.

FROM의 서브쿼리

SELECT [컬럼]
FROM (SELECT [컬럼] FROM [테이블] WHERE [조건]) AS [별명] 
WHERE 조건;
  • =인라인 뷰 서브쿼리입니다.
  • FROM 절의 서브쿼리는 결과가 반드시 하나의 테이블이어야 합니다.
  • 서브쿼리로 만들 테이블은 alias가 필수입니다.

WHERE의 서브쿼리

SELECT [컬럼]
FROM [테이블]
WHERE [컬럼][연산자](SELECT [컬럼] FROM [테이블] WHERE 조건);
  • =중첩 서브쿼리→ 하나의 컬럼에는 여러 개의 값 존재할 수도 있습니다.
  • 일반적으로 WHERE [컬럼][연산자][서브쿼리] 형식으로 사용합니다.
  • WHERE 절의 서브쿼리는 결과가 반드시 하나의 컬럼이어야 합니다. 단, EXISTS 제외합니다.

연산자

1. 비교연산자

  • 서브쿼리에서 비교 연산자만 사용하는 경우, 서브쿼리의 결과 값이 반드시 하나의 값이어야 한다. 
  • 연산자 활용 의미
    = A = [서브쿼리] A와 [서브쿼리]의 결과 값이 같습니다.
    != A != [서브쿼리] A와 [서브쿼리]의 결과 값이 같지 않습니다.
    > A > [서브쿼리] A가 [서브쿼리]의 결과 값보다 큽니다.
    < A < [서브쿼리] A가 [서브쿼리]의 결과 값보다 작습니다.
    >= A >= [서브쿼리] A가 [서브쿼리]의 결과 값보다 크거나 같습니다.
    <= A <= [서브쿼리] A가 [서브쿼리]의 결과 값보다 작거나 같습니다.

2. 주요연산자

    • 주요 연산자 사용 시, 서브쿼리의 결과는 하나의 컬럼이어야 합니다.
    • EXISTS는 단독으로 사용 가능 & 결과값이 여러 컬럼이어도 가능합니다.
    • 연산자 활용 의미
      IN A IN ([서브쿼리]) A가 [서브쿼리]의 결과 값 내에 있습니다.
      ALL A < ALL([서브쿼리]) A가 모든 [서브쿼리]의 결과 값보다 작습니다.
      A > ALL([서브쿼리]) A가 모든 [서브쿼리]의 결과 값보다 큽니다.
      ANY A < ANY([서브쿼리]) A가 [서브쿼리]의 결과 값보다 하나라도 작습니다.
      A > ANY([서브쿼리]) A가 [서브쿼리]의 결과 값보다 하나라도 큽니다.
      EXISTS EXISTS([서브쿼리]) [서브쿼리]의 결과 값이 존재합니다.
      NOT EXISTS([서브쿼리]) [서브쿼리]의 결과 값이 존재하지 않습니다.
    •  ALL 연산자 사용 시 유의점
      • < (작다)와 사용 : 서브쿼리를 통해 도출되는 컬럼 값 중에서 가장 작은 값보다 비교하는 값이 작은 지 확인이 필요합니다.
      • > (크다)와 사용 : 서브쿼리를 통해 도출되는 컬럼 값 중에서 가장 큰 값보다 비교하는 값이 큰 지 확인이 필요합니다.
    • ANY 연산자 사용 시 유의점 
      • < (작다)와 사용 : 서브쿼리를 통해 도출되는 컬럼 값 중에서 가장 큰 값보다 비교하는 값이 작은 지 확인이 필요합니다.
        ex) 서브쿼리를 통해 도출된 컬럼이 (10, 50)이면 50보다 작은지를 비교합니다.
      • > (크다)와 사용 : 서브쿼리를 통해 도출되는 컬럼 값 중에서 가장 큰 값보다 비교하는 값이 큰 지 확인이 필요합니다.
         ex) 서브쿼리를 통해 도출된 컬럼이 (10, 50)이면 50보다 작은지를 비교합니다.

3. EXISTS 연산자

  • 값이 있으면 TRUE 없으면 FALSE 반환함