오라클 서브쿼리, 단일행 서브쿼리(Single-Row Subquery)
단일행 서브쿼리
단일행 서브쿼리(single-row subquery)는 서브쿼리에서 결과를 하나만 반환합니다. 단일행 연산자 > , >= , < , <= , = , <>를 사용합니다(2.5절 ‘연산자’ 참조).
단일행 서브쿼리나 복수행 서브쿼리는 SELECT 다음 컬럼 위치에 괄호로 싸서 SELECT 가 올수 있으며(스칼라 서브쿼리), FROM절 다음에 괄호로 싸서 SELECT가 올수있고(인라인 뷰), WHERE 절에 괄호로 싸서 SELECT가 올 수 있으며, ORDER BY 다음에도 괄호로 싸서 SELECT가 올수 있습니다. 단지 괄호로 싼 SELECT절이 값을 하나 리턴하느냐 둘 이상의 값을 리턴하느냐의 차이에 따라 단일행 서브쿼리, 복수행 서브쿼리로 구별합니다.
다음은 WHERE절에 단일행 서브쿼리가 올때의 형식 입니다.
단일행 서브쿼리 예문을 살펴봅시다.
5.2.1 두 번 쿼리해서 특정 직원과 같은 정보를 갖는 직원 정보 출력하기
EMP 테이블에서 ‘SMITH’와 같은 JOB을 가지는 직원들의 ENAME, SAL, JOB을 추출합시다. 만약 ‘SMITH’의 JOB이 ‘CLERK’이라는 사실을 알고 있다면 쉬울 겁니다. 그런데 나도 모르는 사이에 ‘SMITH’의 JOB이 바뀌면 어떻게 될까요? 어쩔 수 없이 아래와 같이 매번 두 번 쿼리를 해야 합니다. |
SELECT JOB FROM EMP WHERE ENAME = 'SMITH'; |
<실행 결과>
| JOB |
1 | CLERK |
SELECT ENAME, SAL, JOB FROM EMP WHERE JOB = 'CLERK' |
<실행 결과>
| ENAME | SAL | JOB |
1 | SMITH | 800 | CLERK |
2 | ADAMS | 1100 | CLERK |
3 | JAMES | 950 | CLERK |
4 | MILLER | 1300 | CLERK |
쿼리를 두 번 수행해서 원하는 결과를 얻었습니다. 한 번에 결과를 얻을 방법이 없을까요? 바로 서브쿼리를 사용하면 됩니다.
5.2.2 한 번 쿼리해서 특정 직원과 같은 정보를 갖는 직원 정보 출력하기 : 서브쿼리
서브쿼리를 사용해서 ‘SMITH’와 같은 JOB을 가지는 직원들의 ENAME, SAL, JOB을 한방에 추출합시다. |
SELECT ENAME, SAL, JOB ❷ FROM EMP WHERE JOB = (SELECT JOB ❶ FROM EMP WHERE ENAME = 'SMITH'); |
<실행 결과>
| ENAME | SAL | JOB |
1 | SMITH | 800 | CLERK |
2 | ADAMS | 1100 | CLERK |
3 | JAMES | 950 | CLERK |
4 | MILLER | 1300 | CLERK |
❶ “SMITH”의 JOB을 구하는 서브쿼리가 먼저 실행되어 “CLERK”을 반환합니다.
❷ 반환된 “CLERK”값을 가지고 바깥쪽의 메인쿼리가 실행되어 최종 결과를 반환합니다.
5.2.3 급여를 가장 적게 받는 직원 정보 출력하기 : 서브쿼리
급여 최대값을 구하기 위해서는 MIN(SAL)을 사용 합니다.
직원(EMP) 테이블에서 급여를 가장 적게 받는 직원의 이름과 급여를 출력하는 쿼리문을 만들어봅시다. |
SELECT ENAME, SAL ❷ FROM EMP WHERE SAL = (SELECT MIN(SAL) ❶ FROM EMP); |
<실행 결과>
ENAME | SAL | |
1 | SMITH | 800 |
<실행 순서>
❶ 직원(EMP) 테이블에서 급여의 최소값인 MIN(SAL)을 구하는 서브쿼리가 먼저 실행되어 800을 반환합니다. ❷ 이 값을 가지고 메인쿼리가 실행이 되어 최종 결과를 추출합니다. 만약 급여가 800인 직원이 여럿이면 모두 출력됩니다.
5.2.4 특정부서 급여 최대값보다 급여가 많은 직원 정보 출력하기 : 서브쿼리
급여 최대값을 구하기 위해서는 MAX(SAL)을 사용 합니다.
직원(EMP) 테이블에서 10번 부서의 급여 최대값보다 급여를 많이 받는 직원의 이름과 급여, 부서코드을 출력하는 쿼리문을 만들어봅시다. |
SELECT ENAME, SAL, DEPTNO ❷ FROM EMP WHERE SAL > (SELECT MAX(SAL) ❶ FROM EMP WHERE DEPTNO = 10); |
<실행 결과>
ENAME | SAL | DEPTNO | |
1 | JONES | 2975 | 20 |
2 | BLAKE | 2850 | 30 |
3 | SCOTT | 3000 | 20 |
4 | KING | 5000 | (null) |
5 | FORD | 3000 | 20 |
<실행 순서>
❶ 직원(EMP) 테이블에서 10번 부서 급여의 최대값인 MAX(SAL)을 구하는 서브쿼리가 먼저 실행되어 2450을 반환합니다. ❷ 이 값을 가지고 메인쿼리가 실행이 되어 최종 결과를 추출합니다. 만약 급여가 800인 직원이 여럿이면 모두 출력됩니다.
#오라클 #ORACLE #서브쿼리 #단일행서브쿼리 #subquery