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);