SQL 다중 행 Sub Query_Any 연산자
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 ; ]
ENAME | JOB | SAL | DEPTNO |
---|---|---|---|
JONES | MANAGER | 2975 | 20 |
CLARK | MANAGER | 2450 | 10 |
... | ... | ... | ... |
{ Any 풀이 }
▶▶ [ SQL> select ename, job, sal, deptno from emp
where sal > any(select sal from emp where deptno=30)
and deptno != 30 ; ]
ENAME | JOB | SAL | DEPTNO |
---|---|---|---|
KING | PRESIDENT | 5000 | 10 |
SCOTT | ANALYST | 3000 | 20 |
... | ... | ... | ... |
※ 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 ; ]
ENAME | JOB | SAL | DEPTNO |
---|---|---|---|
SMITH | CLERK | 800 | 20 |
CLARK | MANAGER | 2450 | 10 |
... | ... | ... | ... |
{ Any 풀이 }
▶▶ [ SQL> select ename, job, sal, deptno from emp
where sal < any(select sal from emp where deptno=30)
and deptno != 30 ; ]
ENAME | JOB | SAL | DEPTNO |
---|---|---|---|
SMITH | CLERK | 800 | 20 |
ADAMS | CLERK | 1100 | 20 |
... | ... | ... | ... |
단일 행 Sub Query를 Any연산자를 통해 다중 행 Sub Query로 만드는 방법에 대해 알아보았습니다.
Any연산자는 서브쿼리와 메인쿼리의 논리적인 구조를 이해해야 하기 때문에 상세히 알아두면 좋겠습니다.