Data Base_Oracle/SQL

SQL 다중 행 Sub Query_Any 연산자

pathas 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연산자는 서브쿼리와 메인쿼리의 논리적인 구조를 이해해야 하기 때문에 상세히 알아두면 좋겠습니다.