Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

좋습니다.

7. 오라클 SQL 서브쿼리 본문

공부/ORACLE

7. 오라클 SQL 서브쿼리

KIMVELYY 2016. 7. 17. 03:26

* 서브쿼리

 

- 서브 쿼리의 기본 개념

 

SCOTT의 부서명을 알아내기 위한 서브 쿼리문 부터 살펴본다.

 

SELECT DNAME                  -------------> 메인 쿼리

FROM DEPT

WHERE DEPTNO = ( SELECT DEPTNO

                           FROM EMP

                           WHERE ENAME = 'SCOTT') -----------------------------> 서브 쿼리

 

서브 쿼리는 하나의 SELECT 문장의 절 안에 포함된 또 하나의 SELECT 문장이다.

서브쿼리를 포함하고 있는 쿼리문을 메인 쿼리, 포함된 또하나의 쿼리를 서브 쿼리라고 한다.

 

서브쿼리는 비교 연산자의 오른쪽에 기술해야 하고 반드시 괄호로 둘러 쌓아야 한다.

 

서브쿼리는 메인 쿼리가 실행되기 이전에 한번만 실행이 된다.

 

- 서브쿼리의 유형

 

유 형

설 명 

단일 행 (Single - Row) 서브쿼리

 SELECT 문장으로부터 오직 하나의 행 만을 검색

다중 행 (Multiple - Row) 서브쿼리

 SELECT 문장으로부터 하나 이상의 행을 검색

다중 열 (Multiple - Column) 서브쿼리

 SELECT 문장으로부터 하나 이상의 컬럼을 검색

FROM 절 상의 서브쿼리 (INLINE VIEW)

 FROM절상에 오는 서브쿼리로 VIEW 처럼 작용한다.

상관관계 서브쿼리

 바깥쪽 쿼리의 컬럼중 하나가 안쪽 서브쿼리의 조건에 이용되는 처리방식

 

- 단일 행 서브쿼리 (Single - Row)

 

단일 행 서브쿼리는 수행 결과가 오직 하나의 로우 (ROW)만을 반환하는 서브쿼리이다.

 

단일 행 서브쿼리문에서는 이렇게 오직 하나의 로우 (행, ROW)로 반환되는 서브쿼리의 결과는

메인 쿼리에 보내게 되는데 메인 쿼리의 WHERE 절에서는 단일 행 비교 연산자인

=, >, >=, <, <=, <>를 사용해야한다.

 

- 서브 쿼리에서 그룹 함수의 사용

 

평균 급여를 구하는 쿼리문을 서브 쿼리로 사용하여 평균 급여보다 더 많은 급여를 받는 사원을

검색하는 문장을 해본다.

 

SELECT ENAME, SAL

FROM EMP

WHERE SAL > ( SELECT AVG(SAL)

                     FROM EMP);

 

- 다중 행 서브 쿼리 (Multiple - Row)

 

다중 행 서브 쿼리는 서브 쿼리에서 반환되는 결과가 하나 이상의 행일때 사용하는 서브 쿼리이다.

다중 행 서브 쿼리는 반드시 다중 행 연산자 (Multiple Row Operator)와 함께 사용해야 한다.

 

종 류

의 미 

 IN

 메인 쿼리의 비교 조건('=' 연산자로 비교할 경우)이 서브 쿼리의

 결과 중에서 하나라도 일치하면 참

ANY, SOME

 메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과와

 하나 이상이 일치하면 참

ALL

 메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과와

 모든 값이 일치하면 참

EXIST

 메인 쿼리의 비교 조건이 서브 쿼리의 결과 중에서

 만족하는 값이 하나라도 존재하면 참

 

결과가 2개 이상 구해지는 쿼리문을 서브 쿼리로 기술할 경우 다중 행 연산자와 함께 사용해야한다.

 

# ALL 연산자

 

ALL 조건은 메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과와 모든 값이 일치하면 참이다.

찾아진 값에 대해서 AND 연산을 해서 모두 참이면 참이 되는 셈이다.

> ALL은 "모든 비교값 보다 크냐"고 묻느 것이 되므로 최대값 보다 더 크면 참이된다.

 

만약 30번 소속 사원들중 급여를 가장 많이 받는 사원보다 더 많은 급여를 받는 사람의

이름과 급여를 출력하는 쿼리문을 작성해보자

 

SELECT ENAME, SAL

FROM EMP

WHERE SAL > ALL ( SELECT SAL

                           FROM EMP

                           WHERE DEPTNO = 30);

 

위의 다중 행 서브쿼리를 단일 행 서브쿼리로 처리하면

 

SELECT ENAME, SAL

FROM EMP

WHERE SAL > ( SELECT MAX(SAL)

                     FROM EMP

                     WHERE DEPTNO = 30);

 

이 된다.

 

# ANY 연산자

 

ANY 조건은 메인 쿼리의 비교 조건이 서브 쿼리의 검색 결과와 하나 이상만 일치하면 참이다.

> ANY 는 찾아진 값에 대해서 하나라도 크면 참이 되는 셈이다.

 

다음은 부서번호가 30번인 사원들의 급여 중 가장 작은 값보다 많은 급여를 받는 사원의 이름과

급여를 출력하는 예제이다.

 

SELECT ENAME, SAL

FROM EMP

WHERE SAL > ANY ( SELECT SAL

                            FROM EMP

                            WHERE DEPTNO = 30);

 

 

'공부 > ORACLE' 카테고리의 다른 글

6. 오라클 SQL 조인  (0) 2016.07.16
5. 오라클 SQL - 그룹 함수  (0) 2016.07.15
4. SQL 의 주요 함수  (0) 2016.07.07
3. SELECT로 특정 데이터 추출하기  (2) 2016.07.06
2. SQL의 기본  (0) 2016.07.06