빅데이터/Oracle SQL | Do it! 오라클로 배우는 데이터베이스 입문

서브쿼리 | 다중행 서브쿼리 / 다중행 연산자 (IN / ANY, SOME / ALL / EXISTS)

KimKelly 2023. 3. 2. 18:19
반응형

09. SQL문 속 또 다른 SQL문, 서브쿼리

09-3. 다중행 서브쿼리

  • 다중행 서브쿼리: 실행 결과 행이 여러 개로 나오는 서브쿼리.
  • 서브쿼리 결과가 여러 개이므로, 다중행 연산자를 사용해야 메인쿼리 비교 가능(단일행 연산자 사용 불가).

 

다중행 연산자 설명
IN 메인쿼리의 데이터가 서브쿼리의 결과 중 하나라도 일치한 데이터가 있다면 true
ANY, SOME 메인쿼리의 조건식을 만족하는 서브쿼리의 결과가 하나 이상이면 true
ALL 메인쿼리의 조건식을 서브쿼리의 결과 모두가 만족하면 true
EXISTS 서브쿼리의 결과가 존재하면(즉, 행이 1개 이상일 경우) true

 


[IN 연산자]

메인쿼리의 데이터가 서브쿼리의 결과 중 하나라도 일치한 데이터가 있다면 true
 
- 각 부서별 최고 급여와 동일한 급여를 받는 사원 정보 출력하기

 


[ANY, SOME 연산자]

메인쿼리의 조건식을 만족하는 서브쿼리의 결과가 하나 이상이면 true
 
1) ANY, SOME을 등가 비교 연산자(=)와 함께 사용하는 경우

*위 IN 연산자 사용한 것과 결과 같음. 따라서 IN을 주로 사용함.
 
 
2) (메인쿼리) < ANY/SOME (서브쿼리)
= 서브쿼리 결과값의 최댓값보다 작은 결과 출력
= (메인쿼리) < (서브쿼리 안 MAX 함수 적용)
 
- 30번 부서 사원들의 최대 급여보다 적은 급여를 받는 사원 정보 출력하기

 
 
3) (메인쿼리) > ANY/SOME (서브쿼리)
= 서브쿼리 결과값의 최솟값보다 큰 결과 출력
= (메인쿼리) > (서브쿼리 안 MIN 함수 적용)
 
- 30번 부서 사원들의 최소 급여보다 많은 급여를 받는 사원 정보 출력하기

 
 
 

[ALL 연산자]

메인쿼리의 조건식을 서브쿼리의 결과 모두가 만족하면 true
 
1) (메인쿼리) < ALL (서브쿼리)
= 서브쿼리 결과값의 최솟값보다 작은 결과 출력
= (메인쿼리) < (서브쿼리 안 MIN 함수 적용)
 
- 부서 번호가 30번인 사원들의 최소 급여보다 더 적은 급여를 받는 사원 출력하기

 
 
2) (메인쿼리) > ALL (서브쿼리)
= 서브쿼리 결과값의 최댓값보다 큰 결과 출력
= (메인쿼리) > (서브쿼리 안 MAX 함수 적용)
 
- 부서 번호가 30번인 사원들의 최대 급여보다 더 많은 급여를 받는 사원 출력하기

 
 
 

[EXISTS 연산자]

서브쿼리의 결과가 존재하면(행이 1개 이상일 경우) true
 
- 서브쿼리의 결과 값이 존재하는 경우

서브쿼리 결과 값이 존재하므로, EMP 모든 행이 출력됨.
 
- 서브쿼리의 결과 값이 존재하지 않는 경우

서브쿼리 결과 값이 존재하지 않으므로, 아무 행도 출력되지 않음.

 


<다중 행 연산자 (ANY/SOME vs ALL) 비교 정리>

*M: 메인쿼리 / S: 서브쿼리

ANY/SOME  (M) = ANY/SOME (S) S 결과값 중 하나라도 만족하는 데이터 모두 출력 IN 연산자 사용한 것과 결과 같아, IN을 주로 사용.
(M) < ANY/SOME (S) S 결과값의 최댓값보다 작은 결과 출력 (M) < (S 안 MAX 함수 적용)
(M) > ANY/SOME (S) S 결과값의 최솟값보다 큰 결과 출력 (M) > (S 안 MIN 함수 적용)
ALL  (M) = ALL (S) 사용 불가능
(M) < ALL (S) S 결과값의 최솟값보다 작은 결과 출력 (M) < (S 안 MIN 함수 적용)
(M) > ALL (S) S 결과값의 최댓값보다 큰 결과 출력 (M) > (S 안 MAX 함수 적용)

 

반응형