DB

SQL명령어 (SELECT 의 SUBQUERY)

닉넥임 2013. 7. 30. 23:10
반응형

 - SUBQUERY 

 : 다른 SELECT 문장의 절에 내장된 SELECT문장 입니다. SUBQUERY 는 여러 절에서 사용이 가능하며 SELECT 문장 안에 기술된 SELECT 문장이다.

      

      Syntax

 MAIN QUERY

SELECT               select_list

FROM         table

WHERE        expression operator        SUBQUERY

 


                            (SELECT        select_list

                            FROM          table

 WHERE              condition);

1)   SUBQUERY는 다른 하나의 SQL 문장의 절에 NESTEDED SELECT 문장이다.

2)   알려지지 않은 조건에 근거한 값들을 검색하는 SELECT 문장을 작성하는데 유용하다.

3)   SUBQUERY MAIN QUERY 이전에 한 번 실행한다.

4)   SUBQUERY의 결과는 MAIN OUTER QUERY에 의해 사용된다.

 

Guidelines

1)   SUBQUERY는 괄호로 묶어야 한다.

2)   두 종류의 비교 연산자들이 SUBQUERY에 사용된다.

   단일 행 연산자

=,>, >=, <, <=, <>, !=

   복수 행 연산자

IN, NOT IN, ANY, ALL, EXISTS

3)   SUBQUERY는 연산자의 오른쪽에 나타나야 한다.

4)   SUBQUERY는 많은 SQL 명령에서 사용 가능하다.

5)   SUBQUERY ORDER BY절을 포함할 수 없다.


 - SUBQUERY를 사용할 수 있는 절

1)   WHERE, HAVING, UPDATE

2)   INSERT 구문의 INTO

3)   UPDATE 구문의 SET

4)   SELECT DELETE FROM


 - SUBQUERY의 유형

1)   단일 행 SUBQUERY : SELECT문장으로부터 오직 하나의 행만을 검색하는 질의입니다

 - 단일 행의 경우 WHERE 절에 기술된 열의 개수와 데이터 타입은 SELECT 절에 기술된 연과 좌측부터 1대 1 대응되며 데이터 타입이 일치해야 한다.

2)   다중 행 SUBQUERY : SELECT문장으로부터 하나 이상의 행을 검색하는 질의입니다

 - 다중 행의 경우 RETURN 되는 ROW가 1개이상이기에 다중행 SUBQUERY연산자(IN, ANY, ALL, EXISTS)를 이용 하여야한다.

3)   다중 열 SUBQUERY : SELECT문장으로부터 하나 이상의 열을 검색하는 질의입니다

  - WHERE 절에 비교되는 열이 하나가 아니라 여러 개의 열을 동시에 비교하는 경우가 있다 이런 경우 다중 열 SUBQUERY 라하여 Pairwise 되었다고 한다.

- 다중 열 Syntax

SELECT        * | column1[,column2,...]

      FROM   table

      WHERE  (column1,column2,...) IN ( SELECT column1,column2,...

                          FROM           table

                                         WHERE            condition);

 SUBQUERY로 작성된 구문을 실행하면 의외의 결과가 검색되는 경우가 있을 것이다. 이런 경우는 반드시 다중 열 SUBQUERY를 사용하여 조회하여야 올바른 자료를 검색할 수 있다.

 

     - 다중 행 SUBQUERY 연산자의 유형(IN, ANY, ALL, EXISTS)

IN 연산자 

  2개상의 값을 RETURN 하는 SUBQUERY에 대하여 비교 연산자(=, !=, <, <=, >, >=)를 기술하면 ERROR 가 발생한다. 이런 경우 SUBQUERY에서 RETURN 된 목록의 각각과 비교하여 QUERY를 수행하는 연산자가 IN이다.

ex) EMP 테이블에서 업무별로 최소 급여를 받는 사원의 정보를 사원번호,이름,업무,입사일자,급여,부서번호를 출력하여라

SQL> SELECT empno,ename,job,hiredate,sal,deptno

  2  FROM emp

  3  WHERE sal IN (SELECT MIN(sal)

  4                 FROM emp

  5                 GROUP BY job);

 

EMPNO ENAME      JOB       HIREDATE                 SAL    DEPTNO

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

     7369 SMITH      CLERK     17-DEC-80                800        20

     7654 MARTIN     SALESMAN  28-SEP-81               1250        30

     7521 WARD       SALESMAN  22-FEB-81               1250        30

     7782 CLARK      MANAGER   09-JUN-81               2450        10

     7902 FORD       ANALYST   03-DEC-81               3000        20

     7788 SCOTT      ANALYST   09-DEC-82               3000        20

     7839 KING       PRESIDENT 17-NOV-81               5000        10

 

7 rows selected.

 

- ANY 연산자

      비교연산자(=, !=, <, <=, >, >=)와 SUBQUERY 사이에 ANY 연산자를 기술하여 RETURN된 목록의 각각의값과 비교한다. 

ex) EMP 테이블에서 30번 부서의 최소 급여를 받는 사원 보다 많은 급여를 받는 사원의 정보를 사원번호,이름,업무,입사일자,급여,부서번호를 출력하여라. 단 30번은 제외

SQL> SELECT empno,ename,job,hiredate,sal,deptno

  2  FROM emp

  3  WHERE deptno != 30 AND sal > ANY (SELECT sal

  4                                   FROM emp

  5                                   WHERE deptno = 30);

 

EMPNO ENAME      JOB       HIREDATE                 SAL    DEPTNO

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

     7839 KING       PRESIDENT 17-NOV-81               5000        10

     7782 CLARK      MANAGER   09-JUN-81               2450        10

     7566 JONES      MANAGER   02-APR-81               2975        20

     7902 FORD       ANALYST   03-DEC-81               3000        20

     7788 SCOTT      ANALYST   09-DEC-82               3000        20

     7876 ADAMS      CLERK     12-JAN-83               1100        20

. . . . . . . . . .

7 rows selected.




- ALL 연산자

2개 이상의 값을 RETURN하는 SUBQUERY에 대하여는 그런 값들을 어떻게 사용하는가를 지정해 두어야 한다. 비교 연산자(=,!=,<,<=,>,>=) SUBQUERY사이에 ALL연산자를 기술하여 RETURN  목록의 모든 값과 비교한다.

 

ex) EMP 테이블에서 30번 부서의 최고 급여를 받는 사원 보다 많은 급여를 받는 사원의 정보를 사원번호,이름,업무,입사일자,급여,부서번호를 출력하여라30번은 제외

SQL> SELECT empno,ename,job,hiredate,sal,deptno

  2  FROM emp

  3  WHERE deptno != 30 AND sal > ALL (SELECT sal

  4                                     FROM emp

  5                                     WHERE deptno = 30);

 

    EMPNO ENAME      JOB       HIREDATE                 SAL    DEPTNO

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

     7839 KING       PRESIDENT 17-NOV-81               5000        10

     7566 JONES      MANAGER   02-APR-81               2975        20

     7902 FORD       ANALYST   03-DEC-81               3000        20

     7788 SCOTT      ANALYST   09-DEC-82               3000        20


- EXISTS 연산자

SUBQUERY에서 적어도 1개의 행을 RETURN하면 논리식은 참이고 그렇지 않으면 거짓이다.

ex) EMP 테이블에서 적어도 한명의 사원으로부터 보고를 받을 수 있는 사원의 정보를 사원번호,이름,업무,입사일자,급여를 출력하여라단 사원번호 순으로 정렬하여라.

SQL> SELECT empno,ename,job,hiredate,sal,deptno

  2  FROM emp e

  3  WHERE EXISTS (SELECT *

  4                 FROM emp

  5                 WHERE e.empno = mgr)

  6  ORDER BY empno;

 

EMPNO ENAME      JOB       HIREDATE                 SAL    DEPTNO

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

     7566 JONES      MANAGER   02-APR-81               2975        20

     7698 BLAKE      MANAGER   01-MAY-81               2850        30

     7782 CLARK      MANAGER   09-JUN-81               2450        10

     7788 SCOTT      ANALYST   09-DEC-82               3000        20

     7839 KING       PRESIDENT 17-NOV-81               5000        10

     7902 FORD       ANALYST   03-DEC-81               3000        20

 

6 rows selected.


 







반응형

'DB' 카테고리의 다른 글

SQL 문제-3  (0) 2013.07.22
SQL 명령어(단일함수)[미완]  (0) 2013.07.18
그룹 함수(GROUP BY)  (0) 2013.07.17
SQL명령어 (WHERE)  (0) 2013.07.12
SQL명령어 (SELECT)  (0) 2013.07.12