상세 컨텐츠

본문 제목

오라클 서브쿼리에 대해 알아보자

Database/Oracle

by somiyuralove 2021. 2. 24. 07:53

본문

서브쿼리는 하나의 SQL 문 안에 포함되어 있는 또 다른 SQL 문을 의미합니다.

SUBQUERY 개념

SQL 에 포함된 또 다른 SQL을 서브쿼리라고 합니다. 서브쿼리는 SELECT절, FROM절, WHERE절, HAVING절에 사용될 수 있습니다.

서브쿼리는 메인 쿼리가 실행되기 전에 먼저 실행되며 서브쿼리에서는 메인 쿼리의 모든 컬럼을 참조할 수 있지만 메인 쿼리에서는 서브쿼리의 컬럼을 참조할 수 없습니다.

서브쿼리 개념

SUBQUERY 유형

단일행 서브쿼리

서브쿼리에서 한 행에 대한 결과 값만 반환하는 것을 단일행 서브쿼리라고 합니다

다중행 서브쿼리

서브쿼리에서 여러 행에 대한 결과 값을 반환하는 것을 다중행 서브쿼리라고 합니다.

다중열 서브쿼리

서브쿼리에서 여러 열에 대한 결과 값을 반환하는 것을 다중열 서브쿼리라고 합니다.

SUBQUERY 구문

SELECT select_list
FROM table_name
WHERE 표현식 연산자 (SELECT select_list
FROM table_name
WHERE 조건식);

표현식 연산자 : subquery는 비교 연산자 우측에 () 안에 작성한다.

SUBQUERY 예제

employee 테이블에서 gildong보다 급여를 많이 받는 사원을 출력하시오.

iSQL> SELECT ename, salary
FROM employee
WHERE salary > (SELECT salary
FROM employee
WHERE ename = 'gildong') ;

SUBQUERY 연산자

단일행 SUBQUERY 연산자

WHERE 절에서 사용된 서브쿼리에서 한 개의 결과 값만 반환할 경우 사용하는 연산자는 다음과 같습니다. 이 외의 연산자를 사용할 경우 에러가 발생할 수 있습니다.

연산자 의미

= 같음

> 보다 큼

>= 크가나 같음

< 보다 작음

<= 작거나 같음

, != 같지 않음

단일행 SUBQUERY 연산자 예제

20번 사원과 같은 부서에서 일하는 사원을 출력하시오.

iSQL> SELECT ename, dno
FROM employee
WHERE dno = (SELECT dno
FROM employee
WHERE eno = 20) ;

다중행 SUBQUERY 연산자

다중 행 subquery를 이용하여 데이터를 비교할 경우에는 다중 행 연산자를 사용합니다. 만약 다중 행 subquery에 단일 행 연산자를 사용한다면, 다음과 같은 오류가 발생합니다.

"A single-row subquery returns more than one row"

연산자 의미

IN subquery 결과에 존재하는 임의의 값과 일치

ANY subquery 결과에 존재하는 어느 하나의 값이라도 만족

ALL subquery 결과에 존재하는 모든 값에 만족

EXISTS subquery 결과를 만족하는 값이 존재하는지 여부를 확인

다중행 SUBQUERY 예제

각 부서에서 급여를 가장 적게 받는 사원들을 출력하시오

iSQL> SELECT dno, ename, salary
FROM employee
WHERE salary = (SELECT MIN(salary)
FROM employee
GROUP BY dno);

[ERR-31002 : A single-row subquery returns more than one row.]

iSQL> SELECT dno, ename, salary
FROM employee
WHERE salary IN (SELECT MIN(salary)
FROM employee
GROUP BY dno) ;

10 rows selected.

SCALAR SUBQUERY

SCALAR SUBQUERY 개념

SELECT 의 target 절에서 사용하는 서브쿼리를 스칼라 서브쿼리라고 합니다.

스칼라 서브쿼리는 메인 서브쿼리의 row수 만큼 반복되어 실행이 되고, 만약 조건에 만족하는 스칼라 서브쿼리의 결과가 없다면 NULL 을 리턴하게 됩니다.

SCALAR SUBQUERY 예제

사원 정보와 각 사원이 속한 부서의 평균 급여를 함께 출력하시오.

iSQL> SELECT ename, salary, (SELECT AVG(salary) FROM employee WHERE dno = e.dno) avg_sal
FROM employee e
ENAME SALARY AVG_SAL

-------------------------------------------

HSCHOI 2000000 2150000

KSKIM 1800000 1800000



INLINE VIEW
INLINE VIEW 개념

SELECT 의 FROM 절에서 사용하는 서브쿼리를 inline view라고 합니다. view와는 달리 inline view에서 사용하는 SELECT문을 저장하지 않기 때문에 dynamic view 라고도 부릅니다.

다른 서브쿼리와는 다르게 inline view에서 질의하는 칼럼들을 메인 서브쿼리에서 사용할 수 있습니다.

INLINE VIEW 예제

사원 정보와 각 사원이 속한 부서의 평균 급여를 함께 출력하라.

iSQL> SELECT e.ename, e.salary, a.avg_sal
FROM employee e, (SELECT dno, AVG(salary) avg_sal FROM employee GROUP BY dno) a
WHERE e.dno = a.dno;

ENAME SALARY AVG_SAL

-----------------------------------------

HSCHOI 2000000 2150000

JHCHOI 2300000 2150000

HYCHOI 1700000 1340000

KWKIM 980000 1340000

YHBAE 4000000 2438250



[출처 : gurubee.net]

관련글 더보기

댓글 영역