본문 바로가기
DataBase/Oracle

SUB-QUERY) 다중행 단일컬럼 서브쿼리 (any/some, all)

by 박채니 2022. 4. 21.

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


다중행 단일컬럼 서브쿼리

- 서브쿼리 결과가 n행 1열인 경우

- 값이 여러 개이므로 =, !=, >, < 등의 연산자는 사용 불가

- in, any / some, all, exists 연산자 사용 가능

(서브쿼리의 결과는 여러 행이지만, in연산자 안에서 가로로 나열됨)

 

송종기, 하이유 사원과 같은 부서원 조회 (사원명, 부서코드)

select
    emp_name,
    dept_code
from
    employee
where
    dept_code in (select dept_code from employee where emp_name in ('송종기', '하이유'));

 

차태연, 박나라, 이오리와 같은 직급의 사원 조회 (사원명, 직급명)

select
    e.emp_name, j.job_name
from
    employee e join job j
        using(job_code)
where
    job_code in (
        select
            job_code
        from
            employee
        where
            emp_name in ('차태연', '박나라', '이오리')
    );

 

☞ any(...), some(...)

- 조건을 만족하는 값이 하나라도 있으면 true

select
    emp_name, salary
from
    employee
where
--    salary > any(3000000, 4000000, 5000000);
    salary > some(3000000, 4000000, 5000000);

any()와 some()은 명칭만 다를 뿐 동일한 기능을 하기 때문에 결과 값이 동일합니다.

조건을 만족하는 값이 하나라도 있으면 true이기 때문에 위 코드에서는 최소값보다 크다면 true겠죠.

 

☞ all(...)

- 모든 값이 조건을 만족해야 true

select
    emp_name, salary
from
    employee
where
    salary > all(3000000, 4000000, 5000000);

all()은 모든 값이 조건을 만족해야 true이므로 위 코드에서는 최대값보다 크면 true이기 때문에 500만원 이상의 월급을 받는 선동일, 송종기가 출력되었습니다.

 

D5의 모든 부서원의 급여보다 많은 급여를 받는 사원 조회

select
    emp_name, dept_code, salary
from
    employee
where
    salary > all(
        select
            salary
        from
            employee
        where
            dept_code = 'D5'
    );

'D5'에서 가장 높은 급여와 비교하기 때문에 > 연산자 사용 시 D5 부서의 급여에 대한 정보는 나오지 않을 것입니다.

>= 연산자를 사용한다면 'D5' 부서의 가장 높은 급여를 받는 사람의 정보도 같이 출력 될 것입니다.