◈ 단일 행 Subquery와 다중 행 Subquery
서브쿼리는 반환하는 행 수가 한개인 것과 여러 개인 것에 따라서 단일 행 서브쿼리와 멀티 행 서브쿼리로 분류된다.
단일 행 서브쿼리는 단 하나의 행만 반환하는 서브쿼리로 비교 연산자 (=,<,<=,>=,<>)를 사용한다.
결과는 반드시 한 행만 조회된다.
다중 행 서브쿼리는 여러 개의 행을 반환하는 것으로 IN, ANY, ALL, EXISTS를 사용한다.
서브쿼리를 실행하면 그 결과는 여러 개의 행이 조회된다.
◈ 다중 행 서브쿼리
다중 행 서브쿼리는 서브쿼리 결과가 여러 개의 행을 반환하는 것으로 다중 행 연산자를 사용해야 한다.
** 다중 행 비교 연산자
IN (Subquery) - Main Query의 비교조건이 Subquery의 결과 중 하나만 동일하면 참이 된다 (OR 조건)
ALL (Subquery) - Main Query와 Sub Query의 결과가 모두 동일하면 참이 된다.
<ALL : 최솟값을 반환한다
>ALL : 최댓값을 반환한다
ANY (Subquery) - Main Query의 비교조건이 Subquery의 결과 중 하나 이상 동일하면 참이 된다.
<ANY 하나라도 크게 되면 참
>ANY 하나라도 작게 되면 참
EXISTS (Subquery) - Main Query와 Subquery의 결과가 하나라도 존재하면 참이 된다
◈ IN
여러 개의 행 중에서 하나만 참이 되어도 참이 되는 연산이다.
SELECT ENAME, DEPTNAME, SAL
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO AND EMP.EMPNO IN (SELECT EMPNO FROM EMP WHERE SAL>1000);
위의 예에서는 EMP 테이블에서 SAL이 1000원 이상인 사원번호를 반환하고!!!!!!!!!!!!!
반환된 사원번호와 메인쿼리의 사원번호와 비교해서 같은 것을 조회하는 것이다.
◈ ALL
메인쿼리와 서브쿼리의 결과가 모두 동일하면 참이다.
SELECT * FROM EMP
WHERE DEPTNO <= ALL (20, 30);
DEPTNO가 20,30 보다 작거나 같은 것을 조회한다.
DEPTNO가 10,20 인 행이 모두 출력된다.
◈ EXISTS
EXISTS는 Subquery로 어떤 데이터 존재 여부를 확인하는 것
즉, EXISTS의 결과는 참과 거짓이 반환된다.
다음의 예는 직원 중에서 급여가 1000 이상이 있으면 참이 반환되고 없으면 거짓이 반환된다.
SELECT ENAME, DEPTNAME, SAL
FROM EMP, DEPT
WHERE EMP.DEPTNO = DEPT.DEPTNO AND EXISTS (SELECT 1 FROM EMP WHERE SAL>1000);
급여가 1000원 이상이 있으면 참이 반환되고 없으면 거짓이 반환된다.
◈ Scalar Subquery
스칼라 서브쿼리는 반드시 한 행과 한 칼럼만 반환하는 서브쿼리다.
만약 여러 행이 반환되면 오류가 발생한다.
SELECT ENAME AS "이름", SAL AS "급여", (SELECT AVG(SAL) FROM EMP) AS "평균급여"
FROM EMP
WHERE EMPNO=101;
◈ Correlated Subquery
연관 서브쿼리는 서브쿼리 내에서 Main Query 내의 칼럼을 사용하는 것을 의미한다.
다음 시간에는 서브쿼리를 활용하는 예제를 찾아가며 공부하자.
'데이터베이스' 카테고리의 다른 글
오라클 실습 (190501) (0) | 2019.05.01 |
---|---|
Connection이란 (0) | 2019.05.01 |
[ORACLE 10일차]Subquery (1) (0) | 2019.01.16 |
[ORACLE 9일차] UNION, MINUS, Connect by (0) | 2019.01.15 |
[ORACLE 8일차] JOIN (0) | 2019.01.14 |