-
[Oracle] 서브쿼리(Subquery)RDS/Oracle 2019. 3. 18. 07:30반응형
서브쿼리(Subquery)
서브쿼리란 하나의 SQL문안에 포함되어 있는 또 다른 SQL문을 말합니다. 서브쿼리는 알려지지 않은 기준을 이용한 검색을 위해 사용하며, 메인쿼리가 서브쿼리를 포함하는 종속적인 관계입니다.
SCOTT의 부서명을 검색하기 위해서는 SCOTT의 부서번호를 검색하는 쿼리와 부서번호로 부서명을 검색하는 쿼리가 필요합니다.
1234567891_1) SCOTT의 부서번호를 검색하는 쿼리문SELECT DEPTNOFROM EMPWHERE ENAME = 'SCOTT';1_2) 부서번호로 부서명을 검색하는 쿼리문SELECT DNAMEFROM DEPTWHERE DEPTNO = 20;cs 부서번호을 검색하는 쿼리문 부서명을 검색하는 쿼리문으로 SCOTT에 부서명을 검색할 수 있지만, 서브쿼리를 사용하면 한 번에 쿼리문으로 부서명을 검색할 수 있습니다.
1_3) 서브쿼리를 사용하여 부서명을 검색하는 쿼리문
1234561_3) 서브쿼리를 사용하여 부서명을 검색하는 쿼리문SELECT DNAMEFROM DEPTWHERE DEPTNO = ( SELECT DEPTNOFROM EMPWHERE ENAME = 'SCOTT' );cs 서브쿼리를 사용하여 부서명을 검색하는 쿼리문을 보면 메인쿼리와 서브쿼리 두 개의 SELECT 문으로 구성되고, 서브쿼리의 SELECT문은 시작과 끝을 소괄호로 묶어 주어야 합니다. 이러한 서브쿼리는 하나의 쿼리문의 결과를 메인쿼리에 전달하기 위해서 사용합니다.
서브쿼리를 사용할 때 주의사항
1.서브쿼리를 괄호로 감써서 사용해야 합니다.
2.서브쿼리는 단일 행(Single Row) 또는 복수 행(Multiple Row) 비교 연산좌와 함께 사용 가능합니다.
단일 행 비교 연산자는 서브쿼리의 결과가 반드시 1건 이하이어야 하고 복수 행 비교 연산자는 서브쿼리의 결과 건수와 상관 없습니다.
3.서브쿼리에서는 ORDER BY를 사용할 수 없습니다. ORDER BY절은 SELECT절에서 오직 한 개만 올 수 있기 때문에 ORDER BY절은 메인쿼리의 마지막 문장에 위치해야 합니다.
서브쿼리가 SQL문에서 사용이 가능한 곳
1.SELECT 절
2.FROM 절
3.WHERE 절
4.HAVING 절
5.ORDER BY 절
6.INSERT문의 VALUES 절
7.UPDATE문의 SET 절
단일 행 서브쿼리
서브쿼리가 단일 행 비교 연산자(=, <, <=, >, >=, <>)와 함께 사용할 때는 서브쿼리의 결과 건수가 반드시 1건 이하이어야 합니다.
만약, 서브쿼리의 결과 건수가 2건 이상을 반환하면 SQL문은 실행시간(Run Time) 오류가 발생합니다.
다중 행 서브쿼리
서브쿼리의 결과가 2건 이상 반환될 수 있다면 반드시 다중 행 비교 연산자(IN, ALL, ANY, SOME)와 함께 사용해야 합니다.
다중 행 비교 연산자
IN - 서브쿼리의 결과에 존재하는 임의이 값과 동일한 조건을 의미합니다.
ALL - 서브쿼리의 결과에 존재하는 모든 값을 만족하는 조건을 의미합니다.
ANY, SOME - 서브쿼리의 결과에 존재하는 어느 하나의 값이라도 만족하는 조건을 의미합니다.
EXISTS - 서브쿼리의 결과에 만족하는 값이 존재하는지 여부를 확인하는 조건을 의미합니다.
IN 연산자
IN 연산자는 메인쿼리의 비교 조건에서 서브쿼리의 출력 결과와 하나라도 일치하면 메인쿼리의 WHERE 절이 참이 되도록하는 연산자입니다.
1234567891011121314-- SCOTT와 같은 부서에 있는 사원 정보SELECT *FROM EMPWHERE DEPTNO IN ( SELECT DEPTNOFROM EMPWHERE ENAME = 'SCOTT' );-- SCOTT와 같은 부서에 있는 사원 중 SMITH를 제외한 사원 정보SELECT *FROM EMPWHERE DEPTNO IN ( SELECT DEPTNOFROM EMPWHERE ENAME = 'SCOTT' )AND ENAME != 'SMITH';cs ALL 연산자
ALL 조건은 메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과값과 모두 일치하면 참이 되도록하는 연산자압니다.
123456-- 부서번호가 30번인 사원들 중에서 급여를 가장 많이 받는 사원보다 더 많은 급여를 받는 사원 정보SELECT *FROM EMPWHERE SAL > ALL ( SELECT SALFROM EMPWHERE DEPTNO = 30);cs ANY 연산자
메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과와 하나 이상이 일치하면 참이 되도록하는 연산자입니다.
123456-- 부서번호가 30번인 사원들 중에서 급여를 가장 적게 받는 사원보다 더 많은 급여를 받는 사원 정보SELECT *FROM EMPWHERE SAL > ANY ( SELECT SALFROM EMPWHERE DEPTNO = 30);cs 반응형'RDS > Oracle' 카테고리의 다른 글
[Oracle] 윈도우 함수(Window Funtion)_그룹 내 순위 함수 (0) 2019.03.20 [Oracle] 그룹 함수(Group Funtion) (0) 2019.03.19 [Oracle] 셀프 조인(Self Join) (0) 2019.03.16 [Oracle] 계층형 질의 (0) 2019.03.12 [Oracle] 집합 연산자(SET OPERATOR) (0) 2019.03.11