다중 행(Multiple Row Operator) 서브 쿼리문

==============================


-- 다중 행 서브쿼리문

-- 다중 행 연산자(Multiple Row Operator)와 함께 사용해야 한다




-- 1) [in 연산자]

-- 메인 쿼리의 비교 조건 ( ' = ' 연산자로비교할 경우)이 서브쿼리이 결과 중에서 하나라도 일치(or)하면 참이다


-- [예제] 급여를 3000 이상 받는 사원이 소속된 부서와 동일한 부서에서 근무하는 사원들의 정보를 출력해 보자



-- 3000 이상인 사람부터 확인

select * from emp;



-- 3000 이상인 부서 확인

select deptno

from emp

where sal >= 3000;



-- error 실행문---

select ename, sal, deptno

from emp

where deptno = (select deptno --error 연산을 할 때에는 1 vs 1 매칭이 되어야 하는데 복수개와 비교 할 수 없다

                       from emp

                       where sal >= 3000);


-- 동작 실행문---

select ename, sal, deptno

from emp

where deptno in (select deptno -- in 연산을 할 때에는 1 vs 1 매칭이 되어야 하는데 복수개와 비교 할 수 있다

                       from emp

                       where sal >= 3000);




-- 시간 있을 때 해보자

-- [문제] in 연산자를 이용하여 부서별로 가장 급여를 많이 받는 사원의 정보(사원번호, 사원명, 부서번호)를 출력


select max(sal) from emp

group by deptno;


select empno, ename, sal, deptno

from emp

where sal in (select max(sal) from emp

group by deptno);





-- 2) [all 연산자]

-- 2-1) 메인 쿼리의 비교 조건이 서브쿼리의 검색결과와 모든 값이 일치하면 참이다

-- 2-2) 찾아진 값에 대해서 and 연산을 해서 모두 참이면 참이 되는 셈이 된다

-- 2-3) > all 은 '모든 비교 값 보다 크냐?' 라고 묻는 것이 되므로 최대값보다 더 크면 참이 된다


-- (2) [all 연산자]


-- 예시) 30번(부서번호) 소속 사원들 중에서 급여를 가장 많이 받는 사원보다

--         더 많은 급여를 받는 사원의 이름과 급여를 출력


select * from emp;


select max(sal)

from emp

where deptno = 30;



select ename, sal

from emp

where sal > (select max(sal)

                 from emp

                 where deptno = 30);




-- max 그룹 함수가 없이 출력해 보자


-- error

select ename, sal

from emp

where sal > (select sal

                 from emp

                 where deptno = 30);



-- [다중 행 서브쿼리]

select ename, sal

from emp

where sal > all (select sal -- 2개 이상의 데이터와 비교 > all 명령문 사용

                     from emp

                     where deptno = 30);




-- [문제] 영업사원(salesman)들보다 급여를 많이 받는 사원들의 

--          이름과 급여, 담당업무를 출력하되 영업사원은 출력하지 않게

--          명령문을 작성해 보자


select ename, sal, job

from emp

where sal > all (select sal

                     from emp

                     where job = 'SALESMAN') 

and job <> 'SALESMAN'; -- != 사용 동일





-- 3) [any 연산자]

-- 3-1) any 조건은 메인 쿼리의 비교 조건이 서브쿼리의 검색 결과와 하나 이상만 일치하면 참이다

-- 3-2) > any는 찾아진값에 대해서 하나라도 크면 참이 된다

-- 3-3) 그러므로 찾아진 값에서 가장 작은 값 즉 최소값 보다 크면 참이 된다


-- (3) [any 연산자)

-- [예제] 부서번호가 30번인 사원들의 급여 중에서 가장 낮은

-- 급여보다 높은 급여를 받는 사원의 이름, 급여를

-- 출력하는 명령문을 작성해 보자


-- [단일행 서브쿼리 & 그룹 함수]

select ename, sal

from emp

where sal > (select min(sal)

                 from emp

                 where deptno = 30);


--[다중행 서브쿼리]

select ename, sal

from emp

where sal > any (select sal

                      from emp

                      where deptno = 30);



-- [문제] 영업 사원들의 최소 급여보다 많이 받는 사원들의 이름과 급여와 직급을 출력하되

-- 영업사원은 출력하지 않습니다. 쉬는시간 연습해 볼것











































댓글

Designed by JB FACTORY