Oracle - 서브 쿼리의 종류

Posted 07 4, 2010 11:07, Filed under: DataBase/Oracle

사용자 삽입 이미지














* SUB-QUERY는 4가지 종류가 있습니다.

  • 단일 행 SUB-QUERY
  • 복수 행 SUB-QUERY
  • 복수 컬럼 SUB-QUERY
  • 상호관련 SUB-QUERY
# 단일 행 SUB-QUERY
- 단일 행 SUB-QUERY 는 그 실행 결과가 하나의 컬럼, 하나의 행을 리턴해 주는 경우를 의미합니다. 그 결과와 비교 해야 하기 때문에 비교 연산자가 사용 됩니다.
/*
 단일 행 SUB-QUERY 가 여러 개의 결과를 리턴하는 경우 에러가 발생합니다.
*/
SQL> SELECT ENAME, SAL
  2  FROM EMP
  3    WHERE SAL = (SELECT SAL FROM EMP
  4    WHERE DEPTNO = 10);
  WHERE SAL = (SELECT SAL FROM EMP
               *
ERROR at line 3:
ORA-01427: single-row subquery returns more than one row(단일 행 부속 질의에 1개 이상의 행이 리턴 되었습니다.)

/*
 SUB-QUERY에 의해 리턴되는 결과의 컬럼 수와 MAIN-QUERY에서 비교되는 컬럼 수가 일치하지 않으면 에러가 발생합니다.
*/
SQL> SELECT ENAME, SAL
  2  FROM EMP
  3    WHERE SAL = (SELECT SAL, COMM FROM EMP
  4    WHERE DEPTNO = 10);
  WHERE SAL = (SELECT SAL, COMM FROM EMP
               *
ERROR at line 3:
ORA-00913: too many values

/*
 SUB-QUERY의 WHERE 절에 복수 행 함수를 사용할 수 없습니다.
*/
SQL> SELECT ENAME, SAL
  2  FROM EMP
  3    WHERE SAL = (SELECT SAL FROM EMP
  4    WHERE SAL > AVG(SAL));
  WHERE SAL > AVG(SAL))
              *
ERROR at line 4:
ORA-00934: group function is not allowed here
# 복수 행 SUB-QUERY
- 복수 행 SUB-QUERY는 그 실행 결과가 여러 개의 행을 리턴해 주는 경우를 의미합니다.

1) IN 연산자 : SUB-QUERY에 의해 리턴되는 값 중에서 조건에 해당하는 행이 있으면 출력해 줍니다.
SQL> SELECT ENAME, SAL
  2  FROM EMP
  3  WHERE SAL IN (SELECT MAX(SAL) FROM EMP
  4  GROUP BY DEPTNO);

ENAME             SAL
---------- ----------
BLAKE            2850
FORD             3000
SCOTT            3000
KING             5000
CLARK            2450
2) ANY 연산자
SQL> SELECT EMPNO, ENAME, JOB, SAL
  2  FROM EMP
  3    WHERE SAL = ANY (SELECT SAL FROM EMP
  4    WHERE JOB = 'MANAGER');

     EMPNO ENAME      JOB              SAL
---------- ---------- --------- ----------
      7566 JONES      MANAGER         2975
      7698 BLAKE      MANAGER         2850
      7782 CLARK      MANAGER         2450
3) ALL 연산자
- <ALL : 결과 중에 가장 작은 값보다 작은 조건의 행
- >ALL : 결과 중에 가장 큰 값보다 큰 조건의 행
SQL> SELECT EMPNO, ENAME, JOB, SAL
  2  FROM EMP
  3    WHERE SAL < ALL (SELECT SAL FROM EMP
  4    WHERE JOB = 'MANAGER');

     EMPNO ENAME      JOB              SAL
---------- ---------- --------- ----------
      7368 SMITH      CLERK            800
      7369 SMITH      CLERK            800
      7499 ALLEN      SALESMAN        1600
      7521 WARD       SALESMAN        1250
      7654 MARTIN     SALESMAN        1250
      7844 TURNER     SALESMAN        1500
      7876 ADAMS      CLERK           1100
      7900 JAMES      CLERK           1957
      7934 MILLER     CLERK           1300

SQL> SELECT EMPNO, ENAME, JOB, SAL
  2  FROM EMP
  3    WHERE SAL > ALL (SELECT SAL FROM EMP
  4    WHERE JOB = 'MANAGER');

     EMPNO ENAME      JOB              SAL
---------- ---------- --------- ----------
      7788 SCOTT      ANALYST         3000
      7839 KING       PRESIDENT       5000
      7902 FORD       ANALYST         3000
4) EXISTS 연산자
SQL> SELECT DNAME, DEPTNO
  2  FROM DEPT
  3    WHERE EXISTS (SELECT * FROM EMP
  4    WHERE DEPTNO = 10);

DNAME              DEPTNO
-------------- ----------
ACCOUNTING             10
RESEARCH               20
SALES                  30
OPERATIONS             40

# 복수 컬럼 SUB-QUERY

사용자 삽입 이미지














- 복수 컬럼 SUB-QUERY는 실행 결과가 복수 개의 컬럼, 복수 개의 행을 리턴 해줍니다.
SQL> SELECT ENAME, DEPTNO, NVL(COMM, -1)
  2    FROM EMP
  3    WHERE (SAL, NVL(COMM, -1)) IN (SELECT SAL, NVL(COMM, -1)
  4    FROM EMP
  5    WHERE DEPTNO = 30);

ENAME          DEPTNO NVL(COMM,-1)
---------- ---------- ------------
ALLEN              30          300
WARD               30          500
MARTIN             30         1400
BLAKE              30           -1
TURNER             30            0
JAMES              30           -1
# 상호 관련 SUB-QUERY
- 상호 연관 SUB-QUERY는 MAIN-QUERY절에 사용된 테이블이 SUB-QUERY절에 다시 재사용되는 경우의 SUB-QUERY를 말합니다. SUB-QUERY에 사용 될 조건 값을 MAIN-QUERY로부터 참조해야 하는 경우 사용되는 방법입니다.
이러한 SUB-QUERY의 사용은 사용자의 SQL문을 보다 쉽고 간편하게 해주는 장점을 가지고 있지만 한편으론 성능을 저하하는 단점을 가지고 있기도 합니다.
SQL> SELECT E.EMPNO, E.ENAME, E.DEPTNO
  2  FROM EMP E
  3  WHERE SAL > (SELECT AVG(SAL)
  4  FROM EMP D
  5  WHERE D.DEPTNO = E.DEPTNO);

     EMPNO ENAME          DEPTNO
---------- ---------- ----------
      7698 BLAKE              30
      7900 JAMES              30
      7566 JONES              20
      7788 SCOTT              20
      7902 FORD               20
      7782 CLARK              10





출처 : 오라클 ACE가 해설하는 NEW SQL & PL/SQL
07 4, 2010 11:07 07 4, 2010 11:07

Trackback URL : http://develop.sunshiny.co.kr/trackback/516

Leave a comment

« Previous : 1 : ... 70 : 71 : 72 : 73 : 74 : 75 : 76 : 77 : 78 : ... 365 : Next »

Recent Posts

  1. Linux - Telnet 서비스 비활성및 실행
  2. NT - 서버 원격데스크탑 연결
  3. NT - http와 https간에 세션 공유가...
  4. Unix - 대량 파일 이동, 삭제시 Argu...
  5. Oracle - SYS_CONTEXT 함수를 이용하...

Recent Comments

  1. 네. 고맙습니다^^ 행복한 한해 보... sunshiny 01 16,
  2. sunshiny님. 안녕하세요... 올려 주... yihans 01 16,
  3. 답글 주셔서 고맙습니다^^ 소스 복... sunshiny 01 11,
  4. 관리자만 볼 수 있는 댓글입니다. 비밀방문자 01 11,
  5. 넵 답변감사합니다^^ 좋은 하루 되... 노로링

Recent Trackbacks

  1. 윈도우 cmd 명령어 팁 월풍도원(月風道院) - Delight on th... %M
  2. 파일 압축 Like RadioHead %M
  3. Mysql - mysql 설치후 Character set... 멀고 가까움이 다르기 때문 %M

Calendar

«   02 2012   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29      

Bookmarks

  1. 위키피디아
  2. MysqlKorea
  3. Oracle All Documentation
  4. 엑셈
  5. 오라클 클럽
  6. 네이버개발자센터
  7. API - Java
  8. API - Spring
  9. Java Community
  10. Reference - Spring
  11. 스프링사용자
  12. 자바지기
  13. Ready System
  14. Solaris Freeware
  15. Linux-Site
  16. RedHat Korea
  17. 윈디하나의 솔라나라

Site Stats

TOTAL 217710 HIT
TODAY 12 HIT
YESTERDAY 115 HIT