[ SELECT SUBQUERY 예제 ]

 

☞ SUBQUERY의 개념

 

ㅇ SUBQUERY : 하나의 SELECT(SQL)문 안에 포함되어 있는 SELECT 문장
ㅇ SUBQUERY의 종류 : Nested Subquery, Correlated Subquery
ㅇ SUBQUERY의 문항 : Subquery는 괄호로 묶여 있어야 합니다.
                   : Subquery구문에서는 ORDER BY절을 포함할 수 없습니다.
                   : Subquery는 일반적으로 연산자의 오른쪽에 위치합니다.
                   : Subquery에서 사용할 수 있는 연산자의 종류에는
                      - 단일행 연산자(=, >, >=, <, <=, <>)
                      - 복수행연산자 (IN ,ANY , ALL , NOT IN , ... )가 있습니다.

 

ㅇ Single Row Subquery : Subquery에서 Main Query로 전달되는 행이 단 하나인 경우

 

ㅇ Multi Column Subquery : Subquery구문을 작성할 때 WHERE절에서 비교하는 컬럼이 하나가 아니라
                           여러 개의 컬럼을 동시에 비교하는 경우를 말하며 이런 경우
                           Pairwise되었다라고 함.

 

ㅇ Scalar Subquery : Subquery에 의해 하나의 행, 하나의 칼럼 값이 Return 되어지는 경우를 말함.

 

ㅇ Correated Subquery : Main에서 자신의 데이터를 넘겨주고 Subquery가 이를 처리하여 돌려주는 방식
                      : Main의 각 행에 대해 마지막 행에 도달할 때까지 반복 수행되는 Subquery

 

☞ Single Row Subquery

 

   예시) SQL>SELECT name, title , dept_id
            
FROM   EMPLOYEE   
            
WHERE  dept_id = ( SELECT dept_id          
                                
FROM   EMPLOYEE
                                
WHERE
name = ‘김용학’ )  ;

☞  Multi Row Subquery

 

1) IN : 한번에 여러 OR로 동일(=)하기 비교하는 연산자
   예시) SQL>
SELECT   name,  dept_id
            
FROM  s_emp
            
WHERE  dept_id IN ( SELECT dept_id
                                 
FROM s_dept
                                 
WHERE region_id =3 )  ;

2) ANY(ALL) : 값을 Subquery에 의해 반환되는 각각의 값과 비교
    예시) 직책이 사원이 아니면서 사원이 받고 있는 어떤(모든) 급여보다도 적은 급여를 받는
          사원의 이름, 급여, 직책을 나타내시오.
          SQL>
SELECT name, salary, title
               
FROM   EMPLOYEE
               
WHERE  salary  < ANY  ( SELECT salary
                                
       FROM   EMPLOYEE
                                       
WHERE  title = '사원' )
               
AND    title <> '사원' ;
     ※ = ANY는 IN과 동일

     예시)SQL>
SELECT  name , salary , title
               
FROM    EMPLOYEE
               
WHERE salary  < ALL  ( SELECT salary
                                      
FROM   EMPLOYEE
                                      
WHERE title = '사원' )
               
AND title <> '사원' ; 
     ※ ALL는 최대값보다 큼을, <
ALL는 최소값보다 적음을 나타낸다.

☞ Multi Column Subquery

 

예시) 각 부서별로 최소급여를 받는 사원의 이름, 부서번호, 급여를 나타내시오.
    SQL>
SELECT name, dept_id, salary
         
FROM   EMPLOYEE
         
WHERE (salary,dept_id) IN  (SELECT MIN(salary),dept_id
                                     
FROM   EMPLOYEE
                                     
GROUP BY dept_id );

☞ Scalar Subquery

 

   예시 1) SQL> SELECT name, salary , (SELECT AVG(salary) FROM EMPLOYEE ) avg_sal
                
FROM   EMPLOYEE ;

   예시 2) SQL>
SELECT name, salary , CASE WHEN  salary >  ( SELECT avg(salary)
                                                             FROM
 EMPLOYEE)  
                                           
THEN salary * 1.1
                                           
ELSE  salary*1.2
                                           
END  bonus
                    , title
                
FROM  EMPLOYEE ;

   예시 3) SQL>
SELECT id , name , dept_id
                
FROM   EMPLOYEE e
                
WHERE  salary >= 2500
                
ORDER BY ( SELECT name
                           
FROM   T_dept d
                           
WHERE  e.dept_id = d.dept_id ) ;

☞ Correated Subquery

 

SQL> SELECT name, salary ,dept_id
     
FROM   EMPLOYEE  outer
     
WHERE  salary < (SELECT AVG(salary)
                      
FROM   EMPLOYEE

                      
WHERE  dept_id = outer.dept_id ) ;

   ※ 바로 2번째 Line의 Outer라는 테이블 Alias를 5번 Line에서 사용하게 되면 내부적으로
      Correlated Subquery의 진행방식을 따르게 됨.

   ㅇ 연산자 EXIST, NOT EXISTS
      예시) SQL>
SELECT id, name , title , dept_id
                 
FROM   EMPLOYEE  o
                 
WHERE  EXISTS ( SELECT 'X' 
                                 
FROM   EMPLOYEE

                                 
WHERE  manager_id = o.id ) ;

      예시) SQL>
SELECT id, name , title , dept_id
                 
FROM   EMPLOYEE
                 
WHERE  id IN  ( SELECT manager_id
                                 
FROM   EMPLOYEE

                                 
WHERE  manager_id IS NOT NULL ) ;

 




 

'(DB) Oracle > SQL' 카테고리의 다른 글

Oracle - 예제_LEAD.LAG  (0) 2017.01.18
Oracle - 예제_UPDATE  (0) 2017.01.18
Oracle - 예제_SELECT_GROUP  (0) 2017.01.18
Oracle - 예제_SELECT  (0) 2017.01.18
Oracle - 예제_MERGE  (0) 2017.01.18
Posted by 농부지기
,