반응형
이 게시물은 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;
봉급(SAL)이 3000 이상인 직원을 구하는 쿼리문을 실행하면 위와 같이 3개의 레코드가 출력된다. 그렇다면 이 2개 이상의 레코드가 출력되는 쿼리문을 서브쿼리로 하여 비교를 하면 어떤 일이 일어날까?
SELECT *
FROM EMP
WHERE SAL > (SELECT SAL
FROM EMP
WHERE SAL >= 3000);
정말 이상한 쿼리문이 되었지만, 일단은 이것을 실행시켜 보자.
위 쿼리문의 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
-- query2
반응형
'개발 지식 > [DBMS] Oracle' 카테고리의 다른 글
[Oracle] 서브쿼리(4) - 다중열 서브쿼리를 통한 WHERE절 비교 (0) | 2022.06.05 |
---|---|
[Oracle] 서브쿼리(3) - 다중행 서브쿼리 (0) | 2022.06.04 |
[Oracle] 서브쿼리(1) - 서브쿼리의 개념과 특징 (0) | 2022.06.02 |
[Oracle] JOIN(5) - SQL-99 표준 JOIN (0) | 2022.06.01 |
[Oracle] JOIN(4) - 외부 조인(OUTER JOIN) (0) | 2022.05.31 |