- 쿼리 안에 또 다른 쿼리
- 우선 서브 쿼리가 먼저 수행한 후 결과 값을 메인 쿼리로 전달 해주면 그 값을 받아서 메인 쿼리가 수행 됨
( 단, 모든 쿼리에서 서브쿼리가 먼저 수행되는 것은 아님)
[ 서브쿼리 작성시 주의사항 ]
- 서브쿼리 부분은 WHERE 절에 연산자 오른쪽에 위치해야 한다.
- 반드시 괄호로 묶어야 한다.
- 특별한 경우를 제외하고는 서브쿼리절에 order by 절이 올수 없다.
- 단일행 서브쿼리와 다중행 서브쿼리에 따라 연산자를 잘 선택해야한다.
1. 서브쿼리의 종류
(1) 단일행 서브쿼리
- 서브쿼리의 결과가 1개만 출력
- 단일행 서브쿼리에서 사용되는 연산자
= |
같다 |
<> |
같지않다 |
> |
크다 |
>= |
크거나 같다 |
< |
작다 |
<= |
작거나 같다 |
(2) 다중행 서브쿼리
- 서브쿼리의 결과가 2개 이상 출력되는것
- 다중행 서브쿼리에서 사용되는 연산자
IN | 같은 값을 찾음 |
EXISTS | 서브쿼리의 값이 있을 경우 메인쿼리 수행함 |
>ANY | 최소값을 반환함 |
<ANY | 최대값을 반환함 |
<ALL | 최소값을 반환함 |
>ALL | 최대값을 반환함 |
# 예제1 : IN
# 예제2 : EXISTS
# 예제3 : ANY
# 예제4 : ALL
(3) 다중컬럼 서브쿼리
- 서브쿼리의 결과가 여러 컬럼인 경우
- 주로 primary key 를 여러 컬럼으로 합쳐서 만들었을 경우 한꺼번에 비교하기 위해서 자주사용.
(4) 상호연관 서브쿼리
- 메인쿼리값을 서브쿼리에 주고 서브쿼리를 수행한 후 그 결과를 다시 메인쿼리로 반환해서 수행하는 쿼리
- 잘 못 사용될 경우 성능 저하의 원인이 될수 있음 (INLINE View 등 권장)
# 예제
2. Scalar Sub Query (스칼라 서브쿼리)
- SELECT 절에 오는 서브쿼리
- 결과를 1행씩 반환
- OUTER JOIN과 동일
- 데이터 양이 적은 경우에 많이 사용 (JOIN은 데이터양이 많은 경우)
# 서브쿼리의 위치에 따라서 이름이 바뀜
SELECT [서브쿼리] --스칼라 서브쿼리(1행만 반환할 경우)
FROM [서브쿼리] -- INLINE VIEW (인라인뷰)
WHERE [서브쿼리] --서브쿼리
3. WITH 절을 사용한 서브쿼리
- 원하는 테이블을 메모리에 미리 뷰처럼 가상의 테이블로 생성시킨후 데이터를 가져오는 기법
- 성능이 좋아서 많이 사용되지만 사용법이 어렵다.
- 쿼리가 수행되기 전에 미리 메모리에서 만들어 둔 테이블에서 데이터를 찾아서 작업하기 때문에 성능 good
- 똑같은 테이블을 조회하는 쿼리가 계속 들어갈 경우 한번만 기술하고 반복해서 불러쓰기 때문에 good
- with 절 안에는 select 문장만 사용가능
- with 절 안에 또 다른 with 절 사용 불가능
'oracle > [SQL] SQL' 카테고리의 다른 글
13장. 계층형 쿼리 (Hierarchical Query) (0) | 2014.10.14 |
---|---|
12장. SEQUENCE(시퀀스) / SYNONYM(동의어) (0) | 2014.10.14 |
10장. VIEW (1) | 2014.10.07 |
9장. 인덱스(Index) (1) | 2014.10.07 |
8장. 제약조건 (0) | 2014.10.06 |
댓글