다중행 서브쿼리
다중행 서브쿼리는 실행 결과 행이 여러 개 나오는 서브쿼리입니다. 다중행 서브쿼리에 사용되는 연산자는 아래와 같다.
다중행 연산자 | 설명 |
IN | 메인쿼리의 데이터가 서브쿼리의 결과 중 하나라도 일치한 데이터가 있다면 true |
ANY, SOME | 메인쿼리의 조건식을 만족하는 서브쿼리의 결과가 하나 이상이면 true |
ALL | 메인쿼리의 조건식을 서브쿼리의 결과 모두가 만족하면 true |
EXISTS | 서브쿼리의 결과가 존재하면(즉, 행이 1개 이상일 경우) true |
IN 연산자
IN 연산자를 서브쿼리와 함께 쓰면 메인쿼리의 데이터가 서브쿼리의 결과 중 하나라도 일치한 데이터가 있다면 실행된다. 예를들어 IN 연산자와 서브쿼리를 사용하여 각 부서별 최고 급여와 동일한 급여를 받는 사원 정보를 출력하는 쿼리문을 짜보면 아래와 같다.
SELECT *
FROM EMP
WHERE SAL IN (SELECT MAX(SAL)
FROM EMP
GROUP BY DEPTNO);
ANY, SOME 연산자
ANY, SOME 연산자는 서브쿼리가 반환한 여러 결과 값 중 메인쿼리와 조건식을 사용한 결과가 하나라도 true라면 메인쿼리의 조건식을 true로 반화해주는 연사자다. ANY 연산자를 사용하여 30번 부서 사원들의 최대 급여(SAL = 2850)보다 적은 급여를 받는 사원의 정보를 출력해보자.
SELECT *
FROM EMP
WHERE SAL < ANY (SELECT SAL
FROM EMP
WHERE DEPTNO = 30)
ORDER BY SAL, DEPTNO;
이번에는 반대로 30번 부서 사원들의 최소 급여(SAL=950)보다 많은 급여를 받는 사원의 정보를 출력해보자.
SELECT *
FROM EMP
WHERE SAL > ANY(SELECT SAL
FROM EMP
WHERE DEPTNO = 30);
ALL 연산자
ALL 연산자는 ANY와 SOME과 달리 모든 결과가 조건식에 맞아떨어져야만 메인쿼리의 조건식이 true가 되는 연산자다. ALL 연산자를 사용하여 부서 번호가 30번인 사원들의 최소 급여(SAL=950)보다 적은 값을 가진 데이터가 출력된다.
SELECT *
FROM EMP
WHERE SAL < ALL (SELECT SAL
FROM EMP
WHERE DEPTNO = 30);
EXISTS 연산자
EXISTS 연산자는 서브쿼리에 결과 값이 하나 이상 존재하면 조건식이 모두 true, 존재하지 않으면 모두 false가 되는 연산자다.
SELECT *
FROM EMP
WHERE EXISTS (SELECT DNAME
FROM DEPT
WHERE DEPTNO = 10);
출처:Do it! 오라클로 배우는 데이터베이스 입문(저자:이지훈 출판사:이지스퍼블리싱)
'DB > Oracle' 카테고리의 다른 글
[Oracle] 와일드카드 비교 (0) | 2022.11.30 |
---|---|
[서브쿼리] 다중열 서브쿼리/FROM절에 사용하는 서브쿼리와 WITH절 (0) | 2022.02.15 |
[서브쿼리] 단일행 서브쿼리 (0) | 2022.02.14 |
[서브쿼리] 서브쿼리의 정의 (0) | 2022.02.14 |
[다중행 함수] 결과 값을 원하는 열로 묶어 출력하는 GROUP BY절 (0) | 2022.02.11 |