SQL/SUBQUERY

SUBQUERY(1)

jjhim531 2024. 8. 26. 13:25
반응형

  [ [ 서브쿼리 ] ]  

하나의 SQL문 안에 포함된 또 다른 SELECT문

메인 SQL문을 위해 보조 역할을 하는 쿼리

 

 [ 서브쿼리의 구분 ] 

서브쿼리를 수행한 결과값이 몇행 몇열로 나오느냐에 따라서 분류

* 단일행 서브쿼리 : 서브쿼리의 조회 결과값이 오로지 1개일 때

* 다중행 서브쿼리 : 서브쿼리의 조회 결과값이 여러행일 때(여러행 한열)

 

* 다중열 서브쿼리 : 서브쿼리의 조회 결과값이 한행이지만 컬럼이 여러개일 때

 

* 다중행 다중열 서브쿼리 : 서브쿼리의 조회 결과값이 여러행 여러컬럼일 때
    
    >> 서브쿼리의 결과값에 따라서 서브쿼리 앞쪽에 연산자가 달라진다.

 

 

 < 단일행 서브쿼리 > 

서브쿼리의 조회 결과값이 오로지 1개일 때(한행 한열)

일반 비교연산자 사용 가능(  =    !=    >    <= ...  )

EX1) 노옹철 사원과 같은 부서에 속한 사원들 조회

SELECT
    emp_name
FROM
    employee
WHERE
    dept_code = (
        SELECT
            dept_code
        FROM
            employee
        WHERE
            emp_name = '노옹철'
    );

 

 

 < 다중행 서브쿼리 > 

서브쿼리를 수행한 결과값이 여러행일 때(컬럼은 한개)

*  IN (서브쿼리) : 서브쿼리의  여러개의 결과값 중에서 한개라도 일치하는 값이 있다면 조회

*  > ANY (서브쿼리) : 서브쿼리의 여러개의 결과값 중에서 한개라도 클경우 조회

*  < ANY (서브쿼리) : 서브쿼리의  여러개의 결과값 중에서 한개라도 작을경우 조회

*  비교대상 > ANY (서브쿼리의 결과값 -> 값1, 값2, 값3...)

*  > ALL(서브쿼리) : 여러개의 모든 결과값들 보다 클 경우 조회

*  < ALL(서브쿼리) : 여러개의 모든 결과값들 보다 작을 경우 조회

EX) 유재식 또는 윤은해사원과 같은 직급인 사원들의 사번, 사원명, 직급코드, 급여조회

SELECT
    emp_id,
    emp_name,
    job_code,
    salary
FROM
    employee
WHERE
    job_code IN (
        SELECT
            job_code
        FROM
            employee
        WHERE
            emp_name IN ( '유재식', '윤은해' )
    );

EX2)  대리 직급임에도 과장 직급 급여들 중 최소 급여보다 많이받는 사원들의 사번, 이름, 직급, 급여 조회

SELECT
    emp_id,
    emp_name,
    job_name,
    salary
FROM
         employee
    JOIN job USING ( job_code )
WHERE
        job_name = '대리'
    AND salary > ANY (
        SELECT
            salary
        FROM
                 employee
            JOIN job USING ( job_code )
        WHERE
            job_name = '과장'
    );

 

 

 < 다중열 서브쿼리 > 

  결과값은 한 행이지만 나열된 컬럼수가 여러개일 경우

EX1) 하이유 사원과 같은 부서코드, 같은 직급코드에 해당하는 사원들 조회

SELECT
    emp_name,
    dept_code,
    job_code,
    hire_date
FROM
    employee
WHERE
        dept_code = (
            SELECT
                dept_code
            FROM
                employee
            WHERE
                emp_name = '하이유'
        )
    AND job_code = (
        SELECT
            job_code
        FROM
            employee
        WHERE
            emp_name = '하이유'
    );

WHERE 조건절 부분을 두 가지 방법으로 작성가능하다.

WHERE
        dept_code = (
            SELECT
                dept_code
            FROM
                employee
            WHERE
                emp_name = '하이유'
        )
    AND job_code = (
        SELECT
            job_code
        FROM
            employee
        WHERE
            emp_name = '하이유'
    );
WHERE
    ( dept_code,
      job_code ) = (
        SELECT
            dept_code,
            job_code
        FROM
            employee
        WHERE
            emp_name = '하이유'
    );

 

 

 < 다중행 다중열 서브쿼리 > 

서브쿼리의 조회 결과값이 여러행 여러열일 경우

EX) 각 직급별 최소급여를 받는 사원조회(사번, 사원명, 직급코드, 급여)

SELECT
    emp_id,
    emp_name,
    job_code,
    salary
FROM
    employee
WHERE
    ( job_code, salary ) IN (
        SELECT
            job_code, MIN(salary)
        FROM
            employee
        GROUP BY
            job_code
    );

728x90
반응형