티스토리 뷰
단일 컬럼 서브쿼리 | 다중 컬럼 서브쿼리 |
비쌍 비교 | 쌍 비교 |
단일 행 서브쿼리 | 다중 행 서브쿼리 |
= , > , >= , < , <= , < > | IN / NOT IN / ANY / ALL |
단일컬럼 단일 행 서브쿼리가 제일 단위가 작은데
이걸 스칼라 서브쿼리라고 한다.
Scalar Subquery 표현식
- 한 행에서 정확히 하나의 열 값을 반환하는 subquery
- group by 절을 제외한 쿼리구문의 어디에든 나올 수 있다.
스칼라 서브쿼리 + 상호관련 서브쿼리
상호관련 서브쿼리 : 메인쿼리에 있는 테이블의 값을 참조하는(메인쿼리로부터 후보 행을 가져오는) 구문
메인 테이블과 연결이 돼있다.
기존의 서브쿼리가 먼저 돌아가고 그 결과값으로 메인쿼리를 돌려 결과값이 나오는 구조였다면
상화관련 서브쿼리는 메인쿼리(아우터쿼리)로부터 후보 행을 하나 가지고 서브쿼리를 실행하러 가야하고 이 후보 행을 사용해야 서브쿼리가 돌아가는 형식이다. 메인쿼리의 후보 행이 없어질 때까지 실행한다.
자신의 부서 평균 급여보다 많은 급여를 받는 사원을 모두 찾는다
select last_name, salary, department_id
from employees outer_table
where salary >
(select avb(salary)
from employees inner_table
where inner_table.departmnet_id =
outer_table.department_id);
emp 테이블에서
자신이 소속된 부서의 평균 급여보다 자기 급여가 더 큰 사원의 정보를 출력
select e1.last_name,e1.salary, e1.department_id, e2.avg_sal
from employees e1 join (select department)id, avg(salary) as avg_sal
from employees
group by department_id) e2
on e1.department_id = e2.department_id
where e1.salary > e2.avg_sal;
위의 두 쿼리는 같다!
성능면에서는 속도적으로 아래의 인라인뷰를 사용한 서브쿼리문이 더 빠르다.
나중에 상호관리 서브쿼리밖에 쓸 수밖에 없는 상황이 나오는데 그때 사용..!
employee 테이블에서 부서별 최대 급여를 받는 사원의 정보를 부서별로 오름차순 정렬해서 출력
SELECT department_id, employee_id, salary
FROM employees e
WHERE 1 =
(SELECT COUNT(DISTINCT salary)
FROM employees
WHERE e.department_id = department_id
AND e.salary <= salary)
SELECT e1.department_id, e1.employee_id, e1.salary
FROM employees e1 JOIN (SELECT department_id, MAX(salary) AS max_sal
FROM employees
GROUP BY department_id) e2
ON e1.department_id = e2.department_id
WHERE e1.salary = e2.max_sal
ORDER BY e1.department_id;
댓글