1. SUBQUERY 알려지지 않은 기준에 의한 데이터 검색을 위한 NESTED SUBQUERY와 데이터 조작 문장에 SUBQUERY를 사용하는 방법을 배우고 SUBQUERY에 의해 검색된 데이터 정렬에 대해 다루기로 한다. 1.1 SUBQUERY의 개념 다른 SELECT 문장의 절에 내장된 SELECT 문장 입니다. SUBQUERY는 여러 절에서 사용 가능하며 SELECT 문장 안에 기술된 SELECT 문장이다. NESTED SUBQUERY는 MAIN QUERY이전에 한번만 수행되며 SUBQUERY의 결과를 MAIN QUERY에 의해 조건으로 사용된다. SUBQUERY를 사용하여 간단한 문장을 강력한 문장으로 만들 수 있고 테이블 자체의 데이터에 의존하는 조건으로 테이블의 행을 검색할 필요가 있을 때 아주 유용하다. 1.2 Syntax
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절을 포함할 수 없다. 1.3 SUBQUERY를 사용할 수 있는 절 1) WHERE, HAVING, UPDATE 2) INSERT 구문의 INTO 3) UPDATE 구문의 SET 4) SELECT나 DELETE의 FROM절 1.4 SUBQUERY의 유형 1) 단일 행 SUBQUERY : SELECT문장으로부터 오직 하나의 행만을 검색하는 질의입니다 2) 다중 행 SUBQUERY : SELECT문장으로부터 하나 이상의 행을 검색하는 질의입니다 3) 다중 열 SUBQUERY : SELECT문장으로부터 하나 이상의 열을 검색하는 질의입니다 1.5 단일 행 SUBQUERY 단일 행 SUBQUERY는 내부 SELECT문장으로부터 하나의 행을 검색하는 질의입니다. 이런 유형의 SUBQUERY는 단일 행 연산자를 사용합니다. 이때 WHERE절에 기술된 열의 개수와 데이터 타입은 SELECT 절에 기술된 열과 좌측부터 1대1 대응되며 데이터 타입이 일치해야 한다. 문제) EMP 테이블에서 SCOTT의 급여보다 많은 사원의 정보를 사원번호,이름,담당업무,급여를 출력하여라. SQL> SELECT sal SQL> SELECT empno,ename,job,sal 2 FROM emp 2 FROM emp 3 WHERE ename = 'SCOTT'; 3 WHERE sal > 3000; SAL EMPNO ENAME JOB SAL --------- --------- ---------- --------- --------- 3000 7839 KING PRESIDENT 5000 SQL> SELECT empno,ename,job,sal 2 FROM emp 3 WHERE sal > (SELECT sal 4 FROM emp 5 WHERE ename = 'SCOTT'); EMPNO ENAME JOB SAL --------- ---------- --------- --------- 7839 KING PRESIDENT 5000 문제1) EMP 테이블에서 사원번호가 7521의 업무와 같고 급여가 7934보다 많은 사원의 정보를 사원번호,이름,담당업무,입사일자,급여를 출력하여라.
1.5.1) SUBQUERY에서 그룹 함수 사용 단일 행을 RETURN하는 SUBQUERY에 그룹 함수를 사용하여 MAIN QUERY로부터 데이터를 출력할 수 있다. 문제2) EMP 테이블에서 급여의 평균보다 적은 사원의 정보를 사원번호,이름,담당업무,급여,부서번호를 출력하여라.
1.5.2) SUBQUERY가진 HAVING절 SUBQUERY를 WHERE 절 뿐만 아니라 HAVING절에서도 사용 가능하다. 오라클 서버는 SUBQUERY를 실행하고 MAIN QUERY의 HAVING절에 RETURN한다. 문제3) EMP 테이블에서 20번 부서의 최소 급여보다 많은 모든 부서를 출력하여라.
문제4) EMP 테이블에서 업무별로 가장 적은 급여를 출력하여라.
1.6 다중 행 SUBQUERY 하나 이상의 행을 RETURN하는 SUBQUERY를 다중 행 SUBQUERY라고 부릅니다. 다중 행 SUBQUERY는 단일 행 연산자 대신에 다중 행 연산자를 사용합니다. 다중 행 연산자는 하나 이상의 값을 요구합니다.
위 SELECT 문의 문제점은 SUBQUERY에서 RETURN되는 ROW가 1개 이상이다. 이런 경우는 다중 행 SUBQUERY연산자를 이용하여야 한다
1.6.1) 다중 행 SUBQUERY 연산자 1) IN 연산자 2) ANY 연산자 3) ALL 연산자 4) EXISTS 연산자 1.6.2) IN 연산자 2개 이상의 값을 RETURN하는 SUBQUERY에 대하여 비교 연산자(=,!=,<,<=,>,>=)를 기술하면 ERROR가 발생한다. 이런 경우 SUBQUERY에서 RETURN된 목록의 각각과 비교하여 QUERY를 수행하는 연산자가 IN이다. 문제5) EMP 테이블에서 업무별로 최소 급여를 받는 사원의 정보를 사원번호,이름,업무,입사일자,급여,부서번호를 출력하여라
1.6.3) ANY 연산자 2개 이상의 값을 RETURN하는 SUBQUERY에 대하여는 그런 값들을 어떻게 사용하는가를 지정해 두어야 한다. 비교 연산자(=,!=,<,<=,>,>=)와 SUBQUERY사이에 ANY연산자를 기술하여 RETURN된 목록의 각각의 값과 비교한다. 문제6) EMP 테이블에서 30번 부서의 최소 급여를 받는 사원 보다 많은 급여를 받는 사원의 정보를 사원번호,이름,업무,입사일자,급여,부서번호를 출력하여라. 단 30번은 제외
1.6.4) ALL 연산자 2개 이상의 값을 RETURN하는 SUBQUERY에 대하여는 그런 값들을 어떻게 사용하는가를 지정해 두어야 한다. 비교 연산자(=,!=,<,<=,>,>=)와 SUBQUERY사이에 ALL연산자를 기술하여 RETURN된 목록의 모든 값과 비교한다. 문제7) EMP 테이블에서 30번 부서의 최고 급여를 받는 사원 보다 많은 급여를 받는 사원의 정보를 사원번호,이름,업무,입사일자,급여,부서번호를 출력하여라. 단30번은 제외
1.6.5) EXISTS 연산자 SUBQUERY에서 적어도 1개의 행을 RETURN하면 논리식은 참이고 그렇지 않으면 거짓이다. 문제8) EMP 테이블에서 적어도 한명의 사원으로부터 보고를 받을 수 있는 사원의 정보를 사원번호,이름,업무,입사일자,급여를 출력하여라. 단 사원번호 순으로 정렬하여라.
1.7 다중 열 SUBQUERY SUBQUERY의 구문을 작성할 때 WHERE 절에 비교되는 열이 하나가 아니라 여러 개의 열을 동시에 비교하는 경우가 있다. 이런 경우 다중 열 SUBQUERY라하여 Pairwise 되었다고 한다. 1.7.1) Syntax
SUBQUERY로 작성된 구문을 실행하면 의외의 결과가 검색되는 경우가 있을 것이다. 이런 경우는 반드시 다중 열 SUBQUERY를 사용하여 조회하여야 올바른 자료를 검색할 수 있다. 아래의 예를 보고 정확한 개념을 이해하기 바란다. 문제9) EMP 테이블에서 급여와 보너스가 부서 30에 있는 어떤 사원의 보너스와 급여에 일치하는 사원의 이름,부서번호,급여,보너스를 출력하여라.
♣ 중요 위 결과는 30번 부서에 급여가 1500이고 보너스가 300인 사원이 없는데도 출력되었다. 이는 조건을 각각 별도로 조회할 경우에 발생되는 문제점이다. 이를 해결하기 위해서는 Pairwise SUBQUERY를 이용하여야 한다. 문제10) 업무별로 최소 급여를 받는 사원의 정보를 사원번호,이름,업무,부서번호를 출력하여라. 단 업무별로 정렬하여라.
♣ 중요 위 결과를 사번이 7900인 사원은 업무가 CLERK이다. CLERK의 업무의 최소 급여는 800에도 불구하고 출력되었다. 이는 업무별 최소 급여만 RETURN되지 어느 업무가 어떤 최소값을 가지는지를 알 수 없다. 1.7.2) Pairwise SUBQUERY 앞의 결과를 보면 알 수 있듯이 어떤 업무의 급여가 최소인지 업무와 최소 급여를 동시에 비교하여야 한다. 문제11) EMP 테이블에서 급여와 보너스가 부서 30에 있는 어떤 사원의 보너스와 급여에 일치하는 사원의 이름,부서번호,급여,보너스를 출력하여라.
문제12) 업무별로 최소 급여를 받는 사원의 정보를 사원번호,이름,업무,부서번호를 출력하여라. 단 업무별로 정렬하여라.
1.8 SUBQUERY에서의 NULL값 NULL값을 비교하는 모든 조건은 NULL이다.
위 문장의 SELECT 문장은 1명 이상으로부터 보고를 받을 수 있는 사원의 정보를 출력한 것이다. 그러면 말단 직원을 출력할 경우에는 SELECT 문장을 어떻게 기술해야 할까. 일반 사용자가 실수하기 쉬운 부분이다. 우선 IN대신 NOT IN을 사용하면 쉽게 해결될 것이라 생각한다. 그러나 여기에는 다음과 같은 문제점이 있다. 우선 다음의 SELECT문장을 보기 바란다.
위의 SELECT 문장의 결과 SUBQUERY에서 RETURN되는 값 중에는 NULL(KING은 MGR이 NULL이다)이 있다. NULL에 어떠한 연산을 하여도 모든 조건은 NULL이므로 전체 값이 존재하지 않는다고 RETURN한다. SUBQUERY의 결과 집합의 일부분으로서 NULL값은 IN연산자를 사용할 경우는 문제가 되지 않지만 NOT IN연산자를 사용하면 안된다. ☞ Guidelines SUBQUERY의 결과 집합의 일부분으로서 NULL값은 IN(= ANY) 연산자를 사용할 수 있다.그러나 NOT IN(!= ALL)연산자를 사용할 수 없다. 1.9 FROM절에서의 SUBQUERY SUBQUERY는 FROM절에서도 사용 가능하다. 하나의 테이블에서 자료의 양이 많을 경우 FROM절에 테이블 전체를 기술하여 사용하면 효율이 떨어질 수 있다. 이런 경우 필요한 행과 열만 선택하여 FROM절에 기술하면 오라클 서버가 최적화 단계에서 효율적인 검색을 할 수 있다. 이처럼 FROM절에 기술한 SUBQUERY는 마치 VIEW와 같은 역할을 한다. 이런 VIEW를 INLINE VIEW라 한다. 문제13) EMP과 DEPT 테이블에서 업무가 MANAGER인 사원의 정보를 이름,업무,부서명,근무지를 출력하여라
◈ 연 습 문 제 ◈ 1. EMP 테이블에서 Blake와 같은 부서에 있는 모든 사원의 이름과 입사일자를 출력하는 SELECT문을 작성하시오. 2. EMP 테이블에서 평균 급여 이상을 받는 모든 종업원에 대해서 종업원 번호와 이름을 출력하는 SELECT문을 작성하시오. 단 급여가 많은 순으로 출력하여라. 3. EMP 테이블에서 이름에 “T”가 있는 사원이 근무하는 부서에서 근무하는 모든 종업원에 대해 사원 번호,이름,급여를 출력하는 SELECT문을 작성하시오. 단 사원번호 순으로 출력하여라. 4. EMP 테이블에서 부서 위치가 Dallas인 모든 종업원에 대해 이름,업무,급여를 출력하는 SELECT문을 작성하시오. 5. EMP 테이블에서 King에게 보고하는 모든 사원의 이름과 급여를 출력하는 SELECT문을 작성하시오. 6. EMP 테이블에서 SALES부서 사원의 이름,업무를 출력하는 SELECT문을 작성하시오. 7. EMP 테이블에서 월급이 부서 30의 최저 월급보다 높은 사원을 출력하는 SELECT문을 작성하시오. 8. EMP 테이블에서 부서 10에서 부서 30의 사원과 같은 업무를 맡고 있는 사원의 이름과 업무를 출력하는 SELECT문을 작성하시오. 9. EMP 테이블에서 FORD와 업무도 월급도 같은 사원의 모든 정보를 출력하는 SELECT문을 작성하시오. 10. EMP 테이블에서 업무가 JONS와 같거나 월급이 FORD이상인 사원의 정보를 이름,업무,부서번호,급여를 출력하는 SELECT문을 작성하시오. 단 업무별, 월급이 많은 순으로 출력하여라. 11. EMP 테이블에서 SCOTT 또는 WARD와 월급이 같은 사원의 정보를 이름,업무,급여를 출력하는 SELECT문을 작성하시오. 12. EMP 테이블에서 CHICAGO에서 근무하는 사원과 같은 업무를 하는 사원의 이름,업무를 출력하는 SELECT문을 작성하시오. 13. EMP 테이블에서 부서별로 월급이 평균 월급보다 높은 사원을 부서번호,이름,급여를 출력하는 SELECT문을 작성하시오. 14. EMP 테이블에서 업무별로 월급이 평균 월급보다 낮은 사원을 부서번호,이름,급여를 출력하는 SELECT문을 작성하시오. 15. EMP 테이블에서 적어도 한명 이상으로부터 보고를 받을 수 있는 사원을 업무,이름,사원번호,부서번호를 출력하는 SELECT문을 작성하시오. 16. EMP 테이블에서 말단 사원의 사원번호,이름,업무,부서번호를 출력하는 SELECT문을 작성하시오. |