2009. 3. 14. 03:19 Program.../Oracle
Oracle 서브쿼리(SubQuery)
--// 서브쿼리는 where절에 또하나의 select 문이 들어가는것을 말한다.
---|| 30번 부서중에서 sal가 가장 최고인 사원의 모든정보를 추출하시오
select *
from emp
order by sal desc;
update emp set sal=2850 -- 원래는 2975
where empno = 7566;
select *
from emp
where sal = (select max(sal) from emp -- 쿼리문에서 실행된값이 다른 부서에도 있으면 출력이 된다.
where deptno = 30); -- 이유는 전체문장에서 30번 부서만뽑는 조건이 없기때문이다.
select *
from emp
where deptno = 30 and
sal = (select max(sal) from emp
where deptno = 30);
-----------------------------------------------------------------------------------------------
---|| adams 가 근무하는 부서에서 그 부서의 평균급여보다 많은 사원의 모든정보를 추출
select *
from emp
where deptno = (select deptno from emp where ename='ADAMS') and
sal > (select avg(sal) from emp
where deptno = (select deptno from emp where ename='ADAMS'));
---|| JONES와 CLARK이 근무하는 부서와 동일한 부서에 근무하는 사원들의 모든정보를 추출.
select *
from emp
where deptno = any (select deptno from emp where ename in ('JONES','CLARK'));
---|| 각 부서별로 급여가 최저인 사원들의 부서번호, 사원명, 급여를 추출하여라.
----/// 아래 문장은 부서번호가 정의되지 않았기 때문에 잘못된 표현이다.
select deptno, ename, sal, empno
from emp
where sal in (select min(sal) from emp group by deptno)
order by deptno;
update emp set sal=1300 -- 원래는 2975
where empno = 7566;
update emp set sal=1300 -- 원래는 1250
where empno = 7654;
---/// 두개의 조건을 동시에 비교해서 해야 정확한 답이 나온다.
---/// 이런경우를 다중열 서브쿼리라 하여 Pairwise되었다고 한다.
select deptno, ename, sal
from emp
where (deptno, sal) in (select deptno, min(sal) from emp group by deptno)
order by deptno;
--|| EMP 테이블에서 관리자로 등록되어진 사원의 정보를 추출하시오.
select *
from emp
where empno in (select mgr from emp);
select *
from emp
where empno = any (select mgr from emp);
--|| EMP 테이블에서 관리자로 등록되어지지 않은 사원의 정보를 추출하시오.
select *
from emp
where empno not in (select mgr from emp); -- 이렇게하면 서브쿼리에 null값때문에 값이 나오질 않는다.
--/// 다음과 같이 풀이가 된다.
select *
from emp
where empno ^= 7566 and empno ^= 7698 and empno ^= 7782 and
empno ^= 7788 and empno ^= 7839 and empno ^= 7902 and empno = null
-- null은 존재하지 않는 값이기때문에 부정을 해도 null이 된다. 그래서 null부분을 빼야한다.
select *
from emp
where empno not in (select mgr from emp
where mgr is not null); -- 다음과 같이 null부분을 없애줘야 정확한 값이 나온다.
select *
from emp
where empno ^= all (select mgr from emp -- not in 은 ^= all 과 같다.
where mgr is not null);
'Program... > Oracle' 카테고리의 다른 글
Oracle 데이터 조작어(insert, update, delete commit, rollback) (0) | 2009.03.14 |
---|---|
Oracle 서브상관쿼리, exists, not exists (0) | 2009.03.14 |
Oracle sum() over() - 누적계산 (0) | 2009.03.14 |
Oracle cross join, natural join, using 절 (0) | 2009.03.14 |
Oracle 다중 테이블로부터의 데이타 검색 (0) | 2009.03.14 |