dev/DB

[DB/Oracle] SUB QUERY

dev_Step 2022. 2. 22. 17:21

SUB QUERY : SELECT 한 결과를 조건비교에 사용하거나 UPDATE OR INSERT할때 사용한다.

조건 비교에 SELECT한 결과를 사용할 수 있다는 말은 SELECT, DELETE, UPDATE시의 WHERE절에 사용될 수 있다는 의미 이므로 DML 어디서든 사용 될 수 있다는 의미이다.

 

서브쿼리는 InnerQuery, OuterQuery로 구성되어 있다.

Query의 조건에서 컬럼과 비교되는 상대값으로 또 다른 쿼리의 결과가 사용되는 경우를 예로 들어 사용하면, 또다른 쿼리를 InnerQuery라 하고 InnerQuery에서 나온 결과를 비교조건으로 사용하는 쿼리를 OuterQuery라 칭한다.

 

서브쿼리를 종류별로 나눠보면 SINGLE ROW, MULTI ROW, MUTI COLUM, CORRELATED  크게 나뉘며,   각각이 다시 중복되어 사용될  있으므로 SINGLE ROW MULTI COLUM, MUTI ROW MULTI COLUMN, SINGLE ROW CORRELATED, MULTI ROW CORRELATED 등으로 세분화   있다.

 

SINGLE ROW, MULTI ROW, MUTI COLUM, CORRELATED  4가지만 이해하면 이들의 중복 사용은 단지 경우의  확장에 해당 하므로 위의 4가지 사례를 집중적으로 다뤄 보겠다.

 

 

1.SINGLE ROW 서브쿼리

SUB QUERY가 조건의 비교문으로 사용될때 연산자가 IN,ANY,ALL,EXISTS이 아닌경우 SUB QUERY에서 나오는 결과 행의 수가 1보다 클 수 없다.이렇게 서브 쿼리의 결과가 항상 한 행 보다 클수 없는 경우를 SINGLE ROW 서브쿼리 라고 한다.

SUB QUERY RESULT(1행)

2. MULTI ROW 서브쿼리 : MULTI ROW 서브쿼리는 SINGLE ROW와 달리 서브쿼리의 결과 행이 한행 이상이 되며 IN, ANY, ALL, EXISTS의 연산 시에만 가능하다.

 

SUB QUERY RESULT(3행)
MULTI QUERY

위에서 보다시피 SUB_QUERY의 결과는 'BA0001','BB0001','BC0001' 3개가 나왔다. 이렇게 하나이상의 행이 SUB QUERY의 결과로 나올 가능서이 있는 경우를 MULTI ROW 서브쿼리라고 부른다.

 

 

//TCOM에 COMM을 받는 사번이 있고, SUB QUERY 를 사용하여 부서별로 COMM을 받는 인원수를 세는 문장을 만들자.

 

순서대로 한번 값을 찾아가보자1.우선, EQUAL JOIN을 통해서 사원명과 부서명을 출력해 보았다. 그결과 두테이블 공통으로 가지고 있는값들이 출력되었는데 사원이 총 20명이므로 부서도 20개 모두 출력되었다.

2.

추가적인 조건으로. 

사원번호가 tcom테이블에서 comm받는 사람들만 포함되게 조건을

주니 tcom 에서 선택된 8개의 사원번호가 출력되었다.

3.

마지막으로 부서별로 나타내라고 하여 group by 를 해주니

전에 나온 8개의 데이터를 그룹별로 묶어서영업 2, 영업기획 2, 영업1 2, 영업2 2 값이 return 되었다.

 

 

 

 

3. Multi Column 서브쿼리

서브쿼리에서 결과로 나오는 행이 한컬럼이 아닌 두개이상을 가지고 있는경우이다.

 

서브쿼리 실행문 결과가 2행으로 나옴

 

SUB QUERY의 결과가 2행으로 나왔고, 이 2행을 조건문으로 쓰기위해서 

where절에서 (  1번, 2번   ) 이렇게 2개의 조건을 걸어주었다.

 

 

 

4. CORRELARED 서브쿼리

IntterQuery에서 OuterQuery의 어떤 컬럼 값을 사용하는 경우를 Correlated서브쿼리라고 한다.

InnterQuery(흔히 SubQuery라고함)와 OuterQuery(흔희 Main Query라고함)가 서로 단순히 연관관계가 있는게 

아니라 서로 값을 주고 받는 연관관계가 성립한다.

일반적으로 서브쿼리는 SubQuery의 결과를 MAIN QUERY가 사용하나다.

하지만 CORRELATED쿼리는 SUB QUERY가 MAIN QUERY를 이용하고 그렇게 구해진 SUB QUERY의 값을 다시

MAIN QUERY가 사용하게 된다.

 

여기서 쿼리문을보면, 

직원중 자신의 연봉이, 자신과 같은 직급(lev)에해당하는 직원들의 평균 SALARY보다 많은경우

해당 사원의 사번과 성명을 읽어오는 것인데.

 

1. 일단 자신의 연봉이 되는 사원과, 자신과 같은 직급을 가지고 있는 사원들의 평균 SALARY을 구해야 하는데

여기서 자신의 연봉은 OUTER QUERY의 SALARY에 해당하고,

같은 직급을 가지고 있는 사원들의 평균 SALARY는 INNER QUERY에 해당된다.

이때 INNER QUERY에서 자신의 직급과 같은 직급을 가지고 있는 사원을 선택할떄 조건문에서

a.lev = b.lev는    a 테이블에서 사원의 직급과 b 테이블 사원의 직급이 같을때 ==> 자신과 같은 직급을 가지고 있는

이 성립되는 조건문이다.

 

 

5. SUB QUERY는 insert 문과, update 문에서도 사용이 된다.

 

 

6. ANY, ALL

(100,200,300) 중 어떤 값 하나보다 큰값을 확인하고 싶을때는  salary >  ANY(100,200,300)을 사용하고

세개의 값보다 다 큰값을 확인할때는 salary > ALL(100,200,300)을 사용하면된다.

 

7. exists : 서브 쿼리가 적어도 하나의 행을 돌려 주는지 체크할때 사용한다.

 

 

 

 

[출처] https://m.blog.daum.net/why_i_am/13?category=2113847