Data Base_Oracle/SQL

SQL 다중 행 Sub Query 개요_IN & ALL 연산자

pathas 2020. 1. 7. 22:38

다중 행 Sub Query

다중 행 서브 쿼리는 서브 쿼리에서 반환되는 결과가
둘 이상의 행일 때 사용

다중 행 Sub Query 연산자 종류

종류 의 미
IN 메인 쿼리의 비교 조건('=' 연산자로 비교할 경우)이 서브 쿼리의 결과 중에서 하나라도 일치하면 참
ANY 메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과와 하나 이상이 일치하면 참
ALL 메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과와 모든 값이 일치하면 참
EXISTS 메인 쿼리의 비교 조건이 서브 쿼리의 결과 중에서 만족하는 값이 하나라도 존재하면 참

IN

범위연산자 in과 동일한 연산자
메인 쿼리의 비교 조건과 서브 쿼리 결과들 중 일치하는 값들을 조회

#예제

{ 에러 }
▷ 부서별로 최소급여를 받는 사원의 이름, 업무, 급여, 부서번호 출력

▶ [ SQL> select ename, job, sal, deptno from emp
where sal = (select min(sal) from emp group by deptno);
2행에 오류:
ORA-01427: 단일 행 하위 질의에 2개 이상의 행이 리턴되었습니다. ]


※ 단일 행이 아닌 다중 행 서브 쿼리를 사용하는 경우
다른 연산자를 사용해야 함 → 다중 행 서브 쿼리 연산자

 

{ 문제 }
▷ 부서별로 최소급여를 받는 사원의 이름, 업무, 급여, 부서번호 출력

▶ [ SQL> select ename, job, sal, deptno from emp
where sal in (select min(sal) from emp group by deptno); ]

ENAME JOB SAL DEPTNO
SMITH CLERK 800 20
JAMES CLERK 950 30
MILLER CLERK 1300 10

ALL

서브쿼리 검색 결과의 모든 값이 메인 쿼리 조건식을 만족해야
참을 반환하는 연산자

# 예제

▷ 급여가 30번부서의 최고급여보다 많은 사원의 사번,이름,급여 조회

▶ [ SQL> select empno, ename, sal from emp
where sal > all(select sal from emp where deptno=30); ]

EMPNO ENAME SAL
7566 JONES 2975
7788 SCOTT 3000
... ... ...

※ ~ > (max(sal)) → ~ > all(sal)
서브쿼리의 최대값보다 큰 값을 구하고 오름차순으로 정렬


다중 행 서브 쿼리의 개요와 IN, ALL연산자에 대해 살펴보았습니다.

다중 행 서브 쿼리에서만 사용되는 연산자들에 대해서는 꼭 알아둘 필요가 있겠습니다.