개발 지식/[DBMS] Oracle

[Oracle] 서브쿼리(2) - 단일행 서브쿼리

devGSP 2022. 6. 3. 08:00
반응형
이 게시물은 Database GUI Oracle SQL Developer의 아래 버전 정보를 기준으로 작성되었습니다.

Java(TM) 플랫폼 : 1.8.0_321
Oracle IDE : 4.1.5.21.78

 

단일행 서브쿼리

 

이전 포스트에서 SCOTT보다 봉급이 높은 직원을 구하는 서브쿼리를 실행해 보았다. 하지만 이 쿼리에는 하나의 문제점이 있다.

우리는 앞서 SCOTT의 봉급을 구하는 쿼리로 3000이라는 하나의 레코드가 나오는 것을 확인하였기 때문에 이 쿼리에 어떠한 의심도 갖지 않는다. 즉, 우리는 SCOTT라는 이름을 가진 직원이 한 명인 것을 전제로 쿼리문을 실행한 것이다.

 

아래 쿼리문을 살펴보자. 

SELECT ENAME, SAL
  FROM EMP
 WHERE SAL >= 3000;

sq2_q1

 

봉급(SAL)이 3000 이상인 직원을 구하는 쿼리문을 실행하면 위와 같이 3개의 레코드가 출력된다. 그렇다면 이 2개 이상의 레코드가 출력되는 쿼리문을 서브쿼리로 하여 비교를 하면 어떤 일이 일어날까?

SELECT *
  FROM EMP
 WHERE SAL > (SELECT SAL
                FROM EMP
               WHERE SAL >= 3000);

정말 이상한 쿼리문이 되었지만, 일단은 이것을 실행시켜 보자.

sq2_q2

 

위 쿼리문의 WHERE절에 있는 '>=' 연산자는 반드시 단일행을 가진 서브쿼리만이 가능하다. 즉, 아까 전의 질문으로 돌아가자면 SCOTT라는 이름을 가진 직원이 두 명 이상이라면 쿼리문은 오류가 일어난다.

다중행인 서브쿼리를 이용하여 어떠한 비교를 하려면, 다중행 연산자를 사용하여야 한다. 이는 다음 포스트에서 다루도록 한다.

 

단일행 서브쿼리의 예시

-- query1
SELECT *
  FROM EMP
 WHERE HIREDATE < (SELECT HIREDATE
                     FROM EMP
                    WHERE ENAME = 'WARD');
-- query2
SELECT E.EMPNO
     , E.ENAME
     , E.JOB
     , E.SAL
     , D.DEPTNO
     , D.DNAME
     , D.LOC
  FROM EMP E, DEPT D
 WHERE E.DEPTNO = D.DEPTNO
   AND E.DEPTNO = 20
   AND E.SAL > (SELECT AVG(SAL)
                  FROM EMP);

 

결과

 

-- query1

sq2_q3


-- query2

sq2_q4

 

반응형