- 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 |