서브쿼리 - 다중행 서브쿼리(Multiple-Row Subquery)

2014.05.19 08:37

ㅇ 서브쿼리

- select문의 조건절 안에 다른 select문을 사용하는 것. inner query라고도 한다

- where절에 연산자 오른쪽에 서브쿼리를 위치시켜야하고 반드시 괄호로 묶어야 한다



ㅇ 단일행 서브쿼리

- 서브쿼리의 결과가 1개의 행만 나오는 것

- 단일행 서브쿼리 연산자 : =, <, > <> 등


SQL> select ename, sal 

from EMP

where sal > (select sal

             from EMP

             where ename='MILLER');


ENAME      SAL       

---------- --------- 

ALLEN           1600

JONES           2975

BLAKE           2850

CLARK           2450

SCOTT           3000

KING            5000

TURNER          1500

FORD            3000


8 rows selected.



ㅇ 다중행 서브쿼리(Multiple-Row Subquery)


- 서브쿼리의 결과가 2건 이상 출력되는 경우

- 다중행 서브쿼리 연산자 : in, > any, > all 등



# IN 연산자


in연산자는 하나의 컬럼이 여러개의 "=" 조건을 가지는 경우 사용


-- 부서별로 가장 적은 급여를 받는 사원의 정보


SQL> select ename, sal, deptno

from emp 

where sal IN (select MIN(sal)

              from emp 

              group by deptno);


ENAME      SAL       DEPTNO 

---------- --------- ------ 

SMITH            800     20

JAMES            950     30

MILLER          1300     10


3 rows selected.




# ANY 연산자


- ANY연산자는 or와 비슷

- 여러 결과값 중 하나의 값만 만족하면 행 반환


-- SALESMAN의 급여


SQL> select ename, sal 

from emp 

where job = 'SALESMAN';


ENAME      SAL       

---------- --------- 

ALLEN           1600

WARD            1250

MARTIN          1250

TURNER          1500


4 rows selected.



-- ANY 연산자

SQL> select ename, sal 

from emp 

where sal > ANY (select sal 

                 from emp 

                 where job = 'SALESMAN');


ENAME      SAL       

---------- --------- 

KING            5000

FORD            3000

SCOTT           3000

JONES           2975

BLAKE           2850

CLARK           2450

ALLEN           1600

TURNER          1500

MILLER          1300


9 rows selected.


==> SALESMAN 의 SAL 값중 어느 값(ANY)보다 크기만 하면 된다. 

즉 SALESMAN의 SAL 중 최소값인 1250보다 큰 경우가 조건이 된다



SQL> select ename, sal 

from emp 

where sal < ANY (select sal 

                 from emp 

                 where job = 'SALESMAN');


ENAME      SAL       

---------- --------- 

SMITH            800

JAMES            950

ADAMS           1100

WARD            1250

MARTIN          1250

MILLER          1300

TURNER          1500


7 rows selected.


==> SALESMAN 의 SAL 값중 어느 값(ANY)보다 작기만 하면 된다. 

즉 SALESMAN의 값중 최대값인 1600보다 작은 경우가 조건이 된다




# ALL 연산자

- ALL 연산자는 AND와 비슷

- 서브쿼리 결과값 중 모든 결과를 만족하는 행을 반환


SQL> select ename, sal 

from emp 

where sal > ALL (select sal 

                 from emp 

                 where job = 'SALESMAN');


ENAME      SAL       

---------- --------- 

CLARK           2450

BLAKE           2850

JONES           2975

SCOTT           3000

FORD            3000

KING            5000


6 rows selected.


==> SALESMAN의 모든 값보다 큰 값. 즉 SALESMAN의 SAL 중 최대값인 1600이 조건이 된다.




SQL> select ename, sal 

from emp 

where sal < ALL (select sal 

                 from emp 

                 where job = 'SALESMAN');


ENAME      SAL       

---------- --------- 

ADAMS           1100

JAMES            950

SMITH            800


3 rows selected.


==> SALESMAN의 모든 값보다 작은 값, 즉 SALESMAN의 SAL 중 최소값인 1250이 조건이 된다.




또루아빠 SQL(오라클,mysql) , , , , , ,