참조 : http://blog.naver.com/addibuddi?Redirect=Log&logNo=16037753
SUBQUERY와 INLINE-VIEW가 표현되는 방식이 달라....
의미상으로도 다른줄 알았는데...
INLINE-VIEW자체도 SUBQUERY의 하나의 방식이라는 군요..
및에는 참조~
|
☞ Subquery란?
◈
SUBQUERY는 다른 하나의 SQL 문장의 절에 NESTEDED된 SELECT 문장
입니다.
◈ SELECT, UPDATE, DELETE, INSERT와 같은 DML문과 CREATE TABLE 또는 VIEW에서
이용 될 수 있습니다.
◈ 알려지지 않은 조건에 근거한 값들을 검색하는 SELECT 문장을 작성하는데 유용
합니다.
◈ SUBQUERY는 MAIN QUERY가 실행되기 이전에 한번 실행
됩니다. |
☞ Guidelines
◈ SUBQUERY는 괄호로 묶어야 합니다.
◈ 두 종류의 비교
연산자들이 SUBQUERY에 사용 됩니다.
- 단일 행 연산자( =,>, >=, <, <=,
<>, != )
- 복수 행 연산자( IN, NOT IN, ANY, ALL, EXISTS
)
◈ SUBQUERY는 연산자의 오른쪽에 나타나야 합니다.
|
☞ SUBQUERY의 유형
◈ 단일 행(Sing-Row)
서브쿼리 : SELECT문장으로부터 오직 하나의 행만을 검색하는 질의입니다
◈ 다중 행(Multiple-Row) 서브쿼리 : SELECT문장으로부터 하나 이상의 행을 검색하는
질의입니다
◈ 다중 열(Multiple-Column) 서브쿼리 :
SELECT문장으로부터 하나 이상의 컬럼을 검색하는
질의입니다
◈ FROM절상의 서브쿼리(INLINE VIEW) : FROM절상에 오는 서브쿼리로 VIEW처럼
작용 합니다.
◈ 상관관계 서브 쿼리 : 바깥쪽 쿼리의 컬럼 중의
하나가 안쪽 서브쿼리의 조건에 이용되는
처리 방식
입니다.
|
|
☞ FROM절상의 서브쿼리(INLINE VIEW)
◈
SUBQUERY는 FROM절에서도 사용이 가능 합니다.
◈ INLINE VIEW란 FROM절상에 오는 서브쿼리로 VIEW처럼
작용 합니다.
예제)급여가 20부서의 평균 급여보다 크고 사원을 관리하는 사원으로서 20부서에 속하지
않은
사원의 정보를 보여주는 SQL문 입니다.
SQL>SELECT
b.empno,b.ename,b.job,b.sal, b.deptno
FROM (SELECT
empno
FROM emp
WHERE sal >(SELECT
AVG(sal) FROM emp WHERE deptno = 20)) a, emp b
WHERE a.empno =
b.empno
AND b.mgr is NOT NULL
AND b.deptno !=
20
EMPNO ENAME JOB SAL DEPTNO
----------
---------- --------- ---------- ----------
7698 BLAKE MANAGER
2850 30
7782 CLARK MANAGER 2450
10
|
☞ 다중 열(Multiple-Column) 서브쿼리
◈
다중 열 서브쿼리란 서브쿼리의 결과값이 두개 이상의 컬럼을 반환하는 서브쿼리
입니다.
☞ Pairwise(쌍비교)
Subquery
- 서브쿼리가 한번 실행되면서 모든 조건을 검색해서 주 쿼리로 넘겨
줍니다.
SQL> SELECT empno, sal, deptno
FROM
emp
WHERE (sal, deptno) IN ( SELECT sal,
deptno
FROM
emp
WHERE deptno =
30
AND comm is NOT NULL
);
EMPNO SAL
DEPTNO
---------- ---------- ----------
7521 1250
30
7654 1250 30
7844 1500
30
7499 1600 30
|
☞ Nonpairwise(비쌍비교) Subquery
-
서브쿼리가 여러 조건별로 사용 되어서 결과값을 주 쿼리로 넘겨 줍니다.
SQL>SELECT empno, sal,
deptno
FROM emp
WHERE sal IN ( SELECT
sal
FROM
emp
WHERE deptno =
30
AND comm is NOT NULL
)
AND deptno IN ( SELECT
deptno
FROM
emp
WHERE deptno = 30
AND comm is NOT NULL
);
EMPNO SAL DEPTNO
---------- ----------
----------
7521 1250 30
7654 1250
30
7844 1500 30
7499 1600
30
|
☞ Null Values in a Subquery
-
서브쿼리에서 null값이 반환되면 주 쿼리 에서는 어떠한 행도 반환되지 않습니다.
|
☞ 다중 행(Multiple-Row) 서브쿼리
◈ 하나 이상의 행을 RETURN하는 SUBQUERY를 다중 행 SUBQUERY라고 합니다.
◈ 복수 행 연산자(IN, NOT IN, ANY, ALL, EXISTS)를 사용 할 수
있습니다.
☞ IN 연산자의 사용 예제
부서별로
가장 급여를 많이 받는 사원의 정보를 출력하는 예제
SQL>SELECT empno,ename,sal,deptno
FROM emp
WHERE sal IN
(SELECT MAX(sal)
FROM
emp
GROUP BY deptno);
EMPNO
ENAME SAL DEPTNO
---------- ---------- ----------
----------
7698 BLAKE 2850 30
7788 SCOTT
3000 20
7902 FORD 3000
20
7839 KING 5000
10
|
☞ ANY 연산자의 사용 예제
ANY연산자는
서브쿼리의 결과값중 어느 하나의 값이라도 만족이 되면 결과값을 반환 합니다.
SQL>SELECT ename,
sal
FROM emp
WHERE deptno != 20
AND sal
> ANY(SELECT sal FROM emp
WHERE job='SALESMAN');
ENAME SAL
----------
----------
ALLEN 1600
BLAKE 2850
CLARK
2450
KING 5000
TURNER 1500
MILLER
1300
6 개의 행이 선택되었습니다.
|
☞ ALL 연산자의 사용 예제
ALL연산자는
서브쿼리의 결과값중 모든 결과 값이 만족 되야만 결과값을 반환 합니다.
SQL>SELECT ename, sal
FROM emp
WHERE deptno != 20
AND sal >
ALL(SELECT sal FROM emp WHERE
job='SALESMAN');
ENAME SAL
----------
----------
BLAKE 2850
CLARK 2450
KING
5000
3 개의 행이 선택되었습니다.
|
☞ EXISTS 연산자의 사용 예제
- EXISTS
연산자를 사용하면 서브쿼리의 데이터가 존재하는가의 여부를 먼저 따져 존재하는
값들만을 결과로 반환해
줍니다.
- SUBQUERY에서 적어도 1개의 행을 RETURN하면 논리식은 참이고 그렇지
않으면 거짓 입니다.
예제)사원을 관리할 수 있는 사원의 정보를 보여 줍니다.
SQL>SELECT
empno, ename, sal
FROM emp e
WHERE EXISTS (SELECT empno FROM emp WHERE
e.empno = mgr)
EMPNO ENAME SAL
----------
---------- ----------
7566 JONES 2975
7698 BLAKE
2850
7782 CLARK 2450
7788 SCOTT
3000
7839 KING 5000
7902 FORD
3000
6 개의 행이
선택되었습니다.
|
|
|
================================================
*
Oracle Community
OracleClub.com
* http://www.oracleclub.com
*
http://www.oramaster.net
* 운영자 : 김정식 (oramaster _at_ empal.com)
================================================
|
|