Skip to content

Latest commit

 

History

History
99 lines (84 loc) · 3.22 KB

sub-query.md

File metadata and controls

99 lines (84 loc) · 3.22 KB

서브쿼리

하나의 쿼리 문장 내에 포함된 또 하나의 쿼리 문장

  • 비교연산자의 오른쪽에 기술해야 하고 반드시 괄호 안에 넣어야 함
  • 메인쿼리가 실행되기 이전에 한 번만 실행됨

서브쿼리를 사용 가능한 곳

  • SELECT 절
  • FROM 절
  • WHERE 절
  • HAVING 절
  • ORDER BY 절
  • INSERT 문의 VALUSE 절
  • UPDATE 문의 SET 절

1. 서브쿼리의 분류

1-1. 스칼라 서브쿼리 - Scalar Subqueries

SELECT 절 안에 서브쿼리가 들어있다.

  • 리턴할 수 있는 최대 데이터가 1개이다.

    서브쿼리의 결과는 반드시 단일 행이나 SUM, COUNT 등의 집계 함수를 거친 단일 값으로 리턴되어야 한다.

  • 찾고자 하는 데이터가 없는 경우 NULL를 반환한다.
  • 값에 대한 캐싱이 가능하다.

홍길동 학생의 학과를 조회한다고 가정하면 다음과 같다.

SELECT 학생이름,
        (   
            SELECT 학과.학과이름
            FROM 학과
            WHERE 학과.학과ID = 학생.학생ID ) AS 학과이름
FROM 학생
WHERE 학생이름 = '홍길동';

1-2. 인라인 뷰 서브쿼리 - Inline View subqueries

FROM 절 안에 서브쿼리가 들어있다.

  • 서브쿼리의 결과는 반드시 하나의 테이블로 리턴되어야 한다.

    서브쿼리를 끝마친 테이블 하나를 메인쿼리의 FROM 에서 테이블로 잡기 때문.

수학 과목을 수강하는 학생들의 수학점수를 조회한다고 가정하면 다음과 같다.

SELECT 학생이름, 수학점수
FROM (   
        SELECT 학생.학생이름 AS 학생이름,
                과목.수학점수 AS 수학점수
        FROM 학생, 과목
        WHERE 학생.학생이름 = 과목.학생이름
        AND 과목.과목이름 = '수학'
    );

1-3. 중첩 서브쿼리 - Nested subqueries

WHERE절 안에 서브쿼리가 들어있다.

  • 단일행과 복수행 둘 다 리턴이 가능하다.

    서브쿼리를 끝마친 값들을 메인쿼리의 조건절을 통해 비교등을 하기 때문.

수학 과목을 수강하는 학생들의 모든 정보를 조회한다고 가정하면 다음과 같다.

SELECT *
FROM 학생
WHERE 학생.학생이름 IN (
    SELECT 과목.학생이름
    FROM 과목
    WHERE 과목.과목이름 = '수학'
);

1. 단일행 서브 쿼리

  • 서브쿼리의 수행결과가 오직 하나의 ROW(행)만을 반환한다.
  • 이 하나의 결과를 가지고 메인쿼리는 비교연산자를 통해 쿼리를 수행한다.
  • 비교연산자는 단일행 비교연산자를 사용한다.

    >, >=, <, <=, = ...

사원들의 평균 급여보다 더 많은 급여를 받는 사원을 검색

SELECT ENAME, SAL
FROM EMP
WHERE SAL > ( 
    SELECT  AVG(SAL)
    FROM  EMP
);

2. 다중행 서브 쿼리

  • 서브쿼리의 수행결과가 두 건 이상의 데이터를 반환한다.
  • 비교연산자는 다중행 비교연산자를 이용한다.

    IN, ANY, SOME, ALL, EXISTS

개발1팀 소속 사원 중 급여를 가장 많이 받는 사람의 이름과 급여를 검색

SELECT  ENAME, SAL
FROM  EMP
WHERE  SAL > ALL ( SELECT  SAL
                      FROM  EMP
                     WHERE  DEPTNAME = '개발1' );