ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQL 다중 행 Sub Query_Any 연산자
    Data Base_Oracle/SQL 2020. 1. 7. 22:49

    Any

    '메인쿼리의 비교 조건이 서브 쿼리의 결과들 중 어느 것에라도 ~ 하다면'
    이라고 풀어서 설명할 수 있음

    Any 연산자설명
    ~ > any(Sub Query)서브쿼리의 가장 적은 값을 구한 뒤
    메인 쿼리 조건에 만족하는 값을 하나씩 비교
    내림차순으로 자동으로 정렬
    ~ < any(Sub Query)서브쿼리의 가장 큰 값을 구한 뒤
    메인 쿼리 조건에 만족한는 값을 하나씩 비교
    오름차순으로 자동 정렬

    # 예제

    { 문제 }
    ▷ emp테이블에서 30번 부서의 최소급여를 받는 사원보다
    많은 급여를 받는 사원의 이름, 업무, 급여, 부서번호 출력
    단, 30번부서는 제외

     

    { 단일 행 연산자 풀이 }
    ▶ [ SQL> select ename, job, sal, deptno from emp
    where sal > (select min(sal) from emp where deptno=30)
    and deptno != 30 ; ]

    ENAMEJOBSALDEPTNO
    JONESMANAGER297520
    CLARKMANAGER245010
    ............

    { Any 풀이 }
    ▶▶ [ SQL> select ename, job, sal, deptno from emp
    where sal > any(select sal from emp where deptno=30)
    and deptno != 30 ; ]

    ENAMEJOBSALDEPTNO
    KINGPRESIDENT500010
    SCOTTANALYST300020
    ............

    ※ any연산자를 사용하는 경우
    서브 쿼리(그룹함수)의 결과가 물리적인 행은 하나이지만 논리적으로 다중 행인 경우

    § 950 < 1100< .... < 3000 < 5000 순서로 비교하기 때문에 내림차순으로 자동 정렬됨

     

    { 문제 }
    ▷ emp테이블에서 30번 부서의 최대급여를 받는 사원보다
    적은 급여를 받는 사원의 이름, 업무, 급여, 부서번호 출력
    단, 30번부서는 제외

     

    { 단일 행 연산자 풀이 }
    ▶ [ SQL> select ename, job, sal, deptno from emp
    where sal < (select max(sal) from emp where deptno=30)
    and deptno != 30 ; ]

    ENAMEJOBSALDEPTNO
    SMITHCLERK80020
    CLARKMANAGER245010
    ............

    { Any 풀이 }
    ▶▶ [ SQL> select ename, job, sal, deptno from emp
    where sal < any(select sal from emp where deptno=30)
    and deptno != 30 ; ]

    ENAMEJOBSALDEPTNO
    SMITHCLERK80020
    ADAMSCLERK110020
    ............

    단일 행 Sub Query를 Any연산자를 통해 다중 행 Sub Query로 만드는 방법에 대해 알아보았습니다.
    Any연산자는 서브쿼리와 메인쿼리의 논리적인 구조를 이해해야 하기 때문에 상세히 알아두면 좋겠습니다.

    댓글

Designed by Tistory.