다중 행(Multiple Row Operator) 서브 쿼리문
- ORACLE
- 2020. 4. 30.
==============================
-- 다중 행 서브쿼리문
-- 다중 행 연산자(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);
-- [문제] 영업 사원들의 최소 급여보다 많이 받는 사원들의 이름과 급여와 직급을 출력하되
-- 영업사원은 출력하지 않습니다. 쉬는시간 연습해 볼것
'ORACLE' 카테고리의 다른 글
2020040908 / cascade 옵션 (0) | 2020.04.30 |
---|---|
2020041308 / 시퀀스(Sequence) (0) | 2020.04.30 |
2020040908 / [13] 제약 조건(외래키) 컬럼 삭제 (0) | 2020.04.30 |
2020040907 / [12] 제약 조건 제거하기, [13] 제약 조건(외래키) 컬럼 삭제 (0) | 2020.04.30 |
2020040907 / [11] not null 제약 조건 추가하기 (0) | 2020.04.30 |