SQL

[Oracle] 서브쿼리 - 상호관련 서브쿼리(correlated subquery)

ㄷㅐ장님 2021. 12. 24. 17:36

상호관련 서브쿼리(correlated subquery)

① main query 를 먼저 수행

② 첫번째 행을 후보행으로 잡고 후보행값을 서브쿼리에 전달

③ 후보행값을 사용해서 서브쿼리 수행

④ 서브쿼리 결과값을 사용해서 후보행과 비교

⑤ 다음행을 후보행으로 잡고 ②, ③, ④ 반복수행

 

exists 연산자

: 후보행 값이 서브쿼리에 존재하는지 여부를 찾는 연산자.

후보행 값이 서브쿼리에 존재하면 TRUE → 우리가 찾는 데이터

후보행 값이 서브쿼리에 존재하지 않으면 FALSE → 우리가 찾는 데이터가 아님 → 검색종료

select *
from employees e
where exists (select 'x'
              from employees
              where manager_id = e.employee_id) ;
              
              where employee_id = null
              and employee_id = 100
              and employee_id = 101
              and employee_id = 100 --중복

 

not exists 연산자

: 후보행 값이 서브쿼리에 존재하지 않는 데이터를 찾는 연산자

후보행 값이 서브쿼리에 존재하지 않으면 TRUE → 우리가 찾는 데이터

후보행 값이 서브쿼리에 존재하면 FALSE → 우리가 찾는 데이터가 아님 → 검색종료


[문제61] 자신의 부서 평균 급여보다 더 많이 받는 사원들의 정보를 출력해주세요.

select *
from employees e
where e.salary > (select avg(salary)
                  from employees
                  where e.department_id=department_id);

[문제62] 소속사원이 있는 부서정보를 출력해주세요.

select *
from departments d
where exists (select 'x'
              from employees
              where d.department_id=department_id);

[문제63] 관리자가 아닌 사원들의 정보를 출력해주세요.

select *
from employees e
where not exists (select 'x'
                  from employees
                  where manager_id=e.employee_id);

[문제66] Executive 부서이름의 소속된 모든 사원에 대한 department_id, last_name, job_id 출력하세요.

select department_id, last_name, job_id
from employees e
where exists (select 'x'
              from departments
              where department_name='Executive'
              and e.department_id=department_id);

[문제67] 전체 평균 급여보다 많은 급여를 받고 last_name에 'z'가 포함된 사원과 같은 부서에서 근무하는 모든 사원의 employee_id, last_name, salary 출력하세요.

select employee_id, last_name, salary
from employees e
where salary > (select avg(salary)
                from employees)
and exists (select 'x'
            from employees
            where last_name like '%z%'
            and e.department_id=department_id);