2020041005 / sub-query(서브 쿼리)

-- 단일 행 서브쿼리문


-- 오라클 sql 문 : 서브쿼리(sub-query)


-- SQL : Structured Query Language


-- 서브 쿼리(sub-query) : 하나의 select 문장의 절안에 포한된 또 하나의 select 문장이다.


-- ex) scott 이 근무하는 부서명, 지역 출력 (서로 다른 테이블에 데이터가 존재)

select deptno from emp

where ename = 'SCOTT';


-- 아래의 실행과 동일한 결과

select dname, loc from dept

where deptno = 20;


-- 위의 실행과 동일한 결과

-- 서브뤄리는 비교 연산자(=)의 오른쪽에 기술해야 되고 반드시 괄호로 둘러 쌓아 먼저 실행되어야 한다

select dname, loc from dept -- 메인 쿼리문

where deptno = (select deptno from emp -- 서브 궈리문 주의사항은 항상 서브 쿼리문이 우선 순위로 실행한다

                       where ename = 'SCOTT'); -- 연사자 우선 순위 = 와 ( ) 가 동작한다



-- [예제] scott와 동일한 직급(job)을 가진 사원을 출력하는 sql문을 서브쿼리를 이요해서 작성해 보자


-- SCOTT의 직급확인 이부분이 서브쿼리 안에 들어갈 문장이 된다

select job

from emp

where ename = 'SCOTT';


-- 최종 실행문

select ename, job -- 메인쿼리문

from emp

where job = (select job

                  from emp

                  where ename = 'SCOTT' ); -- 서브쿼리문



-- [예제] scott의 급여와 동일하거나 더 많이 받는 사원 이름과 급여를 출력해 보자


select ename, job, sal

from emp

where sal >= (select sal

                   from emp

                   where ename = 'SCOTT'

                   );



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

-- [예제] 전체 사원 평균 급여보다 더 많은 급여를 받는 사원 을 출력해 보자

-- 그룹함수를 사용 할 때는 group by


-- 평균 급여

select avg (sal)

from emp;


--실행문

select ename, sal, -- avg(sal) 을 추가할 수 없다 그룹함수를 개별적으로 출력할 수 없다

from emp

where sal > (select avg(sal)

                 from emp);





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


-- 다중 행 서브쿼리문


-- [예제] 급여를 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 --error 연산을 할 때에는 1 vs 1 매칭이 되어야 하는데 복수개와 비교 할 수 없다

                       from emp

                       where sal >= 3000);



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

-- 1) [in 연산자]

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


-- 2) [all 연산자]

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

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

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


-- 3) [any 연산자]

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

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

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


























댓글

Designed by JB FACTORY